Git 트리거를 사용하여 Jenkins CI를 마스터로 푸시하려면 어떻게해야합니까?


205

GitHub을 사용하는 프로젝트에 Jenkins-ci를 설정하려고합니다. 적절한 플러그인으로 Jenkins를 이미 설정했습니다. Jenkins가 프로젝트의 누군가가 마스터 할 때마다 빌드 스크립트를 실행하기를 원합니다. 지금까지 누군가가 어디로 든 푸시 할 때마다 빌드가 트리거되도록 너무 설정할 수 있었지만 너무 광범위합니다. Git의 수신 후 서비스 후크 로이 작업을 수행했습니다.

Jenkins Wiki와 몇 가지 자습서를 읽었지만이 특정 세부 정보가 누락되었습니다 ... 폴링과 관련이 있습니까? 아니면 Git 측에서 작업을 수행하여 Git master이 변경 될 때만 Jenkins 만 트리거하도록해야 합니까?


3
Jenkins의 원래 작성자 인 Kohsuke Kawaguchi는 Git 플러그인 Git 플러그인 1.1.14를 사용하여 저장소에서 푸시 알림을 수행하는 방법을 설명합니다. kohsuke.org/2011/12/01/…
GeraldScott

답변:


190

그의 의견에서 gezzed 가 이미 언급했듯이 좋은 해결책이 있습니다 ( Polling은 죽어야합니다 : Jenkins 빌드는 Git hook에서 트리거합니다 ).

  • Jenkins 작업의 빌드 트리거를 Poll SCM 으로 설정하지만 스케줄을 지정 하지 마십시오 .

  • URL을 알리기 위해 GitHub 수신 후 트리거 생성

    http://yourserver/jenkins/git/notifyCommit?url=<URL of the Git repository>?token=<get token from git to build remotely>
    
  • 지정된 Git 저장소를 폴링하는 모든 빌드가 트리거됩니다.

  • 그러나 폴링은 실제로 사용 된 분기로 푸시 된 것이 있는지 확인합니다.

완벽하게 작동합니다.


1
이것은 설치 로컬 gitorious과 같은 방법을 사용할 수 있습니다뿐만 아니라 나를 위해 큰 일 : cweiske.de/tagebuch/gitorious-post-receive-hook-2.htm
저스틴 스미스

4
Bitbucket의 POST 후크 (Jenkins가 아닌) 와도 작동합니다. 인증 자격 증명을 지정하려면 user : password@my.ci.server/git/notifyCommit? url = ...을 URL로 사용할 수 있습니다 .
loevborg

젠킨스가 최신 리포지토리로 영향을받는 라이브러리 / 프로젝트 만 빌드하도록 구성 할 수 있습니까? 전체 지점을 다시 작성하지 않습니까?
Croolman

이 부분을 명확히 할 수 있습니까? "URL을 통지 후받을 트리거를 github에 만들기"
dewwwald

나는 github이 Jenkins 인스턴스에 도달 할 수 있어야한다고 가정합니다. 즉, 공개적으로 액세스 할 수 있어야했습니다. 비공개 인 Jenkins 서버에서이 작업을 수행 할 수 있습니까?
A. Murray

33

버전 0.5부터 Jenkins 용 GitHub 플러그인 은 변경 사항이 GitHub로 푸시 될 때 빌드를 트리거 할 수 있습니다 .


23
@asveikau-원래 질문은 github에 관한 것입니다.
docwhat

어떤 분기를 푸시했는지에 관계없이 빌드를 트리거하기 때문에 좋은 솔루션이 아닙니다.
Shannon

실제로 "Poll SCM"을 활성화하면 (스케줄 필요 없음) git 플러그인 설정에서 분기 지정자를 따르는 것 같습니다.
Shannon

1
그것이 사실 일 수는 있지만, 작업 공간이 없을 때 여전히 빌드를 잘못 트리거합니다 ( "작업 공간이 오프라인입니다. 작업 공간을 얻기 위해 새 빌드를 예약합니다. (존재하지 않은 작업 공간) 완료. 0 ms 변경 사항이 발견되었습니다"). issues.jenkins-ci.org/browse/JENKINS-18079
Shannon

