Git post commit hook을 설정하는 방법


126

Jenkins에서 원격으로 빌드를 트리거하는 방법은 무엇입니까?
Git post commit hook을 설정하는 방법?

내 요구 사항은 특정 프로젝트에 대한 Git 저장소에서 변경이 이루어질 때마다 해당 프로젝트에 대해 Jenkins 빌드를 자동으로 시작하는 것입니다.

Jenkins 트리거 빌드 섹션에서 원격으로 트리거 빌드를 선택했습니다.
에서 .git디렉토리, 디렉토리가 우리가 구성 포스트에 가지고있는 파일을 커밋 후크.
거기에서 빌드를 트리거하는 방법을 혼란스럽게 생각합니다 (컬 명령을 사용해야한다는 것을 알고 있습니다).


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

이 명령을 git server hooks 디렉토리 (post commit hook)에 넣었습니다.
저장소에서 변경이 발생할 때마다 자동화 빌드가 실행됩니다.

적어도 하나의 Java 파일에 빌드가 시작되는지 변경 세트를 확인하고 싶습니다.
개발자가 빌드를 시작하지 않아야하는 xml 파일 또는 특성 파일 만 변경했다고 가정하십시오.
와 함께 파일이 빌드가 시작되어야 xml한다고 가정합니다 .java.


귀하의 질문의 두 번째 부분을 해결하기 위해 답변을 편집했습니다.
VonC

답변:


164

" 폴링은 죽어야합니다 : Jenkins 빌드를 git hook에서 트리거하기 "에서 언급했듯이 Jenkins 에게 새로운 커밋을 알릴 수 있습니다.

최신 Git 플러그인 1.1.14 (지금 막 릴리스)를 사용하면 다음 명령을 간단히 실행하여보다 쉽게이 작업을 수행 할 수 있습니다.

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

지정된 URL을 체크 아웃하도록 구성된 모든 작업을 스캔하고 폴링으로 구성된 경우 즉시 폴링을 트리거합니다 (빌드 할 가치가있는 변경 사항이 발견되면 빌드가 차례로 트리거 됨). )

이것은 젠킨스에서 일자리가왔다 갔다 할 때 스크립트가 동일하게 유지되도록합니다.
또는 단일 리포지토리 호스트 응용 프로그램 (예 : Gitosis)에 여러 리포지토리가있는 경우 모든 리포지토리와 단일 수신 후 후크 스크립트를 공유 할 수 있습니다. 마지막으로,이 URL은 보안 Jenkins에 대해서도 인증이 필요하지 않습니다. 서버는 클라이언트가 전송하는 것을 직접 사용하지 않기 때문입니다. 실제로 빌드를 시작하기 전에 변경 사항이 있는지 확인하기 위해 폴링을 실행합니다.

으로 여기에 언급 , 당신 젠킨스 서버에 대한 올바른 주소를 사용해야합니다 :

포트 8080에서 독립형 웹 서버로 Jenkins를 실행하고 있기 때문에 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://작동하지 않았습니다.


또한 간단한 사용할 수 있습니다 "처럼 후크를 포스트 - 수신 기반 푸시 젠킨스와 GIT를 사용하여 구축 "

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

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

"원격으로 빌드 트리거"및 인증 토큰 ( 1qaz2wsx이 예에서는) 을 사용할 수 있도록 Jenkins 작업을 구성하십시오 .

그러나 이것은 프로젝트 별 스크립트이며 저자는이를 일반화하는 방법을 언급합니다.
첫 번째 솔루션은 인증이나 특정 프로젝트에 의존하지 않기 때문에 더 쉽습니다.


하나 이상의 Java 파일이 빌드를 시작해야하는지 변경 세트를 확인하고 싶습니다.
개발자가 XML 파일 또는 특성 파일 만 변경했다고 가정하면 빌드가 시작되지 않아야합니다.

기본적으로 빌드 스크립트는 다음을 수행 할 수 있습니다.

  • git notes첫 번째 통화 에서 '빌드'메모를 작성하십시오 (참조 ).
  • 후속 호출에서 HEAD빌드 후보 후보와 git notes'build'( git show refs/notes/build)가 참조하는 커밋 사이의 커밋 목록을 가져옵니다 git diff --name-only SHA_build HEAD.
  • 스크립트는 해당 목록을 구문 분석하고 빌드를 계속해야하는지 여부를 결정할 수 있습니다.
  • 어쨌든 git notes' build'을 (를) 작성 / 이동하십시오 HEAD.

5 월 2016 cwhsu의 종료 지점 코멘트에 다음과 같은 가능한 URL :

curl --user USER:PWD http://JENKINS_SERVER/job/JOB_NAME/build?token=YOUR_TOKEN아이템에서 트리거 구성을 설정하면 사용할 수 있습니다.

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


2016 년 6 월, polaretto 는 의견에서 지적합니다 .

