사내에서 Terraform을 도입하며, CI/CD를 구축하고자 했다.
이번에 Jenkins도 도입되었기 때문에, GithubAction보다는 Jenkins를 선택했다.
목적은 다음 그림과 같은 Flow를 생성하는 것이다.


DynamoDB, S3를 사용한 이유는 이렇다.
Terraform init을 하게 되면, terraform.tfstate 파일이 생성된다.
이 파일을 통해 코드가 변경되었을 때 Cloud 자원에 어떤 수정 사항이 생길지 결정하는 것이다.
# backend.tf
terraform {
backend "s3" {
bucket = "mh-tfstate"
key = "security_group/mh_d_apnortheast2/terraform.tfstate"
region = "ap-northeast-2"
encrypt = true
dynamodb_table = "terraform-lock-mh"
}
}
그럼 이제 시작해보자.
우선, Jenkins가 수신할 수 있게끔 Web Hook을 설정해야 한다.
Project - Settings - Webhooks - Add webhook

Payload URL : https://<jenkins-domain>/github-webhook/
Content type : application/json
Let me select individual events : Pull requests

이렇게 하면, Pull Request가 Open, Close 될 때마다 해당 Web Hook을 실행한다.
실행 내역을 보고 싶다면, Webhook을 클릭한 뒤 상단의 Recent Deliveries에서 확인할 수 있다.
WebHook 수신을 위해서는 443 포트 인바운드가 다음 IP 대역에서 허용되어 있어야 한다.
["192.30.252.0/22", "185.199.108.0/22", "140.82.112.0/20", "143.55.64.0/20"]
Github의 Web Hook 설정이 끝났다면, 이제 Jenkins Pipeline을 생성할 차례이다.
우선 Plugin 설치가 필요하다.
Configure 설정
General
Triggers
Pending된 PR 상태

Pipeline
Definition : Pipeline script from SCM ( 해당 설정은 프로젝트 디렉토리에서 jenkinsfile을 찾는다. )
SCM : Git
Repository URL : https://github.com/Test/Terraform.git
Credentails : 해당 디렉토리의 권한이 있는 Credentails 선택.
정답은 main에 test가 merge된 브랜치이다.
github는 PR 생성 시 가상 브랜치를 만든다. ( refs/pull/<PR-Num>/merge )
Repositories의 고급 설정에서 다음과 같이 설정한다.

그러면, branch를 main에 test가 머지된 가상의 branch로 checkout 하게 된다.
General
- ✅GitHub project
- project url : https://github.com/Test/Terraform/
Trigger
- GitHub Pull Requests
- Trigger Mode
- Hooks with Persisted Data
- ✅Set status before build
- Trigger Events : Pull Request Opened
Pipeline
- Definition : Pipeline script form SCM
- SCM : Git
- Repositories
- Repository URL : https://github.com/Test/Terraform.git
- Credentails : (Select)
- 고급
- Refspec : +refs/pull/${GITHUB_PR_NUMBER}/head:refs/remotes/origin/pr/${GITHUB_PR_NUMBER}
- Branches to build : origin/pr/${GITHUB_PR_NUMBER}
이제 모든 설정이 끝났으니, 다음 시간에는 Jenkins File을 작성하며 Pipeline을 만들어보자 !