0부터 시작하는 Jenkins & GitLab 공부 - Jenkins / Terraform / GitLab 연동하기

Jaehong Lee·2023년 7월 19일
post-thumbnail

1. 구축 계획

구축 아키텍처

  • Jenkins & GitLab & Terraform을 연동해서 AWS에 VPC를 생성해보자

필요 조건


2. AWS 리소스 생성

AWS Access Key

  • Terraform을 통해 AWS에 인프라를 구축할 때, AWS Access Key가 필요하다. AWS CLI용 Access Key를 생성하자

보안그룹

  • 작업을 위한 SSH 접속을 위한 22번 포트와 Jenkins 접속을 위한 TCP 8080번 포트에 대한 인바운드 트래픽을 허용하자

EC2

  • 인스턴스 이미지는 Amazon Linux2023을 사용한다

  • 사양은 t3.medium으로 한다. Jenkins와 Terraform을 실행해야 하므로, 성능을 넉넉하게 주어야 한다

  • 스토리지는 30GB로 할당하자

인스턴스를 생성하자


EIP

  • 탄력적 IP를 할당 받고, 생성한 EC2 인스턴스에 연결하자

3. Tool 설치

SSH 접속을 통해 EC2 인스턴스에 접속하자

Terraform CLI

sudo yum update -y
wget https://releases.hashicorp.com/terraform/1.3.9/terraform_1.3.9_linux_amd64.zip
sudo yum -y install unzip
unzip terraform_1.3.9_linux_amd64.zip
sudo mv terraform /usr/local/bin/
  • Terraform을 설치하자. 바이너리 파일을 다운 받고, 원하는 경로에 옮기면 된다. 해당 경로는 Jenkins 설정에 필요하므로 기억해두자
terraform version
terraform -install-autocomplete
source ~/.bashrc
  • 설치된 Terraform 버전을 확인하고, Terraform 명령어 자동 완성 기능을 설치하자

Git

sudo yum -y install git
  • GIT을 설치하자

AWS CLI

Terraform과 AWS CLI를 같이 사용하는 이유

  • AWS 에 대한 Terraform 리소스가 없거나, CLI / SDK를 통해서만 API 작업을 실행할 수 있는 경우가 발생할 수 있다. 따라서 AWS CLI를 같이 사용하는 것이 좋다

Jenkins

sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
sudo yum install -y java-11-amazon-corretto
sudo yum install -y jenkins
  • Jenkins를 설치하자
sudo service jenkins start
sudo systemctl enable jenkins
  • Jenkins를 실행하고, 인스턴스 부팅 시 자동으로 실행되게 설정하자

4. Node 설정

Jenkins User 권한 설정

sudo visudo
  • Jenkins에서 Job 실행 시, sudo 명령을 쓰는데 password를 요구하지 않도록 설정하자
  • visudo는 /etc/sudoers 파일을 관리해주는 애플리케이션이다
    • vi /etc/sudoers를 통해 직접 수정할 수 있지만, /etc/sudoers 파일은 기본적으로 퍼미션이 0440이다. 쓰기 작업에 대한 권한이 없으므로, 직접 수정하려면 파일의 퍼미션을 변경해야 한다
    • visudo는 이러한 퍼미션 문제를 해결해주며, 문법 & 설정이 올바른지 확인 해준다

  • 위와 같이 설정하자

GitLab Hosts 설정

  • 우리는 사설 레포지토리인 GitLab을 사용하는데, DNS에 등록하지 않았다. 따라서 Jenkins가 설치된 서버에서 GitLab을 찾기 위한 Hosts 설정이 필요하다
# sudo vi /etc/hosts
11.111.111.111 gitlab.hong.com
  • GitLab Ingress에 설정한 Domain 주소와 Ingress LB의 IP 주소를 /etc/hosts에 등록하자

Root CA 인증서 등록

  • 사설 TLS 인증서가 적용된 GitLab에 접근하기 위해선, TLS 인증서 발급에 사용한 Root CA 인증서를 등록해야 한다
    • Root CA 인증서를 가져오자
sudo yum -y install openssl
  • 인증서 등록을 위해 openssl을 설치하자
sudo cp localCA.pem /etc/pki/ca-trust/source/anchors/.
sudo update-ca-trust
  • RHEL과 CentOS는 /etc/pki/ca-trust/source/anchors/ 에 인증서 파일을 넣고, 적용 명령을 내리면 된다

