DevOps/CICD

Jenkins를 사용하여 GitHub에서 Azure Kubernetes Service로 배포(2) - Jenkins와 GitLab 연동

돌돌김 2021. 1. 15. 23:54

 

 

자습서 - Jenkins를 사용하여 GitHub에서 Azure Kubernetes Service로 배포

GitHub 및 CD(지속적인 배포)에서 AKS(Azure Kubernetes Service)까지의 CI(연속 통합)를 위해 Jenkins를 구성하는 방법을 알아봅니다.

docs.microsoft.com

 

이번 포스팅은 자습서 중

  • 자동화된 빌드를 위한 Jenkins 빌드 작업 및 GitHub 웹후크를 만듭니다.
  • CI/CD 파이프라인을 테스트하여 GitHub 코드 커밋에 따라 AKS에서 애플리케이션을 업데이트합니다.

해당 부분을 위한 사전 작업이다. 물론 GitHub 대신 GitLab을 사용한다.

또한 이 포스팅은 꼭 AKS를 사용하지 않더라도 대부분 구성되어 있는 CI/CD 파이프라인에서 사용되는 부분이다.

 

 

Jenkins 플러그인 설치

 

Gitlab의 repository와 jenkins를 연동하기 위해서는 별도의 플러그인 설치가 필요하다. jenkins dashboard상에서 플러그인 설치를 들어간 뒤 필요한 플러그인을 설치한다.

  • Gitlab
  • Gitlab API
  • Azure Commons
  • Azure Credentials
  • Azure CLI
  • Azure Credentials

 

Gitlab Access Token 발급

 

Jenkins에서 gitlab의 repository로 접근하여 build trigger가 작동하려면 2가지가 필요하다

  • Gitlab Access Token(유저 접근 권한) - Jenkins Server가 GitLab에 접근하기 위함

  • Webhook(Build Trigger) - Jenkins의 item이 특정 Repository 접근하기 위함

우선 Gitlab Access Token을 발급 받아보자. Gitlab Access Token은 Settings에서 들어갈 수 있다.

Gitlab Access Token 발급을 위해 프로필에서 Settings에 들어간다

이후 페이지에서 Token의 이름, 만기일, 권한을 설정하면 토큰값이 나오는데, 새로고침을 하거나 창을 나가면 없어지므로 복사해서 따로 저장해둔다.

  • 만기일은 아무것도 적지 않으면 만료일이 없는 것으로 설정 된다.
  • 권한(Scopes)의 경우 api, read_user, read_api, read_repository 정도는 해주고 나머지 설정은 필요하다면 체크해주자

 

Jenkins와 Gitlab 연동을 위한 Credential 추가

 

Gitlab 계정의 토큰을 발급받았으면 Jenkins로 넘어가서 Global Credentials를 생성한다.

  • Jenkins 관리 -> Manage Credentials -> Stores scoped to Jenkins -> global -> -> Add Credentials

Kind는 어떤 유형의 Credentials를 만들건지 알려준다 종류에는 id/pw, ssh 등이 기본적으로 있고 추가 플러그인을 설치한 상황이면

GitLab API, Azure Service Principal 등이 있다.

 

우선 GitLab API Token을 사용해서 GitLab의 계정에 대한 Credentials를 발급하는 것이므로 GitLab API Token을 선택한다.

  • Kind : Credential의 종류
  • Scope : Credential의 범위. Global로 그냥 내비둔다
  • API token : gitlab에서 발급 받아서 따로 저장해둔 API Token
  • ID : 해당 Credential의 ID
  • Description : 이 Credential에 대한 설명

 

모든 칸을 다 채우고 OK를 누르면 Credential이 생성된 것을 볼 수 있다. 이제 이 Credential을 Jenkins Server와 연동해줘야 한다.

 

Jenkins Server에 연결

 

Jenkins 관리 -> 시스템 설정 으로 들어간다. 쭉 내리다 보면 Gitlab이라는 칸이 있을 것이다.

 

Enable authentication for '/project' end-point'에 체크를 해주고, 빈칸에 맞는 정보를 적어주고 Test Connection 까지 한다.

  • Connection name : 해당 설정을 구분하는 ID
  • Gitlab host URL : 연결할 Gitlab의 URL을 입력(repository의 주소가 아님)
  • Credentials : 방금 발급한 GitLab API Token을 선택

 오류없이 Success가 나오면 저장하고 나간다.

 

이제 GitLab Server와 Jenkins Server를 내 Gitlab ID를 가지고 발급한 API Token으로 연결해주었다.

 

 

이제 빌드를 시킬 Repository와 Jenkins의 item과 연동을 해보자

 

 

