💡 CICD 과정LINK의 개요에 따라 작성되었습니다.
순서를 따르면 순조롭게 진행할 수 있습니다.

GitHub Repo와 Jenkins 연동하기

이번 포스트에서는 Spring Project를 생성하지 않고 GitHub Repo에서 Jenkinsfile만 추가해 Jenkins와 연동해 볼 것이다.

이미 진행하고 있는 프로젝트에 CICD를 적용하고 싶은 독자는 필요한 설정만 마치고 다음 포스트로 넘어 가면 된다.

Github Repository 생성

다음과 같이 Github Repository를 생성한다. 이제 CICD를 테스트 하기 위한 Github Repository가 생성되었다.

Jenkins Item 생성 및 연결

이제 Jenkins에서 해당 레포지토리를 바라보는 Item을 생성해 보자. 새로운 Item버튼을 눌러 아이템을 추가해 준다.

해당 프로젝트는 Git Flow를 사용하여 관리할 것이고, develop브랜치와, main브랜치에서 업데이트가 감지되었을 때 Jenkins에서 build와 deploy를 실행할 것이므로 Multibanch Pipeline으로 아이템을 생성해 준다.

아이템을 생성하게 되면 바로 위와 같이 아이템을 설정할 수 있는 화면이 표시된다. [Branch Sources] 설정에서 해당 Item이 생성해둔 github repository를 바라보게 해준다.

[Add source]에서 Github를 선택해 준다.

위와 같은 화면을 볼 수 있는데 현재 Repository가 public이고, Jenkins에 Repository에 read만 할 것이기 때문에 Credentials는 필요하지 않다. 만약 Private Repository에서 작업이 이루어 진다면 깃허브에서 토큰을 발급받고 크레덴셜을 생성해 해당 아이템에 적용하면 된다.

위와 같이 만들어 두었던 레포지토리의 주소를 입력하고 [Validate]버튼을 눌러 jenkins가 해당 repository에 접근할 수 있는지 확인한다.

위와 같이 접근이 가능함을 확인할 수 있다.

위와 같이 여러 Behaviours가 기본으로 세팅되어 있는데 전부다 지워주고 우리가 필요한 기능만 설정해보자.

가장 먼저 모든 브랜치를 발견할 수 있도록 Discover branches를 추가해주고 StrategyAll branches로 설정해주자.

우리는 Git flow를 사용하고 develop브랜치에 변경이 일어났을때, 또 main브랜치에 변경이 일어났을 때 빌드와 배포가 일어나게 하고 싶다.

따라서 다음과 같이 Filter by name (with regular expression)을 선택해 준다. 그러면 정규표현식으로 브랜치를 필터링할 수 있다.

위와 같이 설정하고 [Save]버튼을 누른다. main브랜치와 develop브랜치만 필터링하여 변경점을 scan한다.

스캔 결과 브랜치가 0개 존재한다고 하니 성공한 듯 보인다.

Jenkins는 기본적으로 프로젝트 루트에 있는 Jenkinsfile을 보고 작업을 수행하게 된다. 간단하게 main브랜치에 Jenkinsfile을 만들고 Jenkins가 main브랜치에서 Jenkinsfile을 인식하는지 확인해 보자.

github repo에서 위의 버튼으로 새로운 파일을 만들수 있다.

위와 같이 이름을 Jenkinsfile로 설정해주고 다음과 같은 Hello World Example을 입력해보자.

1
2
3
4
5
6
7
8
9
10
pipeline {
    agent any
    stages {
        stage('Hello') {
            steps {
                echo 'Hello World'
            }
        }
    }
}

[Commit new file]을 눌러 Jenkinsfile이 main브랜치의 프로젝트 루트에 존재하도록 한다.

커밋이 완료되고 Jenkins의 Item의 Scan Repository Log를 눌러보자.

위와 같이 Scan Repository Log를 누르는 순간 모든 브랜치를 확인하고 filter를 거쳐 main브랜치에서 Jenkinsfile을 성공적으로 발견했다는 로그를 확인할 수 있다.

그리고 첫번째 빌드가 완료되어있음을 확인할 수 있다. Jenkinsfile에서 설정한 Hello stage가 성공적으로 실행되었다.