GitHub의 나열 플러그인 힘내 종속성으로 플러그인 . 위키는 Github의 프로젝트 "작업을 생성 할 때, 아래의 URL을 지정합니다" "그리고 힘내 아래 URL을 지정 선택"소스 코드 관리 말한다. "그것은 말한다"이 트리거는 일치의 repo에 대한 들어오는 모든 이벤트에 대한 너 한테 내부 폴링 플러그인 힘내 차기. "나는 그것은 대답이 대답 한 것처럼 Poll SCM과 거의 비슷하다는 것을 의미하지만, 자동으로
웹 후크

9

빌드 를 트리거하는 대신원격으로 Jenkins 프로젝트 구성을 폴링하여 빌드를 트리거하도록 변경하십시오.

Jenkins는 고정 내부 또는 URL을 기준으로 폴링 할 수 있습니다. 후자는 해당 분기에 대한 변경 사항이 없으면 빌드를 건너 뛰려는 것입니다. 정확한 세부 사항은 설명서에 있습니다. 기본적으로 "Soll 폴링"옵션을 확인하고 일정 섹션을 비워두고 JENKINS_URL / job / name / polling에 도달하도록 원격 URL을 설정하면됩니다.

당신이 확보 젠킨스 환경이 달리있는 경우 하나 잡았다 /build/pollingURL은 인증이 필요합니다. 여기에 지시 사항이 있습니다. 예를 들어 GitHub Post-Receive 후크가로 이동합니다 username:apiToken@JENKIS_URL/job/name/polling.


8

들어 GitLab , 다음 단계를 사용 :

  1. 프로젝트 설정으로 이동 → 웹 후크
  2. Jenkins 프로젝트에서 "지금 빌드"URL을 푸시 이벤트 URL로 입력하십시오.

    http://server.com/jenkins/job/project_name/build?delay=0sec 예를 들어

  3. 클릭 Add Web Hook한 다음test hook

그런 다음 저장소에 커밋 할 때마다 웹 후크가 트리거되고 빌드가 작성됩니다. delete workspace before each build새 코드의 새로운 사본을 얻을 수 있도록 Jenkins 작업 공간을 설정하십시오 .


2
마스터 브랜치를 푸시 할 때 빌드하는 것과 관련된 질문에 대한 문제를 어떻게 해결하고 있습니까?
Custodio

4

Git과 관련이 없지만 아래에서는 Mercurial과 함께 Jenkins 작업 구성에 대해 자세히 설명합니다. 비슷한 문제가있는 사람들에게 도움이 될 수 있습니다.

  1. URL 트리거 플러그인 설치
  2. 작업 구성 페이지로 이동하여 Poll SCM옵션을 선택하십시오 . 값을* * * * *
  3. 옵션을 확인하십시오 : [URLTrigger] - Poll with a URL. 이제 수정 날짜 변경, URL 내용 등과 같은 옵션을 선택할 수 있습니다.
  4. 옵션에서 URL 컨텐츠 변경을 선택하고 첫 번째 옵션을 선택하십시오. – Monitor change of content
  5. 변경 사항을 저장하십시오.

이제 몇 가지 테스트 체크인을 통해 Mercurial 저장소의 일부 변경을 트리거하십시오.

SCM 변경 사항을 감지하여 Jenkins 작업이 실행되는지 확인하십시오. Mercurial 변경으로 인해 빌드가 실행되면 텍스트가 표시됩니다 Started by an SCM change. 그렇지 않으면 수동으로 시작한 사용자입니다.


3

이것이 도움이되기를 바랍니다 : Git 커밋에서 Jenkins 빌드를 트리거하는 방법

curl을 사용하여 Git이 제공하는 Git 후크를 사용하여 Jenkins 작업을 트리거하면됩니다.

이 명령 curl http://localhost:8080/job/someJob/build?delay=0sec은 Jenkins 작업을 실행할 수 있습니다. 여기서 Jenkins 작업 someJob의 이름입니다.

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

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


위 URL에서 "작업"을 작업 이름으로 변경해야한다고 생각했기 때문에 처음에 귀하의 의견과 혼동되었습니다. Jenkins에서 "New Item"을 누를 때 작업이 아닌 "Project"를 설정했기 때문에 위의 "someJob"을 참조했을 때 이것이 내 프로젝트의 이름이라는 것을 알지 못했기 때문에 혼란 스러웠습니다. 마지막으로 필요한 URL을 알아 냈습니다. localhost : 8078 / job / codecept % 20tests / build 여기서 "codecept % 20tests"는 내 프로젝트의 이름입니다. 솔루션 주셔서 감사합니다
Paul Preibisch