Jenkins Item 생성

 

Jenkins에서 build는 item단위로 이루어진다. 파이프라인을 구성해서 item과 item을 서로 이어서 빌드를 할 수도 있고 활용방안은 다양하다. 우선은 1개의 gitlab repository와 1개의 jenkins item을 연동해본다.

 

대시보드 옆에 있는 새로운 Item을 누른 뒤 Freestyle project를 만든다. item의 이름은 아무거나 해도 상관없다.

 

item 설정에서 해줘야 할 것은 다음과 같다.

  • GitLab Connection : 발급받은 gitlab api token을 사용해서 연결 가능하다.
  • 소스 코드 관리 : Git을 선택한다 
    • Repository 연결 : 연결할 repository의 주소를 clone하여 붙여넣는다(Clone with HTTP 또는 Clone with HTTPS)
    • Credentials 선택 : none로 나와있다면, add를 누르고 발급받아 넣는다.
      • Kind는 Username with password를 선택
        • Username : gitlab의 id
        • Password : gitlab의 pw
        • ID : 해당 크리덴셜의 고유 id (아무거나 넣어도 된다)
        • Description : 크리덴셜 id에 대한 설명(생략가능)
  • 빌드 유발
    • Build when a change is pushed to GitLab. 클릭
    • Advence를 눌러서 밑으로 내리면 Secret Token이 있다. GENERATE한다.

 

 

Gitlab Repository Web Hook 설정

 

배포 테스트에 사용할 프로젝트는 자습서에서 제공하는 azure-vote project를 사용하자. 해당 repository를 clone해온 뒤 내 gitlab에 새로운 repository를 만들고 push하자.

 

Repository에 push한 뒤 사이드 바에 있는 Settings -> webhook으로 들어간다.

 

 

Webhooks에 들어가면 URLSecret Token을 입력하는 칸이 나오는데, 이것은 바로 위에 있는 Item 설정에서 다 만든것이다.

Jenkins의 빌드유발 탭에서 Build when a change is pushed to GitLab. 옆을 보면 URL주소가 하나 있을 것이다.

그 주소를 복사해서 Webhooks의 URL에 넣고, Generate한 Secret Token을 넣는다.

 

 

 

 

 

우선은 Push events만 체크하고 Add webhook을 눌러 웹훅을 추가해준다. 

정상적으로 웹훅이 추가되면 아래에 생길 것이고, Test를 눌러 Push events를 했을 때 HTTP 200이 나오면 정상적으로 Web hooks가 설정된 것이다.

 

 

Build test

 

이제 쭉 밑으로 내리다 보면 Build 라는 탭이 있을 것이다. ADD BUILD STEP를 눌러 Execute shell을 클릭하고 저장을 눌러 나간다.

여기서 Build 단계에서 동작할 명령을 작성한다. 우선은 간단하게 "hello world"를 출력해보자. 

  • 자습서의 후반부 내용은 여기서 docker image를 docker hub이나 azure container registry에 push 하고 쿠버네티스로 배포하는 과정까지 담겨있다.

 

 

나가면 프로젝트로 바로 들어가진다. 우선 옆의 Build Now를 눌러서 정상적으로 빌드가 되는지 확인한다.

 

 

 

 

성공한 빌드의 #1을 눌러서 Console Output을 누르면 해당 빌드에 대한 출력 결과물을 볼 수 있다.

 

해당 item은 jenkins server가 설치된 vm에서 /home/new_home/jenkins/workspace/azure-vote-v2에 위치한다.

  • jenkins의 home 디렉토리를 바꾸기 위해 new_home을 새로만들었기 때문에 new_home이 있는것이다. 원래는 없다

연동한 git repository, commit message 그리고 shell에서 직접 작성한 hello word까지 전부 출력 되는 것을 볼 수 있다.

 

 

 

 

하지만, 이것은 어디까지나 수동으로 빌드를 한 것이다.

 

Build Trigger를 설정할 때, Build when a change is pushed to GitLab 을 선택했다. 즉, GitLab에 변경 사항이 push 되면  Build가 되야한다. 

 

간단히 README.md 파일의 맨위에 "Jenkins-Build Trigger Test "를 입력하고 commit, push 까지 해보자.

 

 

Repository에 정상적으로 push가 되면 Jenkinis dashboard를 봐보자.

아까 빌드했던 1번 위에 2번이 생겼고, Started by GitLab push by 라고 나오며 Build Trigger가 정상적으로 작동한 것을 볼 수 있다.

 

콘솔 Output의 내용도 commit message 부분만 다르고 전부 동일할 것이다.