빌드 번호를 누르고 Console Output을 클릭하면 콘솔 로그를 확인할 수 있다. 콘솔 로그를 확인해 보면 Hello World의 출력이 완료되었음을 확인할 수 있다.

하지만 이는 Jenkins가 스스로 Github Repository를 체크해 브랜치들을 확인한 것이 아닌, Scan Repository Log를 눌러 수동으로 브랜치를 확인했다.

우리가 원하는 것은 github repo에 변화가 생겼을 때 자동적으로 빌드가 되는 것을 원하기 때문에, 추가적인 설정을 해주어야 한다.

Github Repo에서 변화가 생겼을 때, Github에서 Jenkins에게 변화가 일어났음을 알리는 Webhook을 날리도록 설정해주어야한다.

그러면 Github Repo에서 변화가 생겼을 떄, Jenkins에게 Webhook이 날라가고, Jenkins는 repo에 변화가 생겼음을 감지하고 브랜치들을 스캔하게 된다.

Webhook 생성

가장 먼저 Jenkins가 로컬에서 실행되고 있기 때문에 외부 인터넷 환경에서 Jenkins가 접속할 수 있게 해주어야 한다.

공유기의 DHCP설정이나, 포트포워딩 설정, 또는 DDNS설정을 해주면 외부에서 로컬에서 실행중인 Jenkins에 접속할 수 있게된다.

가장 먼저 Jenkins에서 Multibranch Scan Webhook Trigger 플러그인을 설치해준다.

[Jenkins 관리] - [플러그인 관리] - [Available Plugins]에서 위와 같이 Multibranch Scan Webhook Trigger를 체크하고 설치해준다.

이제 Item의 설정에 들어가면 Scan Repository Triggers라는 항목이 생기고 여기서 토큰을 설정해 줄 수 있다. Github에서 repo에 변경점이 생겼을 때 해당 토큰이 포함된 주소로 웹훅을 날릴 것이다. 원하는대로 토큰을 설정하고 토큰을 안전한 곳에 복사해두자.

위에서 알 수 있듯이 JENKINS_URL/multibranch-webhook-trigger/invoke?token=[Trigger token]의 형태의 토큰을 포함한 주소로 Github에서 Webhook을 날릴 수 있도록 설정하면 된다.

이제 Github에서 repo의 변경점이 생겼을 때, Webhook을 보내도록 설정해 보자.

가장 먼저 Github Repository의 Settings의 Webhooks에 접속한다.

위와 같이 [Add webhook]을 눌러 웹훅을 추가한다.

위와 같이 push event가 생겼을 때 웹훅을 jenkins가 요청한 주소로 보내게 webhook을 설정하자. 단 Content type을 application/json으로 설정해주어야 동작함을 명심하자.

또한 Payload URL은 위에서 설명했듯이 JENKINS_URL/multibranch-webhook-trigger/invoke?token=[Trigger token]로 설정해 주면 된다.

이제 Github Repo에 push가 생겼을 때 Github가 jenkins에게 웹훅을 보내고 jenkins는 웹훅을 감지하여 업데이트된 내용을 빌드하는지 확인해보자.

Jenkinsfile에서 Edit file을 눌러 다음과 같이 수정해준다.

1
2
3
4
5
6
7
8
9
10
11
pipeline {
    agent any
    stages {
        stage('Hello') {
            steps {
                echo 'Hello World2'
            }
        }
    }
}

위와 같이 Jenkinsfile을 업데이트해주고 변경사항을 업데이트 해주자.

이제 Jenkins에서 Scan Repository Now 버튼을 누르지 않아도 repo에 변경점이 생기면 GitHub에서 Jenkins에게 Webhook이 날아간다. 이를 감지한 Jenkins는 Repository Scan을 하고 변경점에 대해 작업을 수행하게 된다.

위와 같이 자동적으로 Build가 일어나게 된다.

또한 Console Log를 살펴보면 변경점이 잘 적용된 것을 확인할 수 있다.

이로써 Jenkins에서 GitHub Repo의 변경점을 자동적으로 감지하고 빌드를 진행할 수 있게 되었다.

댓글남기기