Как я могу сделать Jenkins CI с Git триггером на толчках, чтобы освоить?

205

Я пытаюсь настроить Jenkins-ci для проекта, использующего GitHub. Я уже настроил Jenkins с соответствующими плагинами. Я хочу, чтобы Дженкинс запускал сценарии сборки только тогда, когда кто-то в проекте пытается освоить. До сих пор я был в состоянии настроить его так, чтобы сборка была запущена в любое время, когда кто-либо толкает куда-либо, но это слишком широко. Я сделал это с помощью служебных хуков на Git.

Я читал вики Дженкинса и пару уроков, но эта конкретная деталь отсутствует ... может быть, это как-то связано с опросом? Или работа должна быть выполнена на стороне Git, чтобы Git запускал Jenkins только при masterизменении?

Ziggy
источник
3
Первоначальный автор Jenkins, Kohsuke Kawaguchi, описывает, как сделать push-уведомление из репозитория с помощью подключаемого модуля Git. Подключаемый модуль Git 1.1.14. Смотрите kohsuke.org/2011/12/01/…
GeraldScott

Ответы:

190

Как уже отмечал gezzed в своем комментарии, между тем есть хорошее решение (описанное в опросе должно умереть: запуск сборок Jenkins из хука Git ):

  • Установите для триггера сборки задания Jenkins значение Опрос SCM , но не указывайте расписание.

  • Создайте триггер GitHub после получения, чтобы уведомить URL

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • Это запустит все сборки, которые опрашивают указанный Git-репозиторий.

  • Однако опрос фактически проверяет, было ли что-либо передано в использованную ветку.

Работает отлично.

olenz
источник
1
Это прекрасно сработало и для меня, вы можете использовать тот же подход с локальной установкой: cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
Джастин Смит
4
Также работает с POST-хуком Bitbucket (не Jenkins). Чтобы указать учетные данные для аутентификации, вы можете использовать user: password@my.ci.server/git/notifyCommit? Url = ... в качестве URL.
loevborg
Можно ли его настроить так, чтобы jenkins строил только те библиотеки / проекты, которые были затронуты последним продвижением в репо? Не строите всю ветку снова?
Крулман
Можете ли вы уточнить эту часть? «Создайте триггер github после получения, чтобы уведомить URL»
dewwwald
Я предполагаю, что github должен иметь доступ к вашему экземпляру Jenkins, то есть он должен быть общедоступным. Возможно ли заставить это работать с непубличным сервером Jenkins?
А. Мюррей
33

Начиная с версии 0.5, плагин GitHub для Jenkins может запускать сборку, когда изменения передаются в GitHub .