1
고마워 폴 솔루션을 언급하면서 추가 정보로 블로그 게시물을 업데이트했습니다. "% 20"은 특히 다른 사람들에게 도움이 될 것입니다.
Nav

3

코드가 Git 명령 / GUI에서 저장소로 푸시 된 후 Jenkins와의 지속적인 통합 :

  1. 작업 이름으로 만 Jenkins에서 작업을 작성하고 프로젝트 프리 스타일 유형을 선택하십시오. 를 클릭하십시오 OK. 다음 페이지는 아무 것도 추가하지 않고 그냥 클릭하십시오 Save.
  2. 소스 코드가있는 로컬 Git 저장소로 이동하여 .git/hooks폴더를 탐색하십시오 .
  3. hooks폴더는 몇 개의 파일이 포함되어 있습니다. "커밋 후"를 확인하십시오. 없는 경우 파일 확장자없이 "포스트 커밋"파일을 만듭니다.

    C:\work\test\\.git\hooks\post-commit
    
  4. 아래 명령으로 "commit-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 사용자 페이지 (인터페이스 오른쪽 상단)로 이동하십시오. 페이지 왼쪽의 "구성"메뉴에서 사용할 수 있습니다 : "Show API token"

  5. 소스 코드를 변경하고 코드를 리포지토리에 커밋합니다.

  6. 귀하의 직업 http://localhost:8080/jenkins/job/Gitcommittest/은 구축 중이어야합니다.


3

지점을 지정해야합니다. 기본적으로 모든 것을 듣습니다. 블로그 게시물 Hudson : Git and Maven plugins를 참조하십시오 .


최근 직장에서 Jenkins를 설정하여 지정된 분기의 자식에서 변경 사항을 가져 왔습니다. 잘 작동합니다. +1
Greg K

그 설정도 설정했습니다. 내가 주목하는 것은 Jenkins에게 github에 대한 모든 푸시를 통지하고 이에 반응하지만 지점 마스터가 변경된 경우에만 빌드 단계를 실행한다는 것입니다. 따라서 "No Changes"라는 가짜 빌드 보고서가 많이 나옵니다. 이 동작도 관찰하고 있습니까?
Ziggy

원래 질문은 귀하의 답변에 구성된 광범위하고 불필요한 트리거 (누군가가 지점을 누를 때 트리거)를 해결하는 방법에 관한 것입니다. 첫 번째 작업 수신 마스터 분기, 두 번째 개발 분기, 세 번째 FeatureX 분기 등을 제외하고 동일한 구성으로 5 개의 jenkin 작업이있는 경우 FeatureX 분기로 푸시 할 때 모든 jenkins 작업이 트리거됩니다. 빌드가 매우 느린 작업 과부하.
geoom

2

일반 웹 후크 트리거 플러그인이를 달성하기 위해 을 필터로 구성 할 수 있습니다.

로 구성된 경우

  • 명명 된 변수 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


"achi" 는 무엇입니까 ?
피터 Mortensen

철자 실수입니다.
Tomas Bjerre

Jenkins에서 $ GITCOMMIT을 얻는 방법은 항상 웹훅으로 null 인 것 같습니다. 그런 다음 상태를 다시 보내 성공 또는 실패로 말할 수 없습니다.
user3520245

1

현재 조직에서는 마스터 에서이 작업을 수행하지 않지만 스냅 샷 빌드를 생성하기 위해 개발 및 릴리스 / 분기 (Git Flow를 사용 중) 모두에서 수행합니다.

다중 분기 파이프 라인을 사용하면서 Jenkinsfile에서 when {} 구문을 사용 하여이 작업을 수행 합니다.

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

이것은이 블로그 게시물에 자세히 설명되어 있습니다 : https://jenkins.io/blog/2017/01/19/converting-conditional-to-pipeline/#longer-pipeline


1

위의 답변은 정확하지만 나는 여기에 초보자들에게 간단하게 설명하고 있습니다.

