Як налаштувати гак Git post commit


127

Як запустити збірку віддалено від Дженкінса?
Як налаштувати гак Git post počin?

Моя вимога полягає в тому, що коли будуть внесені зміни у сховище Git для певного проекту, воно автоматично почне збирати Дженкінс для цього проекту.

У розділі збірки триггерів Дженкінса я вибрав збірку тригера віддалено.
У .gitкаталозі каталог гаків є в тому, що ми маємо налаштувати файл після фіксації.
Я плутаю, як запустити збірку звідти (я знаю, яку частину ми повинні використовувати команду curl).


curl cmbuild.aln.com/jenkins/view/project name/job/myproject/buildwithparameters?Branch=feat-con

Я розмістив цю команду в моєму каталозі гаків сервера git (розміщення гака).
Кожного разу, коли зміни відбуваються в сховищі, він працює в автоматизованому зборі.

Я хочу перевірити в наборі змін, чи є принаймні в одному файлі java збірка повинна починатися.
Припустимо, що розробники змінили лише xml-файли або файли властивостей, збірка не повинна починатися.
Поряд із xml, припустимо, .javaфайли там збирання слід починати.


Я відредагував свою відповідь, щоб вирішити другу частину вашого питання.
VonC

Відповіді:


165

Як зазначалося в " Опитування повинно померти: запускаючи зведення Дженкінса з гака ", ви можете повідомити Дженкінсу про нове зобов'язання:

З останнім плагіном Git 1.1.14 (який я щойно випускаю) ви можете це зробити більше> легко, просто виконавши таку команду:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>

Це сканує всі завдання, налаштовані для перевірки вказаної URL-адреси, і якщо вони також налаштовані з опитуванням, вона негайно запустить опитування (і якщо це знайде зміну, яка вартує збірки, збірка буде запущена по черзі. )

Це дозволяє сценарію залишатися тим самим, коли роботи йдуть та йдуть у Дженкінсі.
Або якщо у вас є декілька сховищ під одним хост-додатком сховища (наприклад, Gitosis), ви можете поділитися одним скриптом гака, який отримує повідомлення після отримання, з усіма сховищами. Нарешті, ця URL-адреса не потребує автентифікації навіть для захищеного Дженкінса, оскільки сервер не використовує безпосередньо нічого, що надсилає клієнт. Він проводить опитування, щоб перевірити, чи є зміни, перш ніж він насправді починає збірку.

Як згадувалося тут , обов'язково використовуйте правильну адресу для свого сервера Jenkins:

оскільки ми використовуємо Дженкінса як окремий веб-сервер на порту 8080, URL-адреса повинна була бути без /jenkinsтакої:

http://jenkins:8080/git/notifyCommit?url=git@gitserver:tools/common.git

Щоб підкріпити цей останній пункт, ptha додає в коментарях :

Це може бути очевидним, але у мене виникли проблеми з:

curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. 

Параметр URL повинен точно відповідати тому, що ви маєте в URL-сховищі вашої роботи в Дженкінсі.
Копіюючи приклади, я пропустив протокол, в нашому випадку ssh://, і він не спрацював.


Ви також можете використовувати простий гачок після отримання, як у " Набір на основі Push за допомогою Jenkins та GIT "

#!/bin/bash
/usr/bin/curl --user USERNAME:PASS -s \

http://jenkinsci/job/PROJECTNAME/build?token=1qaz2wsx

Налаштуйте завдання Дженкінса, щоб мати можливість "тригера будується віддалено" та використовувати маркер автентифікації ( 1qaz2wsxу цьому прикладі).

Однак це сценарій, специфічний для проекту, і автор згадує спосіб його узагальнення.
Перше рішення простіше, оскільки воно не залежить від автентифікації або конкретного проекту.


Я хочу перевірити в наборі змін, чи має бути хоча б один файл java, який слід починати.
Припустимо, розробники змінили лише XML-файли або файли властивостей, тоді збірка не повинна починатися.

В основному, ваш сценарій збирання може:

  • поставте нотатки "побудови" (див. git notes) на перший дзвінок
  • на наступних викликах, візьміть список коммітов між HEADвашою гілки кандидата на збирання і фіксації , на який посилається git notes«будувати» ( git show refs/notes/build): git diff --name-only SHA_build HEAD.
  • ваш сценарій може проаналізувати цей список і вирішити, чи потрібно продовжувати його збирання.
  • у будь-якому випадку створіть / перемістіть свій git notes' build' до HEAD.

Травень 2016 року: cwhsu вказує у коментарях наступну можливу URL-адресу:

ви можете просто скористатися, curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKENякщо встановити в своєму елементі налаштування тригера

http://i.imgur.com/IolrOOj.png


