ecsimsw
Jenkins trigger filtering by tag name 본문
요구 사항 : trigger filtering by tag name
회사에서 젠킨스 Trigger를 사용해서 레포지토리에서 발생하는 web hook을 받아 빌드를 자동으로 할 수 있도록 하는 작업을 맡게 되었다. 문제는 한 레포지토리 안에서, branch나 comment가 아닌, tag 이름으로 구분되는 Job이었다.
- 한 코드 저장소 안에서 tag로 구분된 여러 JOB이 있었다.
- 태그가 생성되는 이벤트를 받아 이 여러 JOB 빌드를 실행시켜야 하는데, JOB에 해당하는 tag가 아닐 경우 빌드를 실행시키지 않는 필터링이 추가되어야 한다.
Webhook request 안의 정보를 이용해서 깔끔하게 필터링 할 수 있는 방법을 고민했고, 괜찮은 플러그인을 찾아 소개하게 되었다.
1. Generic Webhook Trigger Plugin
generic-webhook-trigger 을 설치한다.
2. 원하는 정보에 해당하는 키 값 찾기
webhook의 요청이 어떻게 나가는지 확인해본다. 예를 들면, 웹 훅의 키 ref에 해당하는 값을 가져와 branch 정보나 Tag 정보를 가져 올 수 있겠다는 것을 확인할 수 있다. (eg, Gitlab-webhook)
위는 GitLab webhook의 예시이다. 훨씬 더 많은 데이터가 있는데 이 정도만 가져왔다. 이 안에서도 이벤트가 발생한 브랜치, 사용자 정보 등을 확인할 수 있다.
우리는 훅의 이 정보를 이용하여 빌드 여부를 필터링 할 것이다.
3. Jenkins job configuration → Build triggers
원하는 Job의 Build triggers에서 Generic webhook trigger 사용을 체크한다.
4. Jenkins contetnt parameters setting
Variable name → 원하는 변수명 (ex, ref)
Expression → 원하는 값의 key (ex, $.ref)
5. Set token / Check invoke url
원하는 토큰 이름을 입력한다. Webhook의 URL이 이 토큰을 파라미터로 갖는다.
- Query parameter /invoke?token=TOKEN_HERE
- A token header token: TOKEN_HERE
- A Authorization: Bearer header Authorization: Bearer TOKEN_HERE
기본 invoke url은 http://${JENKINS_URL}/generic-webhook-trigger/invoke이다.
ex) 아래는 쿼리파라미터로 토큰을 표시한다고 하면 invoke url의 예시이다.
JENKINS URL : http://ecsimsw.jenkins
TOKEN : my-token
Invoke url : http://ecsimsw.jenkins/generic-webhook-trigger/invoke?token=my-token
6. Configure Webhook
Webhook을 설정한다. Webhook을 발생시킬 이벤트 종류를 선택하고, 타겟 Url을 앞서 확인한 invoke url로 하면 된다.
이때 hook의 content type을 application/json으로 한다.
설정 후 해당 이벤트를 발생시켰을 때 HTTP response status가 200이면서 아래와 같이 Jenkins에 설정한 트리거에 대한 정보가 반환된다면 알맞게 Webhook을 발생시켰고, Jenkins Trigger가 알맞게 응답한 것이다. 만약 응답코드가 200이 아니거나 응답 본문이 없다면 잘못된 것이다. 설정을 다시 확인한다.
응답코드가 200이면서 Job에 대한 정보가 올바른데 빌드 실행이 안되었다면 Trigger는 Webhook을 받을 수 있으나 실행 조건이 맞지 않아서이다. 특히 Optional filter에 다른 값이 들어가진 않았는지, 정규표현식을 잘못쓰진 않았는지 다시 확인한다.
(위 예시는 필터 조건으로 triggered false를 의도한 상황에서의 캡쳐이다. true여야 빌드가 진행된다.)
7. Optional filter
Webhook의 요청 본문의 정보로 빌드 여부를 쉽게 필터링할 수 있다. 처음 요구 사항처럼 tag 이름이나 branch 정보를 받아 필터링할 것이다.
아래의 예시는 Webhook의 ref라는 변수로 정의한 값이 refs/tags/core-v*에 만족하는지 여부를 확인하는 필터링이다. $ref는 앞서 Post content parameter에서 요청 본문의 ref 값을 ref라는 이름으로 변수로 만들어둔 것을 사용한 것이다. 즉 태그 발생 이벤트에 Webhook을 걸고, 해당 hook의 본문 값을 읽어 발생된 태그가 core-v*임을 확인한다.
'Architecture > CICD' 카테고리의 다른 글
Github actions, 디렉토리 구조 자동 작성 (0) | 2023.02.25 |
---|---|
젠킨스 jdk 버전 11로 올리는 방법 (2) | 2021.08.07 |
젠킨스 삽질 과정에서 배운 것들 (4) | 2021.07.04 |