Як я можу змусити Дженкінс CI за допомогою Git триггера на натисканні для управління?


205

Я намагаюся створити Дженкінс-ци для проекту за допомогою GitHub. Я вже налаштував Дженкінса з відповідними плагінами. Я хочу, щоб Дженкінс запускав сценарії побудови лише тоді, коли хтось із проекту підштовхує до освоєння. Поки що я міг налаштувати його так, що збірка буде спрацьовувати будь-коли, коли хто-небудь натисне куди завгодно, але це занадто широко. Я робив це за допомогою сервісних гачків після отримання після отримання на Git.

Я прочитав вікі Дженкінса та пару навчальних посібників, але цієї деталі не вистачає ... чи можливо це пов'язане з опитуванням? Або слід працювати на стороні Git, щоб Git запускав Дженкінса лише тоді, коли masterйого змінили?


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

Відповіді:


190

Як уже зазначається в його коментарі, опублікований в коментарях, тим часом є хороше рішення (описане в опитуванні повинно померти: запускати конструкції Дженкінса з гачка 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.

  • Однак опитування фактично перевіряє, чи щось було висунуто до використовуваної гілки.

Це прекрасно працює.


1
Це також чудово спрацювало і для мене. Ви можете використовувати той самий підхід із місцевою знаменитою установкою: cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
Джастін Сміт

4
Працює і з гаком POST (не Дженкінсом) Bitbucket. Щоб вказати облікові дані автентифікації, ви можете використовувати URL-адресу user: password@my.ci.server/git/notifyCommit? Url = ....
loevborg

Чи можна це налаштувати, щоб jenkins будував лише ті лінзи / проекти, на які впливає останній натиск на репо? Не будувати цілу гілку знову?
Croolman

Чи можете ви уточнити цю частину? "Створіть тригер після отримання прийому github, щоб повідомити URL-адресу"
dewwwald

Я припускаю, що github повинен мати можливість дістатися до вашого екземпляра Дженкінса, тобто він повинен бути загальнодоступним. Чи можливо це налагодити роботу з сервером Jenkins, який є непублічним?
А. Мюррей

33

З версії 0.5 плагін GitHub для Jenkins може викликати збірку, коли зміна буде натиснуто на GitHub .


23
@asveikau - Первісне питання стосувалося github.
docwhat

Це не гарне рішення, оскільки воно запускає збірку незалежно від того, яка галузь була висунута.
Шеннон

Насправді, схоже, він підпорядковується специфікатору гілки в налаштуваннях додатка git, якщо ввімкнено "Опитування SCM" (розклад не потрібен).
Шеннон

1
Хоча це може бути правдою, воно все ще запускає неправильно збірку, коли немає робочої області ("Workspace офлайн. Планування нової збірки для отримання робочої області. (Noexisting_workspace) Готово. Взято 0 мс Знайдені зміни"). Дивіться також питання.jenkins-ci.org/browse/JENKINS-18079
Шеннон

GitHub плагін списки мерзотник плагін як залежність . Вікі говорять , що «при створенні завдання, вказати URL в розділі" проект Github "і виберіть Git вказати URL в розділі" Вихідний код управління ". Він каже : " Цей тригер тільки починає Git плагін внутрішнього опитування алго для кожного, хто входить події проти узгодженого репо ". Я Подумайте, це означає, що це дуже схоже на опитування SCM, як у прийнятій відповіді, але у нього є параметри автоматичного налаштування веб-камери та ще декілька інших функцій.
dozntmatter

9

Замість того, щоб запускати збірки віддалено змінити конфігурацію проекту Jenkins для запуску збірки шляхом опитування.

Дженкінс може опитуватись на основі фіксованого внутрішнього або за URL-адресою. Останнє - це те, що ви хочете пропустити, будує, якщо для цієї гілки не буде змін. Точні деталі містяться в документації . По суті, вам просто потрібно встановити параметр "Опитування SCM", залишити розділ розкладу порожнім і встановити віддалену URL-адресу, щоб потрапити на JENKINS_URL / робота / ім'я / опитування.

Якщо у вас є захищене середовище Дженкінса, навпаки /build, /pollingURL вимагає автентифікації. В інструкціях тут є деталі. Наприклад, у мене є гак GitHub Post-Receive username:apiToken@JENKIS_URL/job/name/polling.


8

Для GitLab виконайте наступні дії:

  1. Перейдіть до налаштувань проекту → Веб-гачки
  2. Введіть URL-адресу "Зробити зараз" від проекту Jenkins як URL-адресу Push Event:

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

  3. Клацніть, Add Web Hookа потімtest hook

Тоді, коли ви здійснюєте приєднання до сховища, запускається веб-гачок і створюється збірка. Не забудьте встановити робочу область Jenkins delete workspace before each buildтак, щоб ви отримали нову копію нового коду.


2
як ви вирішуєте проблему з питання щодо побудови саме тоді, коли натисніть на головну гілку?
Кастодіо

4

Не стосується Git, але нижче я детально допоможу з конфігурацією роботи Дженкінса з Mercurial. Це може допомогти іншим із подібною проблемою.

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

Тепер запустимо деякі зміни в сховище Mercurial деякими тестовими реєстраціями.

Подивіться, що робота Дженкінса зараз виконується шляхом виявлення змін SCM. Коли збірка буде запущена через Mercurial зміни, тоді ви побачите текст Started by an SCM change. Ще, користувач, який його вручну запустив.


3

Я сподіваюсь, що це допомагає: як викликати побудову Дженкінса на віддачі Git

Це лише питання використання curl, щоб запустити роботу Дженкінса за допомогою гачків Git, наданих Git.

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

Шукайте папку "гачки" у вашій прихованій папці .git. Перейменуйте файл "post-commit.sample" на "post-commit". Відкрийте його за допомогою «Блокнота», видаліть рядок «: нічого» і вставте в нього вищевказану команду.

Це воно. Кожного разу, коли ви виконуватимете команду, Git запускає команди пост-фіксації, визначені у файлі.


Я спочатку плутався тут з вашим коментарем, тому що я думав, що мені потрібно змінити "роботу" в URL-адресі вище на назву вакансії. Мене також збентежило, тому що, коли я натискав "New Item" у Jenkins, я створив "Project" не роботу, тож коли ви посилалися на "someJob" вище, я не знав, що це назва мого проекту. Нарешті я з’ясував потрібну мені URL-адресу: localhost: 8078 / робота / codecept% 20tests / build, де "codecept% 20tests" було назвою мого проекту. Дякуємо за ваше рішення
Пол Прейбіш

1
Спасибі Пол. Я оновив допис у блозі з додатковою заміткою, згадуючи ваше рішення. "% 20" буде особливо корисним для інших.
Nav

3

Постійна інтеграція з Дженкінсом, після того, як код буде висунутий у сховище з команди Git / GUI:

  1. Створіть роботу в Дженкінсі лише з назвою вакансії та виберіть тип проекту фрістайлу. Клацніть OK. Наступна сторінка нічого не додає - просто натиснітьSave .
  2. Перейдіть у ваше місцеве сховище Git, де у вас є вихідний код, і перейдіть до .git/hooks папки.
  3. hooksПапка містить кілька файлів. Перевірте "після завершення". Якщо немає, створіть файл "post-commit" без розширення файлу:

    C:\work\test\\.git\hooks\post-commit
    
  4. Відредагуйте файл "після завершення" за допомогою команди нижче. Переконайтеся, що він присутній у вашій папці гачок локального вихідного коду.

    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 .


Нещодавно я налаштував Дженкінса на роботу, щоб тягнути зміни від git на певній гілці. Добре працює. +1
Грег К

Я встановив і це налаштування. Що я помічаю, це те, що Дженкінс отримує сповіщення про кожен поштовх до github і реагує на нього, але виконує лише кроки збирання, якщо змінився майстер відділення. Таким чином, ми отримуємо тону помилкових звітів про збірку, які говорять "Без змін". Ви також спостерігаєте за такою поведінкою?
Ziggy

Оригінальне запитання - про те, як вирішити широкий та непотрібний тригер (спрацьовуючи, коли хтось натискає на будь-яку гілку), налаштований у вашій відповіді. Якщо у вас є 5 завдань з jenkin з однаковим конфігурацією, за винятком того, що перша робота прослуховує головну гілку, друга - відділення devel, третя - відділення FeatureX і так далі, коли ви натискаєте лише на відділення FeatureX, усі завдання jenkins будуть спрацьовувати, що призводить до робота з перевантаженнями будується дуже повільно.
geoom

2

Для досягнення цього можна створити загальний плагін Webhook Trigger .

У налаштуваннях з

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

Тоді ця робота буде спровокована для кожного поштовху master . Жодного опитування.

Напевно, ви хочете, щоб більше значень з веб-кука фактично виконувало збірку. Просто додайте більше змінних за допомогою JSONPath, щоб вибрати те, що вам потрібно.

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


Що таке "ачі" ?
Пітер Мортенсен

Це / була орфографічна помилка.
Томаш Б'єрре

як ти схопиш $ GITCOMMIT у Дженкінсі, він завжди здається нульовим із веб-кукією. Тоді не можна повернути статус назад, щоб сказати, що це було успішно чи не вдалося.
користувач3520245

1

У моїй теперішній організації ми не робимо цього в master, але робимо це як на розробці, так і на випуску / гілках (ми використовуємо Git Flow), щоб генерувати знімки.

Оскільки ми використовуємо конвеєр з декількома гілками, ми робимо це в Jenkinsfile за допомогою синтаксису {{} ...

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

Про це детально йдеться у цьому дописі у блозі: https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline


1

Наведені вище відповіді правильні, але я звертаюся до тих, хто тут новачок для їх простоти

особливо для встановлення тригера збірки для трубопроводу:

Розглянемо, що у вас є дві гілки Github: 1.master, 2.dev та Jenkinsfile (де написано сценарій конвеєра) та інші файли доступні для кожної гілки

Налаштування нового проекту трубопроводу (для відділення розробників)

## 1.Кінтеграція коду з підходом на основі git-плагіна та cron. Необхідний плагін git повинен бути встановлений і налаштувати його зі своїм ім'ям та електронною поштою

  1. Загальний розділ.Перевірити прапорець - "Цей проект налаштовано параметри" та додайте Name-SBRANCH Значення за замовчуванням-'refs / remotes / origin / dev '
  2. Створіть тригери розділ "Поставити прапорець -" Опитування SCM "та графік відповідно до необхідності перевірки комісій, наприклад" * / 1 * * * * ", щоб перевіряти щохвилини
  3. Розділ визначення конвеєра. Виберіть - сценарій конвеєра від SCM—> виберіть git—> URL-адрес репозиторія—> додати облікові дані git—> виберіть розширені—> додати ім’я походження, RefSpec- '+ refs / heads / dev: refs / remotes / origin / dev '(dev - гілка Github) -> Відділення для створення - $ {SBRANCH} (Назва параметра з посилання на першу точку) -> Шлях сценарію -> Jenkinsfile -> Зніміть прапорець
  4. Застосувати—> зберегти

## 2.Кінтеграція коду: github-плагін та підхід webhook Попередня слід встановити плагін Github і налаштувати сервер Github, підключення слід перевірити, якщо не враховувати наступну конфігурацію

Налаштуйте плагін Github з обліковим записом на Jenkins

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

Додайте веб-обробку, якщо її не додано до вашого сховища

  1. Перейдіть у налаштування сховища Github -> додати веб-кукінг>> додати 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-адресою Дженкінса.

  1. Загальний розділ. Поставте прапорець - "Github project", додайте URL-адресу проекту - (посилання github, що закінчується на ".git /")
  2. Загальний розділ.Перевірити прапорець - "Цей проект налаштовано параметри" та додайте Name-SBRANCH Значення за замовчуванням-'refs / remotes / origin / dev '
  3. Побудувати тригери.секція.Перевірити прапорець - "Тригер гака GitHub для опитування GITScm"
  4. Розділ визначення лінії конвеєра: Виберіть - Сценарій конвеєра від SCM—> виберіть git—> URL-адрес репозиторія—> додати облікові дані git—> виберіть розширені -> додати ім’я походження, RefSpec- '+ refs / heads / dev: refs / remotes / origin / dev '(dev - це гілля github) -> Гілки для створення - $ {SBRANCH} (Назва параметра з посилання 1.st point) -> Шлях сценарію -> Jenkinsfile—> Зніміть прапорець Lightweightcheckout
  5. Застосувати—> зберегти


0

Моє рішення для локального сервера git: перейдіть до локального каталогу гака сервера git, ігноруйте існуючий update.sample та створіть новий файл, буквально названий як "оновлення", наприклад:

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$ 

Заголовок ехо відображатиметься під результатом git push, маркер можна взяти з конфігурації роботи jenkins, перегляньте, щоб знайти його. Якщо файл "оновлення" не викликається, спробуйте деякі інші файли з такою ж назвою без розширення "sample".

Це все, що вам потрібно

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.