pooney
article thumbnail

 

 

 

 

 

프로젝트를 진행하면서 수많은 개발서버와 수많은 브랜치가 생성이 되는데요. 저같은 경우 개발서버에 맞는 브랜치를 만들고 해당 브랜치를 Jenkins를 통해 빌드 배포하는 방식으로 많이 이루어 졌습니다.  하지만 개발서버가 많아 질 수 록 Merge하고 젠킨스를 통해 수동 배포하는 상황이 많아지면서 불필요한 동작과 시간이 소비가 많아졌습니다. 간략한 구조는 아래와 같은 구조가 될 거 같습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

하지만 대부분 별다른 설정없이 사용을 하면 젠킨스 Branch별 Job을 생성해서 Webhook설정하는 구조로  아래와 이미지 같이 많이 사용 하 실 겁니다.  

 

 

 

 

 

 

 

 

 

물론 브랜치가 몇개 안되면 상관 없겠지만 점차 Branch의 숫자가 늘어나면 해당 Job의 개수도 많이 늘어나야 할 것입니다.  Job 하나로 구성하고 Merger or Push가 되었을때  Webhook에 의한 푸시를 해당 Job에서 받고 해당 Job에서 push된 Branch 정보를 받아 올 수 없을까? 하는 고민을 했는데 아주 좋은 Plugin이 존재했습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

그것은 바로 "Generic Webhook Trigger" 였습니다.

 

 

 

 

 

 

 

 

 

해당 Generic Webhook Trigger Plugin은 푸시 요청이오면 Payload를 파싱할 수 있는 아주 좋은 기능을 가지고 있어 Merge or Push 된 Branch정보를 가지고 올 수가 있었습니다.  추가적 으로 아래 같은 정보를 얻을 수 있다고 합니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

https://plugins.jenkins.io/generic-webhook-trigger/

 

Generic Webhook Trigger

Can receive any HTTP request, extract any values from JSON or XML and trigger a job with those values available as variables. Works with GitHub, GitLab, Bitbucket, Jira and many more.

plugins.jenkins.io

 

 

 

 

 

아래처럼 젠킨스의 Plugins에 가서 설치를 진행 해 주시면 됩니다. 

 

 

 

 

 

 

 

 

 

이후 젠킨스에 Branch 별로 생성하는 Job이 아닌 하나로 Webhook을 받을 수 있는 Job을 만들어 보겠습니다. 

 

 

 

 

 

 

Github Project url 을 입력해주세요 반드시 입력해야  합니다!

 

 

 

 

 

 

 

 

 

가장 중요한 Plugin을 사용하기 위해 Generic Webhook Trigger를 체크 박스 한 후 아래와 같이 입력을 해주시고 JSONPath로 체크해주세요.  여기서 ref는 Pipline Script에서 사용하는 변수명으로 사용이 됩니다.

 

 

 

 

 

 

 

 

 

 

Token을 입력해주시면 되는데요 원하시는 구별 할 수 있는 값을 입력해주시면 됩니다. 해당 토큰은 나중에 Webhook요청시 사용되는 Token입니다. 해당 토큰으로 젠킨스가 구별을 한다라고 생각하시면 됩니다. 저는 "POONEY_APP" 이라고 하겠습니다

 

 

 

 

 

 

 

 

 

 

 

Webhook을 받을 수 있도록 아래와 같이 체크박스를 진행 해줍니다. 

 

 

 

 

 

 

 

 

 

 

 

 

그러면 긴장되는 파이프라인 스크립트를 작성하겠습니다.  아래와 같이 위에서 정의한 $ref 변수를 사용을 했습니다. 이후 젠킨스 빌드 로그에 해당 값이 어떻게 찍히는지 확인 해보겠습니다

 

 

 

 

 

 

 

 

 

 

 

pipeline {
  agent any
 
  stages {
    stage('Example') {
      steps {
        script {
            echo "$ref"
            def ref = "$ref"
            def st = ref.split('/')
            def branch = st[st.size()-1]
            echo "$branch"
            git branch: "$branch" , credentialsId: 'jenkins-token', url: 'https://github.com//jenkins-test.git'
        }
      }
    }
  }
}

 

 

 

 

 

 

 

혹시 git project가 public이 아닌 경우 credentialsId가 필요한데요 설정 방법은 아래의 글을 참고해주세요!

 

 

 

 

 

 

https://pooney.tistory.com/86

 

Spring boot - jenkins(젠킨스) webhook 연동

