AWS/Project

[CI/CD] CI/CD - Jenkins, GitLab 구성

jih0ssang 2024. 6. 19. 13:35

 참고 블로그: [Hands On] EC2 CI/CD – 교보DTS 기술 블로그 (kyobodts.co.kr)

 

회사에서 내부 과제 프로젝트로 IaC로 CI/CD 구성을 시켰는데..

CI/CD를 한번도 구성해본 적이 없어서 사전에 별도로 CI/CD 연습 및 이해를 해보기 위해 실습하도록 한다.

 

전체 아키텍처

 

 

 

흐름

  1. Developer가 Gitlab에 코드를 push
  2. Gitlab이 CI 진행 후 webhook을 통해 Jenkins에게 이를 알리고 코드를 넘김
  3. Jenkins는 Gitlab에게 코드를 받고 이미지 생성
    1. 이미지를 docker hub와 같은 이미지 저장소에 푸시 (이미지 저장)
    2. 이미지를 k8s 배포(deployment)에 업데이트하여 새 이미지를 사용하도록 함 (현 환경에 이미지 배포)

 

여기서 내가 해야할 일

  1. 환경 구성 및 Gitlab ↔ Jenkins 연동
  2. GitLab ↔ Jenkins Webhook 생성
  3. Jenkins → Docker Hub 이미지 push
  4. Jenkins → K8s Master 이미지 deploy

 

사용 Tool

Gitlab, Jenkins, Docker, Mysql

 


 

환경 구성 및 Jenkins와 Gitlab 연동

k8s Master Node, Worker Node, EC2(Jenkins, Gitlab) 생성 

Jenkins, GitLab 환경구성 참고: https://jiho0735.tistory.com/235 

K8S Master / Worker Node 환경구성 참고: https://jiho0735.tistory.com/236

 

프로젝트 연동을 위해 GitLab에서 프로젝트 생성

 

 

 

Jenkins Plugin 설치 (GitLab)

GitLab과 연동을 하기 위해 필요한 Plugin을 설치한다.

 

Jenkins Credentials 추가

Dashboard > Jenkins 관리 > Credentials

드래그 하다보면 나온다.

 

Jenkins에서 GitLab에 대한 Credentials를 추가해야 한다.

 

 

 

Username과 Password는 GitLab의 ID와 PW를 입력해야 한다. 

 

 

GitLab에서 Access token 생성

 

Access Token은 다시 확인할 수 없으므로 따로 저장해두어야 한다.

 

Jenkins 에서 GitLab Connection 설정

 

계속 드래그 하다보면 GitLab 항목이 나온다.

Gitlab host URL http://gitlab.jiho.com/ 을 입력 후

Credentials는 방금 발급받은 Access Token을 입력해야 한다.

 

 

 

우측에 Test Connection 버튼을 누르면 연결이 되는지 테스트를 해볼 수 있다.

설정이 모두 완료 되었다면 저장 버튼을 누른다.

 

 

 

GitLab에서 Jenkins로 Webhook 생성

 

 

 

 

 

Webhook Plugin 설치

아까 GitLab Plugin 설치와 동일하게   Dashboard > Jenkins 관리 > Plugins 경로로 이동한다.

 

Generic Webhook Trigger Plugin 설치한다.

 

 

 

Jenkins Pipeline 생성

 

아래로 드래그하다 보면 Build Triggers 설정하는 부분이 나온다.

 

 

Webhook 설정을 위해 Gitlab에 기입할 것이 2가지가 있다.

    1. webhook URL ( http://11.222.33.444:8080/project/test-pipeline

고급 버튼을 누르면 Secret token 공란이 나온다.

 

 

 

Generate 버튼을 누르면 Secret token이 발급된다.

   2. Secret Token ( 123456abcdef )

 

1, 2 번을 미리 메모장에 적어둬야 한다.

 

GitLab에서 Webhook 설정

이전에 적어둔 1, 2번을 각각 URL, Secret Token 공란에 기입한다.

Webhook이 일어날 때, Jenkins에 접근할 때 전달 경로용 URL과 인증용 Token인 것 같다.

 

 

어떤 Event가 발생할 때 Webhook이 동작하게끔 할지 Event 유형을 체크하는 내용이다.

 

Webhook이 생성되었으니 Push events가 발생했을 때 Webhook이 일어나는지 테스트 해본다.

 

HTTP 200 으로 정상적으로 Webhook이 동작한다.       ( Webhook 할 때 8080 사용하는 듯..)

 

Jenkins에도 Build 되는 것을 확인할 수 있다. 테스트 2번 성공해서 History에 2번이 기록되었다.

 

 

Jenkins에서 ECR로 이미지 push

 

 

 

 

 

 

ECR에 Push 하기 위해 AccessKey 발급 필요

 

사전 준비사항

  • ECR에 푸시할 IAM 계정으로 AccessKey발급 필요
  • Jenkins에 ECR 플러그인 설치

 

 

 

Jenkins Pipeline 구성 (Gitlab 내 읽을 branch, Jenkinsfile 설정) 

Dashboard > test-pipeline > Configuration 을 들어간다.

아래로 드래그 하면 Pipeline 구성이 나온다.

GitLab에서 코드를 관리를 한다면 'Pipeline script from SCM' 선택하고
Jekins에서 직접 script 작성한다면 'Pipelines script' 선택한다.

이 구성은 GitLab에서 코드를 관리하므로 Pipeline script from SCM을 선택한다.

 

Repository URL은 코드 관리할 자신의 GitLab의 URL을 작성한다.

Credentials는 아까 만들어둔 것으로 선택하면 된다.

 

GitLab의 URL은 Clond with HTTP에서 복사해오면 된다.

 

 

 

계속 이어서 Jenkins pipeline 구성을 한다.

Branch Specifier는 Jenkinsfile이 있는 origin branch를 입력한다.

Script Path는 자신의 Jenkinsfile 이름을 입력한다.

 

 

 

ECR 연결을 위한 Credential 생성

얘는 나중에 해야지

 

Jenkins에서 K8s Master Node로 이미지 deploy

 

 

 

Jenkins 서버에 K8S 설치

참고 링크: [CI/CD] K8S 환경구성

# sudo apt-get update
# sudo apt-get install -y apt-transport-https ca-certificates curl
# sudo curl -fsSLo /usr/share/keyrings/kubernetes-archive-keyring.gpg https://packages.cloud.google.com/apt/doc/apt-key.gpg
# echo "deb [signed-by=/usr/share/keyrings/kubernetes-archive-keyring.gpg] https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
# sudo apt-get update
# sudo apt-get install -y kubectl

 

 

K8S Plugin 설치

 

 

K8S Credentials 생성