docwhat
источник
23
@asveikau - оригинальный вопрос был о github.
14:09
Это не очень хорошее решение, потому что оно запускает сборку независимо от того, какая ветвь была нажата.
Шеннон,
На самом деле, похоже, что он подчиняется спецификатору ветки в настройках плагина git, если вы включаете "Опрос SCM" (расписание не требуется).
Шеннон
1
Хотя это может быть правдой, он все равно запускает сборку неправильно, когда не существует рабочего пространства («Рабочая область отключена. Планирование новой сборки для получения рабочего пространства. См. Также questions.jenkins-ci.org/browse/JENKINS-18079
Шеннон,
GitHub плагин списки мерзавец плагин как зависимость . В вики говорится: «при создании задания укажите URL-адрес в разделе« Проект Github »и выберите« Git указать URL-адрес в разделе «Управление исходным кодом» ». В нем указано:« Этот триггер только запускает алгоритм внутреннего опроса плагина Git для каждого входящего события в сопоставленном репо. думаю, это означает, что он в значительной степени подходит для опроса SCM, как в принятом ответе, но у него есть опции для автоматической настройки webhook и несколько других функций
dosentmatter
9

Вместо того чтобы запускать сборки удаленно, измените конфигурацию проекта Jenkins, чтобы запускать сборки путем опроса.

Jenkins может опрашивать на основе фиксированного внутреннего или по URL. Последнее - это то, что вы хотите пропустить, если нет изменений для этой ветви. Точные детали в документации . По сути, вам просто нужно проверить опцию «Опрос SCM», оставить раздел расписания пустым и установить удаленный URL-адрес для нажатия JENKINS_URL / job / name / polling.

Одно замечание: если у вас защищенная среда Jenkins, это не так /build, /pollingURL требует аутентификации. Инструкции здесь содержат детали. Например, у меня есть перехват GitHub Post-Receive username:apiToken@JENKIS_URL/job/name/polling.

Вэй Ван
источник
8

Для GitLab используйте эти шаги:

  1. Зайдите в настройки вашего проекта → Веб-хуки
  2. Введите URL-адрес «Build Now» из проекта Jenkins в качестве URL-адреса Push-события:

    http://server.com/jenkins/job/project_name/build?delay=0sec например

  3. Нажмите Add Web Hookи затемtest hook

Затем каждый раз, когда вы фиксируете репозиторий, запускается веб-ловушка и создается сборка. Обязательно установите рабочее пространство Jenkins, delete workspace before each buildчтобы получить свежую копию нового кода.

etusm
источник
2
Как вы решаете проблему по вопросу, касающемуся сборки именно тогда, когда нажать на ветку master?
Кастодио
4

Не относится к Git, но ниже я подробно расскажу о конфигурации работы Jenkins с Mercurial. Это может помочь другим с подобной проблемой.

  1. Установите плагин URL Trigger
  2. Перейдите на страницу конфигурации задания и выберите Poll SCMопцию. Установите значение в* * * * *
  3. Отметьте опцию: [URLTrigger] - Poll with a URL. Теперь вы можете выбрать некоторые параметры, такие как изменение даты изменения, содержание URL и т. Д.
  4. В параметрах выберите Изменение содержимого URL, выберите первый вариант - Monitor change of content
  5. Сохраните изменения.

Теперь запустите некоторые изменения в репозитории Mercurial с помощью некоторых проверочных проверок.

Убедитесь, что задание Jenkins теперь выполняется путем обнаружения изменений в SCM. Когда сборка будет запущена из-за изменений в Mercurial, вы увидите текст Started by an SCM change. Еще пользователь, который запустил его вручную.

Krishnam
источник
3

Надеюсь, это поможет: как запустить сборку Jenkins на коммите Git

Это просто вопрос использования curl для запуска задания Jenkins с использованием хитов Git, предоставляемых Git.

Команда curl http://localhost:8080/job/someJob/build?delay=0secможет запустить задание Jenkins, где someJobуказано имя задания Jenkins.

Найдите папку «hooks» в скрытой папке .git. Переименуйте файл "post-commit.sample" в "post-commit". Откройте его с помощью Блокнота, удалите строку «: Ничего» и вставьте в него указанную выше команду.

Вот и все. Всякий раз, когда вы делаете коммит, Git запускает команды post-commit, определенные в файле.

навигационный
источник
Сначала я был смущен вашим комментарием, потому что я подумал, что должен поменять «работу» в URL выше на имя работы. Я также был сбит с толку, потому что, когда я нажал «New Item» в Jenkins, я создал «Project», а не работу, поэтому, когда вы ссылались на «someJob» выше, я не знал, что это название моего проекта. Наконец-то я понял, какой URL мне нужен: localhost: 8078 / job / codecept% 20tests / build, где «codecept% 20tests» - это название моего проекта. Спасибо за ваше решение
Пол Прейбиш
1
Спасибо, Пол. Я обновил запись в блоге с дополнительной заметкой, в которой упоминается ваше решение. «% 20» будет особенно полезен для других.
Nav
3

Непрерывная интеграция с Jenkins после отправки кода в репозиторий из команды / GUI Git:

  1. Создайте работу в Jenkins только с именем работы и выберите тип проекта фристайл. Нажмите OK. Следующая страница ничего не добавляет - просто нажмите Save.
  2. Перейдите в локальный репозиторий Git, где у вас есть исходный код, и перейдите в .git/hooksпапку.
  3. hooksПапка содержит несколько файлов. Проверьте на «пост-фиксацию». Если нет, создайте файл «post-commit» без расширения файла:

    C:\work\test\\.git\hooks\post-commit
    
  4. Отредактируйте файл post-commit с помощью приведенной ниже команды. Убедитесь, что он присутствует в вашей локальной папке перехвата исходного кода.

    curl -u userName:apiToken -X POST http://localhost:8080/jenkins/job/jobName/build?token=apiToken
    

    Пример:

    curl -u admin:f1c55b3a07bb2b69b9dd549e96898384 -X POST http://localhost:8080/jenkins/job/Gitcommittest/build?token=f1c55b3a07bb2b69b9dd549e96898384
    

    5.

    userName: Имя пользователя Jenkins

    jobName: Название работы сборки

    apiToken: Чтобы получить свой токен API, перейдите на страницу пользователя Jenkins (вверху справа в интерфейсе). Он доступен в меню «Настройка» в левой части страницы: «Показать токен API»

  5. Внесите изменения в ваш исходный код и передайте код в хранилище.

  6. Ваша работа, http://localhost:8080/jenkins/job/Gitcommittest/должна быть строительная.

Венката Нареш Бабу
источник
3

Вам необходимо указать ветку. По умолчанию он слушает что угодно. Смотрите сообщение в блоге Hudson: плагины Git и Maven .

Адам Димитрук
источник
Я недавно настроил Jenkins на работу, чтобы получить изменения из git в указанной ветке. Работает отлично. +1
Грег К
Я также установил эту настройку. Что я заметил, так это то, что Jenkins уведомляется о каждом нажатии на github и реагирует на него, но выполняет шаги сборки только в том случае, если мастер ветки изменился. Таким образом, мы получаем массу поддельных отчетов о сборке, в которых говорится «Без изменений». Вы тоже наблюдаете это поведение?
Зигги
Первоначальный вопрос о том, как решить широкий и ненужный триггер (запуск, когда кто-либо нажимает на любую ветку), настроенный в вашем ответе. Если у вас есть 5 заданий jenkin с одинаковой конфигурацией, за исключением того, что первая ветвь прослушивания основного задания, вторая ветвь devel, третья ветвь FeatureX и т. Д., Когда вы только нажимаете на ветку FeatureX, все задания jenkins будут запущены, что приводит к перегрузка работы со сборками очень медленная.
увеличить
2

Общий плагин Webhook Trigger может быть настроен с фильтрами для достижения этой цели.

Когда настроено с

  • Переменная с именем refи выражением $.ref.
  • Фильтр с текстом $refи выражение фильтра, как ^refs/heads/master$.

Затем эта работа будет срабатывать при каждом нажатии на master . Нет опроса.

Вы, вероятно, хотите, чтобы дополнительные значения из webhook действительно выполняли сборку. Просто добавьте больше переменных с помощью JSONPath, чтобы выбрать то, что вам нужно.

Здесь есть несколько вариантов использования: https://github.com/jenkinsci/generic-webhook-trigger-plugin/tree/master/src/test/resources/org/jenkinsci/plugins/gwt/bdd

Томас Бьерре
источник
Что такое "ачи" ?
Питер Мортенсен
Это была орфографическая ошибка.
Томас Бьерре
Как вы захватываете $ GITCOMMIT в Дженкинсе, с веб-крюком всегда кажется, что оно пустое. Не могу отправить статус обратно, чтобы сказать успех или провал.
user3520245
1

В моей текущей организации мы не делаем это в master, но делаем это как при разработке, так и при выпуске / ветвлении (мы используем Git Flow), чтобы генерировать сборки моментальных снимков.

Поскольку мы используем конвейер с несколькими ветвями, мы делаем это в Jenkinsfile с синтаксисом when {} ...

stage {
    when { 
        expression { 
            branch 'develop'
        }
    }
}

Это подробно описано в этом посте: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline.

jesses.co.tt
источник
1

Приведенные выше ответы верны, но я обращаюсь к тем, кто новичок здесь для их простоты

специально для настройки триггера сборки для конвейера:

Предположим, у вас есть две ветки Github: 1.master, 2.dev и Jenkinsfile (где написан конвейерный скрипт), и другие файлы доступны в каждой ветке

Сконфигурировать новый проект Pipeline (для ветки dev)

## 1. Интеграция кода с помощью git-plugin и подхода на основе cron. Необходимо установить обязательный плагин git и настроить его на свое имя и адрес электронной почты.

  1. Общий раздел. Проверьте флажок - «Этот проект параметризован» и добавьте Name-SBRANCH Значение по умолчанию -refs / remotes / origin / dev.
  2. Раздел «Построение триггеров» «Check checkbox -« Опрос SCM »и расписание согласно необходимости проверки коммитов, например,« * / 1 * * * * », чтобы проверять каждую минуту
  3. Раздел определения конвейера. Выбрать - конвейерный скрипт из SCM -> выбрать git -> URL-адрес addRepository -> добавить учетные данные git -> выбрать расширенный -> добавить имя-источника, RefSpec- '+ refs / head / dev: refs / remotes / origin / dev '(dev - это ветка github) -> ветви для сборки - $ {SBRANCH} (имя параметра из ссылки 1-й точки) -> путь к сценарию—> Jenkinsfile -> снять флажок Lightweightcheckout
  4. Применить—> сохранить

## 2. Интеграция кода: подход github-plugin и webhook Предварительно необходимо установить плагин Github и настроить сервер Github, если необходимо проверить подключение, если не учитывать следующую конфигурацию

Настройте плагин Github с учетной записью на Jenkins

Раздел GitHub Добавьте сервер Github, если не указан URL-адрес API: https://api.github.com Учетные данные: Добавить секретный текст (нажмите кнопку Добавить: выберите тип секретного текста) со значением Личный токен доступа (сгенерируйте его из своих учетных записей Github -> настройки -> Настройки разработчика—> Персональный токен—> Добавить токен—> Проверить области—> Скопировать токен) Тестовое соединение—> Проверить, подключен ли он к вашей учетной записи Github или нет. Установите флажок «Управлять перехватчиками». предыдущие учетные данные для «общего секрета»

Добавьте webhook, если не добавлен в ваш репозиторий

  1. Перейдите в настройки репозитория Github -> добавить webhook—> добавить URL
    http: // Public_IP: Jenkins_PORT / github-webhook /
  2. Или, если у вас нет Public_IP, используйте ngrok . Установите, выполните аутентификацию, получите публичный IP-адрес с помощью команды ./ngrok http 80 (используйте свой jenkins_port), затем добавьте webhook -> добавьте URL http: // Ngrok_IP / github-webhook /
  3. Проверьте это, доставив полезную нагрузку со страницы webhook и проверьте, получите ли вы 200 статусов или нет.

Если у вас есть плагин Github Pull запросы, настройте его также с опубликованным URL-адресом Jenkins.

  1. Общий раздел. Установите флажок «Github project», добавьте URL проекта - (ссылка на github заканчивается на «.git /»)
  2. Общий раздел. Проверьте флажок - «Этот проект параметризован» и добавьте Name-SBRANCH Значение по умолчанию -refs / remotes / origin / dev.
  3. Установите флажок triggers.section.Check - «Триггер GitHub для опроса GITScm»
  4. Определение конвейерного раздела: выберите - конвейерный скрипт из SCM -> выберите git -> URL-адрес addRepository -> добавьте учетные данные git -> выберите расширенный -> добавить имя-источника, RefSpec- '+ refs / heads / dev: refs / remotes / origin / dev '(dev - ветка github) -> ветви для сборки - $ {SBRANCH} (имя параметра из ссылки 1.st) -> путь к сценарию—> Jenkinsfile—> снять флажок Lightweightcheckout
  5. Применить—> сохранить
Акшай Шикре
источник
0

Мое решение для локального git-сервера: перейдите в каталог ловушек вашего локального git-сервера, игнорируйте существующий update.sample и создайте новый файл, буквально названный «update», например:

gituser@me:~/project.git/hooks$ pwd
/home/gituser/project.git/hooks
gituser@me:~/project.git/hooks$ cat update
#!/bin/sh
echo "XXX from  update file"
curl -u admin:11f778f9f2c4d1e237d60f479974e3dae9 -X POST http://localhost:8080/job/job4_pullsrc_buildcontainer/build?token=11f778f9f2c4d1e237d60f479974e3dae9

exit 0
gituser@me:~/project.git/hooks$ 

Оператор echo будет отображаться под вашим результатом git push, токен может быть взят из вашей конфигурации работы jenkins, перейдите по ссылке, чтобы найти его. Если файл «update» не вызывается, попробуйте другие файлы с таким же именем без расширения «sample».

Это все что тебе нужно

Чарли
источник