CI/CD에 대표적인 젠킨스의 WebHook을 알아 보려고 합니다. 그렇다면 WebHook은 무엇일까요?? WebHook WebHook은 어떠한 이벤트가 일어나면 설정했던 URL로 특정 정보,이벤트를 보내거나 알려주는것을 말합

pooney.tistory.com

 

 

 

 

 

 

 

 

 

자 그러면  GITHUB로 이동해서  Repo및 Branch를 생성한 다음 WEBHOOK 까지 설정해 보려고 하는데요.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

잠깐!  WEBHOOK 설정을 진행을 하기 전에 GITHUB에서 Push or Merger 되었을때 젠킨스에게 Push를 주어야 하는데 그러면 외부에서 요청가능하게 젠킨스의 주소를 알아야하는데 당연히 localhost로는 외부에서 요청이 불가능하니 외부에서도 요청을 할 수 있도록 작업이 필요한데요. 몰론 AWS나 개인 서버를 사용하시는 분들은 문제가 없지만 local환경에서 테스트하시는 분들을 위해 아래와 같은 좋은 서비스인 "ngrok" 을 이용 하도록 하겠습니다. 

 

 

 

 

 

 

https://ngrok.com/

 

ngrok | Unified Ingress Platform for Developers

ngrok is a secure unified ingress platform that combines your reverse proxy, firewall, API gateway and global load balancing into a production service.

ngrok.com

 

 

 

 

 

ngrok을 실행시키고 아래의 명령어를 입력하시면 외부에서 접속가능하게 도메인을 생성해 줍니다. 

 

 

 

 

 

ngrok.exe http {젠킨스 포트}

 

 

 

 

 

 

 

 

 

 

 

 

 

이후 해당 주소로 들어가면 아래와 같은 화면을 볼 수 가 있는데요. 해당 화면은 처음 접속화면 보이는 화면인데 젠킨스가 해당 URL로 푸시알림을 보냈는데 지금과 같은 화면을 만나면 PUSH알림을 받을 수 없으니 Visit Site를 눌러 재진입시 해당 Alert 화면이 보이지 않게 해줍니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

자! 이제는 GITHUB 설정을 진행을 한건데요. 아래와 같이 저는 DEVELOP_V1, DEVELOP_V2를 생성했습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

이후 Settings - Webhooks-  Add webhook을 클릭하여  Webhook설정을 진행 하겠습니다. 

 

 

 

 

 

 

 

 

 

 

저는 아래와 같이 진행했습니다.  

 

 

  • Payload URL :  {젠킨스 주소}/generic-webhook-trigger/invoke?token={TOKEN}  
  • Content type : application/json 

 

 

여기서 TOKEN은 위에 젠킨스에서 설정한  TOKEN( = POONEY_APP) 를 입력해주시면 됩니다. Content type 또한 위에서 설정한 내용으로 json으로 해주시면 됩니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

자 이젠 작업은 모두 끝났습니다. 그러면 이제 Push를 한번 해볼까요? 저는 DVELOP_V1에 PUSH를 해보겠습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

 

자! 아래와 같이 성공적으로 빌드 작업이 진행 중인 것을 확인 할 수 있습니다. 

 

 

 

 

 

 

 

 

 

 

 

 

하지만 이러면 Branch 별로 Job을 만들어 진행한 것과 차이를 느끼기 힘드니 로그를 한번 보겠습니다. 

 

 

 

 

 

 

 

 

 

 

 

로그에 PUSH된 Branch인 DEVELOP_V1과 해당 브랜치에서 Pull을 받고 정상적으로 Commit message를 보여주는것을 확인 할 수 있습니다.그러면 다시 DEVELOP_V2에 푸시를 하면 어떻게 될까요?

 

 

 

 

 

 

 

 

 

 

 

 

DEVELOP_V2 도 성공적으로 빌드 되는 것을 확인 할 수 가 있습니다.  참고로 "ref/heads/DEVEOP_V2" 라는 $ref 값은 아래와 같이 젠킨스 Webhook의 Recent Deliveries에서 확인 할 수 있습니다. 

 

 

 

 

 

이처럼  Webhook을 받기 위해 브랜치 별로 Job을 생성하는 것이 아닌 하나의 Job으로 Webhook을 받고 해당 branch를 빌드가 가능했는데요 이러한 기능들을 잘 사용하면  반복적인 작업을 줄일 수가 있습니다. 부족한점이 많지만 더 좋은 방법이 있다면 공유 부탁드리겠습니다. 

 

profile

pooney

@pooney

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!