5. Jenkins 설정

http://EIP주소:8080 으로 접속하자

초기 설정

  • 위 화면이 출력된다
sudo cat /var/lib/jenkins/secrets/initialAdminPassword
  • 초기 Admin 비밀번호를 확인하고, 입력하자

  • Admin 계정을 생성하고, 권장된 Plugin을 설치하자

Jenkins TimeZone 설정

  • User 설정에 들어가자

  • admin User의 설정에 들어가자

  • User Defined Time Zone에 원하는 Time Zone을 선택하면 된다

Jenkins executor 설정

  • System 설정에 들어가 executor 수를 설정하자. 4를 10으로 바꾸면 된다
  • 위 설정은 Node에서 동시에 Build할 수 있는 Job의 최대 숫자이다
    • executor : Node에서 Job을 Build하기 위해 실행시키는 리소스의 기본 단위

현재 Slave 노드는 생성하지 않았으므로 Master 노드가 작업을 실행하는 구조이다. 따라서 Master 노드의 executor 최대 개수만 설정해주면 된다


6. Jenkins & Terraform 연동

해당 과정은 선택 사항이다

Terraform Plugin이 선택 사항인 이유

참조 : https://plugins.jenkins.io/terraform/

  • Terraform Plugin은 Jenkins 서버에서 bintray.com을 통해, Terraform을 자동으로 다운받아 설치해주는 기능을 제공한다

  • Terraform 플러그인을 이용하면, 위와 같이 Job 생성 시에 Terraform 구성 파일 내용을 직접 입력할 수 있는 Configuration Text나 Terraform에 적용시킬 구성 파일의 위치를 지정하는 Configuration Path와 같은 편의 기능을 사용할 수 있다
  • Configuration Text를 통해 생성된 임시 tf 파일은 작업 실행 후 삭제된다

아래 조건이라면, Terraform Plugin을 설치하지 않아도 된다

  • 준비된 Terraform 구성 파일을 사용
  • Terraform을 미리 설치
  • Job에서 Execute Shell의 Shell 명령을 통해 Terraform 을 실행

우리는 미리 설치한 Terraform을 사용하며, GitLab에 저장된 Terraform 구성 파일을 사용하고, Shell 명령을 통해 Terraform을 실행시키므로, Terraform Plugin을 설치하지 않아도 된다


Terraform Plugin

  • Terraform Plugin을 설치하고, Jenkins를 재시작하자

Terraform Tool 설정

  • Jenkins 관리 -> Tools에 들어가자

  • Terraform 항목에서 Add Terraform 클릭

  • Install automatically 체크를 해제하고, Terraform이 설치된 경로를 설정해주면 된다
  • Install automatically를 사용하면, bintray.com을 통해 원하는 버전의 Terraform을 자동으로 다운받아 설치해준다

7. Jenkins & GitLab 연동

GitLab Plugin

  • Terraform Plugin을 설치하고, Jenkins를 재시작하자

Jenkins Credential

  • GitLab에서 Access Token을 발급하자

  • Gloabl credentials 설정에 들어가서 Credentials를 추가하자

  • 먼저, Job 실행에 사용할 Credentials를 생성하자
    • Username : GitLab ID
    • Password : 발급한 GitLab Access Token

  • 다음으로, Jenkins에 GitLab Connection을 생성하기 위한 Credentials를 생성하자

GitLab Connection

  • 이제 Jenkins와 GitLab 간의 Connection을 생성해야 한다

  • System 설정에 들어가서 GitLab Connection을 생성하자
  • GitLab Ingress에 설정한 Domain 주소와 위에서 생성한 API token Credential을 지정해주면 된다

8. 연동 TEST - VPC 생성

GitLab Resource 준비

  • Private Project를 생성하자
terraform {
  required_version = "1.3.9" #자신의 terraform 버전으로 설정.

  required_providers {
      aws = { #사용할 프로바이더 aws 설정
          source = "hashicorp/aws" #저장 경로 설정
          version = "~> 5.0" #버전 설정
      }
  }
}

provider "aws" {
  region     = "ap-northeast-2" # 적용할 AWS Profile의 Region
  profile    = "default" # 적용할 AWS Profile 이름
}