특히 파이프 라인에 대한 빌드 트리거를 설정하는 경우 :

파이프 라인 스크립트가 작성된 1.master, 2.dev 및 Jenkinsfile이라는 두 개의 Github 분기가 있고 각 분기에서 다른 파일을 사용할 수 있다고 가정하십시오.

새로운 파이프 라인 프로젝트 구성 (개발 지점 용)

## 1. git-plugin 및 cron 기반 접근 방식과의 코드 통합 전제 조건 git plugin을 설치하고 이름과 이메일로 구성해야합니다.

  1. 일반 섹션. 확인란- '이 프로젝트는 매개 변수화되어 있습니다.'를 선택하고 이름 -SBRANCH 기본값- 'refs / remotes / origin / dev'를 추가하십시오.
  2. 빌드 트리거 섹션 "체크 체크 박스- 'Poll SCM'및 커밋을 확인해야 할 필요에 따라 스케줄 (예 : '* / 1 * * * *')
  3. 파이프 라인 정의 섹션-선택-SCM에서 파이프 라인 스크립트-> git 선택-> addRepository URL-> git 자격 증명 추가-> 고급 선택-> Name- origin, RefSpec- '+ refs / heads / dev : refs / remotes / origin / 추가 dev '(dev is github branch) —> 빌드 할 분기-$ {SBRANCH} (ref 1st ref의 매개 변수 이름) —> 스크립트 경로 —> Jenkinsfile —> 경량 검사 선택 해제
  4. 적용 —> 저장

## 2. 코드 통합 : github-plugin 및 webhook 접근 전제 조건 Github 플러그인을 설치하고 Github 서버를 구성해야합니다. 다음 구성을 고려하지 않으면 연결을 테스트해야합니다.

Jenkins의 계정으로 Github 플러그인 구성

GitHub 섹션 API URL이없는 경우 Github 서버 추가 : https://api.github.com 자격 증명 : 개인 액세스 토큰 값이있는 비밀 텍스트 추가 (추가 버튼 클릭 : 비밀 텍스트 선택) (Github 계정에서 생성-> 설정) —> 개발자 설정 —> 개인 액세스 토큰 —> 토큰 추가 —> 범위 확인 —> 토큰 복사) 연결 테스트 —> Github 계정에 연결되어 있는지 확인하십시오. 후크 관리를 사용하여 확인란을 선택하십시오. '공유 비밀'에 대한 이전 자격 증명

에 의해 저장소에 추가되지 않은 경우 웹 후크 추가

  1. Github Repository 설정으로 이동 —> 웹 후크 추가 —> URL 추가
    http : // Public_IP : Jenkins_PORT / github-webhook /
  2. 또는 Public_IP가없는 경우 ngrok를 사용 하십시오 . 설치, 인증, 명령 ./ngrok http 80 (jenkins_port 사용)에서 공개 IP 가져 오기 후 webhook 추가 —> URL 추가 http : // Ngrok_IP / github-webhook /
  3. webhook 페이지에서 페이로드를 제공하여 테스트하고 200 상태인지 확인하십시오.

Github Pull 요청 플러그인이 있으면 게시 된 Jenkins URL로 구성하십시오.

  1. 일반 섹션. 체크 박스- 'Github 프로젝트'프로젝트 URL 추가-( '. git /'으로 끝나는 github 링크)
  2. 일반 섹션. 확인란- '이 프로젝트는 매개 변수화되어 있습니다.'를 선택하고 이름 -SBRANCH 기본값- 'refs / remotes / origin / dev'를 추가하십시오.
  3. 빌드 트리거. 섹션 체크 박스- 'GITScm 폴링을위한 GitHub 후크 트리거'
  4. 파이프 라인 정의 섹션 : 선택-SCM에서 파이프 라인 스크립트-> git 선택-> addRepository URL-> 자식 자격 증명 추가-> 고급 선택-> 이름-원점 추가, RefSpec- '+ refs / heads / dev : refs / remotes / origin / dev '(dev는 github branch) —> 빌드 할 분기-$ {SBRANCH} (ref 1.st point의 매개 변수 이름) —> 스크립트 경로 —> 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"확장자없이 동일한 이름을 가진 다른 파일을 사용해보십시오.

그게 당신이 필요한 전부입니다

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