-
[CI] Jenkins 와 Github Webhook 으로 PR 유효성 체크하기개발 2021. 12. 29. 18:06
"CI"는 개발자를 위한 자동화 프로세스인 지속적인 통합(Continuous Integration)을 의미합니다. CI를 성공적으로 구현할 경우 애플리케이션에 대한 새로운 코드 변경 사항이 정기적으로 빌드 및 테스트되어 공유 리포지토리에 통합되므로 여러 명의 개발자가 동시에 애플리케이션 개발과 관련된 코드 작업을 할 경우 서로 충돌할 수 있는 문제를 해결할 수 있습니다.
보통 코드를 개발한 뒤 원격 서버에 배포를 하기 위해서는 다음과 같은 과정을 거친다.
Git, GitHub, Jenkins, Docker, Docker Hub 을 통한 CI/CD 각 단계에서 개발 툴들이 어떤 역할을 하는지는 여기를 체크하자.
이 포스팅에서는 오로지 CI 에 대해서만 다룬다.
코드를 지속적으로 통합하기 위해서는 개발자가 각자 로컬에서 작업한 코드 변화에 대해서 시스템 안정성이 보장되느냐가 매우 중요하다. 특히 어떤 한 기능의 코드 변화가 다른 기능에 영향을 미치지 않았다는 것을 보장해야 한다. 즉 코드가 머지 되기 전에 Pull Request 를 날릴 때, 로컬에서 해당 브랜치를 받아서 -> 메인 브랜치로 머지를 하고 -> 테스트를 돌린 뒤 -> 정합성이 깨지지 않을경우 -> 원격에서 머지 해야 한다. 이 과정을 수동으로 하게 되면 코드가 변화할 때마다 개발자가 너무 귀찮고, 휴먼 에러가 나지 않을 것이라는 보장 또한 없다.
깃헙에서는 이 기능을 자동화 할 수 있도록 도와주는 여러 기능을 지원하는데, Github Webhook 이다.
Jenkins 같은 작업 자동화 툴을 사용해서, 이 PR 에 대한 체크 과정을 자동화 할 수 있다.
Github - Jenkins 연동 플로우 특정 레포지토리의 관리자는 직접 지정한 서버로 각 이벤트에 대한 webhook 을 날릴 수 있다.
이벤트는 매우 다양하다. PR create, push, merge, 코멘트 등등..
그 중 자동화할 작업의 필요에 따라 고르면 된다.
이번에 자동화할 코드 통합 작업 과정을 정리해보자면 다음과 같다.
- Pull Request 생성
- github에서 jenkins로 pull request webhook 전송
- jenkins에서 해당 pull request를 pending 상태로 변경(merge 못하게 하기 위함)
- jenkins에서 compile, test 수행 (compile, test 에러시 슬랙 메세지 전송)
- jenkins에서 compile, test 성공시 pull request 상태를 success로 변경
- code review
- merge
- github에서 jenkins로 merge webhook(=push webhook) 전송
- docker image 빌드 후 harbor registry에 push
github webhook 설정
- github repository → setting → webhooks → Add webhook 클릭
- Payload URL, Content type application/json 설정
- pull request webhook 설정
PR 관련 이벤트에 대한 웹훅을 Jenkins 서버로 발송한다.
Jenkins Pipeline 으로 변수 설정하기
페이지 왼쪽, 새로운 Item 생성 -> PipeLine -> 구성에서 설정할 수 있다.
0. Pipeline Token 설정
Github Webhook 을 설정할 때 웹훅을 보낼 젠킨스 서버 URL 을 입력했을 것이다. 그 URL 끝에 붙은 token 에 지정할 값이다. 깃헙이 보낸 URL 이 해당 토큰을 반드시 파라미터로 포함하고 있어야만 이 파이프라인으로 Webhook Parameter 를 받을 수 있다.
1. 사용자 지정 매개변수
Jenkins Pipeline 을 매뉴얼 실행 시 사용자에게서 받는 변수이다. 빌드할 이미지 이름 등을 받는다.
2. Github Webhook Parameter
PR 이벤트 발생 시 Jenkins 로 들어오는 요청을 말한다.
Github 이 보낸 웹훅은, 해당 레파지토리의 세팅에서 확인할 수 있다. Json으로 설정했다면 Json 형태로 온다.
Json Path 로 해당 값을 파라미터로 받을 수 있다.
Pipeline 탭에서 실제 스크립트를 작성한다.
'개발' 카테고리의 다른 글
[DB] DB 조인 방식 3가지 (0) 2022.01.23 [JPA] bulk data batch 작업 시 유의점 (0) 2022.01.06 [JPA] Primary Key가 아닌 필드를 참조하는 Foreign Key 를 만들때 (0) 2021.12.12 [TDD] TDD 로 알고리즘 문제 풀어보기 - 프로그래머스 42626, 더 맵게 (2) 2021.10.31 [Spring Boot] Logging 과 @slf4j 에 대해서 (0) 2021.10.29