쉘 스크립트를 조금만 추가하면 수동 URL 구성을 피할 수 있습니다. 특히 공통 디렉토리에 많은 저장소가있는 경우 특히 그렇습니다.
예를 들어 이러한 매개 변수 확장을 사용하여 리포 이름을 얻었습니다.

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

그런 다음 다음과 같이 사용하십시오.

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

안녕 당신이 첫 번째 호출에서 말했듯이 빌드 노트를 넣어야합니다. 첫 번째 호출은 개발자가 변경 사항을 git repo로 푸시 할 때마다 .java 파일을 읽는 것입니다. 나는이 모든 것들을 처음 접하기 때문에 각각의 모든 단계를 요구합니다. 신경 쓰지 말고이 작업을 완료해야합니다.
phanikumar Raja

이것은 나에게 매우 도움이됩니다. 이 주제의 도움으로 Git hook을 작성했습니다. Tnx 여러분!
Kirill Bazarov

수신 후 파일에 curl 호출을 추가해야했지만이 답변에서 완전히 명확하지 않습니다. 어쨌든 매우 도움이됩니다!
Magnilex

1
커밋을 수신하고 jenkins를 호출 해야하는 베어 리포지토리의 hooks 폴더에있는 @IgorGanapolsky :yourRepo.git/hooks/post-receive
VonC

2
명백 할 수도 있지만 다음과 같은 문제가 있습니다 curl http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>. URL의 매개 변수는이 무엇인지 정확히 일치해야합니다 저장소 URL 당신의 젠킨스 작업. 예제를 복사 할 때 프로토콜을 생략했습니다.이 경우에는 ssh : // 가 작동하지 않았습니다.
ptha

17

이것이 도움이되기를 바랍니다 : http://nrecursions.blogspot.in/2014/02/how-to-trigger-jenkins-build-on-git.html

그것은 사용의 문제의 curl자식에 의해 제공되는 자식 후크를 사용하여 젠킨스 작업을 트리거 할 수 있습니다.
명령

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

Jenkins 작업을 실행할 수 있습니다. 여기서 Jenkins 작업 someJob의 이름입니다.

hooks숨겨진 .git 폴더에서 폴더를 검색 하십시오. post-commit.sample파일 이름을로 바꿉니다 post-commit. 메모장으로 열고 : Nothing선을 제거한 다음 위의 명령을 붙여 넣습니다.

그게 다야. 커밋을 수행 할 때마다 Git은 파일에 정의 된 커밋 후 명령을 트리거합니다.


dev 시스템에서 커밋을 수행 한 후 사후 커밋이 아닌 사후 수신이 호출됩니다. 두 후크에 로그 문을 넣어 확인합니다. 내가 문서를 잘못 읽었습니까? 이는 커밋 후 게시되지 않아야합니까?
Shirish Hirekodi

@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"])

이 경우 다른 브랜치가 아닌 마스터로 푸시 할 때만 jenkins 작업을 트리거합니다.


1
이 Python 스크립트를 Jenkins에 어떻게 연결합니까? 아니면 한 번만 실행합니까?
IgorGanapolsky

Jenkins는이 후크에 대해 알지 못합니다. 주요 부분은 설문을 트리거 할 jenkins 서버에 notifyCommit URL을로드하는 것입니다. 나는 투표가 가능하지만 jenkins 측에 일정이 없다고 생각합니다.
Zitrax

그렇다면이 파이썬 스크립트는 어디에 있습니까? 커밋을 추적하기 위해 git 설치와 연결한다고 가정합니다.
IgorGanapolsky

1
늦은 답변-그러나 스크립트 위치는 git 서버의 hooks / post-receive에 있습니다. 자세한 내용은 git hooks를 읽으십시오.
Zitrax

3

Jenkins 인증이 활성화되어 있으면 조금 더 어려워진다는 위의 답변에 추가하고 싶습니다.

활성화 한 후 익명 사용자에게 읽기 권한이 필요하다는 오류 메시지가 나타납니다.

두 가지 가능한 해결책을 보았습니다.

1 : 후크를 다음으로 변경 :

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

2 : 프로젝트 기반 인증 설정.

이전 솔루션은 후크 파일에 암호를 노출해야한다는 단점이 있습니다. 제 경우에는 용납 할 수 없습니다.

두 번째는 나를 위해 일합니다. 글로벌 인증 설정에서 익명 사용자에 대해 전체> 읽기 기능을 활성화해야했습니다. 프로젝트에서 트리거하고 싶었던 작업> 빌드 및 작업> 익명 읽기를 활성화해야했습니다.

로그인하지 않고도 Jenkins에서 프로젝트를 볼 수 있기 때문에 이것은 여전히 ​​완벽한 솔루션이 아닙니다. http 로그인과 함께 이전 방법을 사용하는 것이 더 나은 솔루션 일 수는 있지만 알아 내지 못했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.