Червень 2016, polaretto вказує в коментарях :

Я хотів би додати, що за допомогою невеликого сценарію оболонок ви можете уникнути конфігурації URL-адреси вручну, особливо якщо у вас є багато сховищ під загальним каталогом.
Наприклад, я використав ці розширення параметрів, щоб отримати ім'я репо

repository=${PWD%/hooks}; 
repository=${repository##*/} 

а потім використовувати його так:

curl $JENKINS_URL/git/notifyCommit?url=$GIT_URL/$repository

привіт фон, як ви сказали під час першого дзвінка, я повинен поставити збірку notes.my, перший виклик - це прочитати .java файл кожного разу, коли розробник натискає зміни на git repo. Я новачок у всіх цих речах, тому я прошу кожен крок. будь ласка, не заперечуйте, і я повинен виконати це завдання.
phanikumar Raja

Це дуже допомагає мені. Я написав гачок Git за допомогою цієї теми. Tnx хлопці!
Кирило Базаров

Мені довелося додати виклик curl до файлу після отримання, що не зовсім зрозуміло з цієї відповіді. Дуже корисно все одно!
Magnilex

1
@IgorGanapolsky в папці "гачки" вашого голого репо, яка приймає комісії і яка повинна дзвонити дженкінсам:yourRepo.git/hooks/post-receive
VonC

2
Це може бути очевидним, але у мене були проблеми з: curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. Параметр URL повинен точно відповідати тому, що ви маєте в URL-сховищі вашої роботи в Дженкінсі. Під час копіювання прикладів я пропустив протокол, в нашому випадку ssh: // і він не працював.
птха

17

Сподіваюсь, це допомагає: http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

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

curl http://localhost:8080/job/someJob/build?delay=0sec

може запустити роботу Дженкінса, де someJobназва Дженкінса.

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

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


Після виконання комісії з програми розробника, виклик після отримання отримує виклик, а не післяздійснення. Перевіряється шляхом введення заяв журналу в обидва гаки. Чи читаю я неправильно документи, чи не повинен бути післяздійснювальний, який викликається?
Ширіш Хірекоді

@Shirish: Це дивно. Можливо, ви робите щось інакше
Nav

це будувати успішно, коли у мене є натискання останньої зміни зміни, але не будується, коли я здійснюю зміни ... ???

3

Оскільки в попередній відповіді було показано приклад того, як може виглядати повний гак, ось код мого робочого гачка після отримання:

#!/usr/bin/python

import sys
from subprocess import call

if __name__ == '__main__':
    for line in sys.stdin.xreadlines():
        old, new, ref = line.strip().split(' ')
        if ref == 'refs/heads/master':
            print "=============================================="
            print "Pushing to master. Triggering jenkins.        "
            print "=============================================="
            sys.stdout.flush()
            call(["curl", "-sS", "http://jenkinsserver/git/notifyCommit?url=ssh://user@gitserver/var/git/repo.git"])

У цьому випадку я запускаю джинкінські завдання лише при натисканні на майстер, а не на інші гілки.


1
Як ви пов’язуєте цей сценарій Python у Дженкінсі? Або ти просто запускаєш його один раз?
ІгорГанапольський

Дженкінс не знає про цей гачок, головна частина - це завантаження URL notifyCommit на сервер jenkins, який спричинить опитування. Я думаю, що опитування увімкнено, але без графіку на стороні дженкінса.
Zitrax

То де знаходиться цей скрипт пітона? Я припускаю, що ви пов'язуєте це зі своєю установкою git, щоб відстежувати коміти ...
IgorGanapolsky

1
Пізня відповідь - але розташування скрипту було б на сервері git в гачках / пост-отримання. Читайте на гачках git, щоб дізнатися більше.
Zitrax

3

Я хочу додати до відповідей вище, що стає трохи складніше, якщо ввімкнено авторизацію Дженкінса.

Після його включення я отримав повідомлення про помилку, що анонімному користувачеві потрібен дозвіл читання.

Я побачив два можливі рішення:

1: Зміна мого гака на:

curl --user name:passwd -s http://domain?token=whatevertokenuhave

2: встановлення авторизованого проекту.

У колишніх рішень є той недолік, що мені довелося викрити свій passwd у файлі гака. У моєму випадку неприйнятний.

Другий працює для мене. У глобальних налаштуваннях авторизації мені довелося ввімкнути Загальне> Прочитати для анонімного користувача. У проекті, який я хотів викликати, мені довелося включити Job> Build and Job> Read for Anonymous.

Це все ще не ідеальне рішення, оскільки тепер ви можете бачити проект у Дженкінсі без логіну. Можливо, буде ще краще рішення з використанням колишнього підходу з http-логіном, але я цього не зрозумів.

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