Jenkins 실습 06: git연동
gitlab 또는 github에 push하면, webhook이 동작하여 Jenkins pipeline이 자동으로 수행되게 하는 설정을 추가합니다.
주의할 사항은 webhook이 동작하기 위해서는 최소 1번 그 파이프라인을 수동으로 실행하여 성공시켜야 합니다.
그래야 Jenkins내 어딘가 저장소에 파이프라인과 연결되어 있는 git repository주소가 저장됩니다.
webhook 요청이 오면 Jenkins는 요청된 webhook에 있는 git repository정보와 위 저장된 파이프라인 정보를 비교하여 해당되는 파이프라인들을 찾습니다. 그리고 찾은 파이프라인들을 수행해 줍니다.
gitlab연동
https://blog.naver.com/hiondal/221632000514
github연동
github와 Jenkins 간 webhook 연동의 아키텍처는 아래와 같습니다.
5,6,7번을 보면 github에서 Jenkins에 repository정보와 github access token을 보내면, Jenkins는 System Configuration에 미리 저장된 access token과 비교하고, 맞으면 repository정보의 git주소로 만들어진 pipeline을 찾아 실행 시키는 것입니다.
참고) Jenkins System Configuration에서 github 설정을 하지 않으면 github에서 요청되는 데이터에 Access Token이 없어도 파이프라인이 실행 됩니다. 보안상 검증되지 않은 webhook요청도 처리되기 때문에 위험하므로 반드시 github 설정을 하십시오.
1) 사전 작업
- Jenkins에 'github' 플러그인을 설치합니다.
- Pipeline 설정에서 'GitHub hook trigger for GITScm polling'을 체크합니다.
2) webhook 설정 작업
① Access Token발급: 아래 글을 참조하여 발급 하십시오.
https://happycloud-lee.tistory.com/231
② webhook 설정
- github.com을 로그인하고 webhook을 설정할 repository를 접근 합니다.
- Settings > Webhooks를 선택하고, [Add Webhook]을 클릭합니다.
- Payload URL: http://{jenkins url}:{jenkins port}/github-webhook/
{jenkins url}은 github서버가 인식할 수 있는 host 이어야 합니다. DNS에 등록이 되어 있거나 Jenkins서버의 IP를 입력 하십시오.
주의) 작업 PC의 hosts에 등록한 jenkins 도메인(예: http://myjenkins.io:9080)을 입력하면 github서버가 인식하지 못하므로 정상적으로 수행이 되지 않습니다.
URL마지막에는 반드시 '/'를 붙여야 합니다.
- Content type: application/json 선택
- Secret: github access token을 입력
③ Jenkins에서 github 설정
'Jenkins 관리 > 시스템 설정'을 클릭 합니다.
GihHUB 설정에서 [고급]을 누르고 Shared secrets에 Secret Text로 credential을 지정 합니다.
[Add]버튼을 누르고 도메인인 Jenkins를 선택 합니다.
Kind를 'Secret text'로 변경하고 Secret에 github access token값을 입력 합니다.
ID, Description에 동일한 credential 명을 입력 합니다.
3) 테스트
이제 소스를 수정하고, git push하면 자동으로 pipeline이 실행됩니다.
④ Push source: PC에서 소스를 수정하고 푸시 합니다.
⑤ Post webhook, ⑥ Token 검증
github의 Webhooks페이지에서 webhook이 Posting된 결과를 확인 합니다.
webhook이 보낸 token과 jenkins의 github설정에 저장한 token이 맞으면 정상적으로 Posting이 될것입니다.
⑦ Pipeline 실행: 해당되는 Jenkins pipeline을 열어 Pipeline이 자동으로 시작 되었는지 확인합니다.