resource "aws_vpc" "example223" { # 생성할 리소스는 vpc 이며, 이름은 example223 이다
  cidr_block = "10.123.123.0/24" # vpc 대역
}
  • Project 안에 main.tf 파일을 생성하자. terraform.required_version은 꼭 설치한 Terraform 버전으로 설정해야 한다
  • AWS Profile을 Provider에 적용할 것이다. 따라서 AWS Access Key와 Secret Key는 따로 입력하지 않는다

AWS Profile을 이용한 Terraform AWS 인증 정보 Setting

AWS Profile을 Terraform Provider에 적용하기

  • 우리는 Terraform에 AWS 인증 정보를 설정할 때, AWS Profile을 Terraform Provider에 적용하는 방법을 사용한다. 따라서 Jenkins에서 AWS Access Key와 Secret Key를 매개변수로 입력 받아 .aws/credentials 파일에 등록할 것이다
  • Terraform은 AWS Profile을 이용한 자격증명도 지원한다. Profile을 사용할 경우, Terraform이 자동으로 AWS Credential 파일인 ~/.aws/credentials 파일을 참조한다
  • 허나 이 방법은 Profile 공유가 어려우므로 다수의 사용자가 작업할 때는 적합하지 않은 방법이다

AWS Profile? AWS Credentials?

  • AWS credentials 파일에는 AWS Profile 인증 정보를 담을 수 있다. 파일에는 다수의 Profile 설정이 가능하다. 해당 파일은 AWS CLI에 의해 관리된다
  • AWS Profile이란? AWS에서 API 호출 시, 인증/인가와 같이 확인에 필요한 정보이다. Profile은 config와 credentials로 분류된다. Region / Role 과 같이 API를 요청한 주체에 대한 정보는 config에 있으며, 인증정보는 credentials에 있다

이외에도 Terraform에 AWS 계정 정보를 설정하는 방법은 여러가지 있다

참조 : https://banhawy.medium.com/3-ways-to-configure-terraform-to-use-your-aws-account-fb00a08ded5
1. main.tf에 직접 인증 정보 기입
2. Terraform이 설치된 Node에 환경 변수로 기입 ( AWS_ACCESS_KEY_ID , AWS_SECRET_ACCESS_KEY )
3. AWS Profile 사용
4. 인증 정보가 기입된 File 사용


Jenkins Job 생성

  • 간단하게 Test 하기 위해 FreeStyle로 생성하자

  • 생성한 GitLab Connection을 선택하자
  • AWS Access Key와 Secret Key는 Job Build 할 때, 매개변수로 입력받도록 설정하자

  • 소스 코드 관리에서 레포지토리 주소, 사용할 GitLab Credential, Branch를 설정하자
  • Job Build 할 때, 해당 레포지토리/Branch에 저장된 리소스를 사용할 수 있다

export AWS_ACCESS_KEY_ID=$ACCESS_KEY
export AWS_SECRET_ACCESS_KEY=$SECRET_KEY
echo [default] | sudo tee /home/ec2-user/.aws/credentials
echo aws_access_key_id=$AWS_ACCESS_KEY_ID | sudo tee -a /home/ec2-user/.aws/credentials
echo aws_secret_access_key=$AWS_SECRET_ACCESS_KEY | sudo tee -a /home/ec2-user/.aws/credentials
terraform init && terraform apply --auto-approve
  • 작업 내용은 다음과 같다
  1. 입력 받은 Access Key 매개변수를 Jenkins 노드 환경 변수로 등록한다
  2. 우리는 AWS Profile을 Terraform AWS 인증 정보 설정에 사용하므로, ~/.aws/credientials 파일에 Profile 인증 정보를 입력한다. region의 경우, main.tf에 입력했으므로 따로 설정하지 않아도 된다
  3. 가져온 main.tf를 기반으로 Terraform 실행. auto approve 옵션을 사용 안하면, 작업 진행 여부를 물어봐서 Job Build가 중단되므로 필수로 사용해야 한다

Jenkins Job Build

  • 파라미터와 함께 빌드를 선택하자. AWS Access Key와 Secret Key를 입력하고, Build를 실행하자

  • Console OutPut을 통해 실행 결과 확인

  • AWS Console에 들어가서 확인하자. 잘 생성되었다
profile
멋진 엔지니어가 될 때까지

2개의 댓글

comment-user-thumbnail
2023년 7월 20일

감사합니다

답글 달기
comment-user-thumbnail
2023년 7월 20일

잘 봤습니다. 좋은 글 감사합니다.

답글 달기