ASAP 프로젝트의 마지막 단계인 젠킨스와 도커를 활용한 CI/CD를 진행하려고 한다.
젠킨스 EC2-Ubuntu와 운영 서버 EC2-Ubuntu를 나눠 관리하여 총 2대의 EC2 인스턴스를 사용하였다.
젠킨스 EC2 세팅
1. EC2 젠킨스 설치
1
2
| wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
|
GPG 에러 발생 시
GPG error: https://pkg.jenkins.io/debian-stable binary/ Release: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY {16자리 PUBKEY}
해당 에러는 패키지 설치 과정에서 PUBKEY가 등록되지 않아 발생하는 오류이다. 위 에러메세지의 PUBKEY를 복사한 후 아래 key등록 명령어를 입력한다.
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys {16자리 PUBKEY}
2. 젠킨스 업데이트 및 재시작
1
2
3
| sudo apt-get update
sudo apt-get upgrade jenkins
sudo systemctl restart jenkins
|
3. 젠킨스 실행 확인
1
| sudo systemctl status jenkins
|
4. 젠킨스 비밀번호 확인
1
| sudo cat /var/lib/jenkins/secrets/initialAdminPassword
|
5. <젠킨스 EC2의 퍼블릭 IPv4 DNS>:8080 접속 후 비밀번호 입력
젠킨스에 GitHub 권한 부여
1. 젠킨스 EC2에서 SSH 키 발급
1
2
| sudo mkdir /var/lib/jenkins/.ssh
sudo ssh-keygen -t -rsa -f /var/lib/jenkis/.ssh/{SSH_키_이름}
|
2. 발급받은 SSH 공개키
복사
- 생성한 키 이름 뒤에
.pub
이 붙어있다면 공개키 - 생성한 키 이름 뒤에 아무것도 없다면 비밀키
1
| cat ~/.ssh/{SSH_키_이름}.pub
|
3. 배포 원하는 GitHub Repository에 SSH 공개키 등록
- Settings → Deploy keys → Add deploy key
- Title : 본인이 원하는 식별가능한 값
- Key : 2번에서 복사한 키 붙여넣기
4. 젠킨스 Credential 설정
cat ~/.ssh/{SSH_키_이름}
으로 나오는 SSH 비밀키 복사
1
2
3
| -----BEGIN OPENSSH PRIVATE KEY-----
비밀키
-----END OPENSSH PRIVATE KEY-----
|
- <젠킨스 EC2의 퍼블릭 IPv4 DNS>:8080 접속
- Jenkins관리 → Manage Credentials → Stores scoped to Jenkins의 Domains 하단
(global)
에서 Add credentials 선택- Kind :
SSH Username with private key
선택 - ID : 본인이 원하는 식별가능한 Credential ID 입력
- Private Key : Add → 복사한 SSH 비밀키 입력
젠킨스 EC2와 운영서버 EC2 연결
1. 젠킨스 EC2에서 SSH pem 키 발급
1
| ssh-keygen -t rsa -C "키_이름" -m PEM -P "" -f /var/lib/jenkins/.ssh/{키_이름}
|
2. 발급받은 SSH pem 공개키
복사
1
| sudo cat /var/lib/jenkins/.ssh/{키_이름}.pub
|
3. 운영서버 EC2
에 pem키 등록
1
| sudo nano .ssh/authorized_keys
|
4. 젠킨스 EC2에서 발급받은 pem의 비밀키 복사
1
| sudo cat /var/lib/jenkins/.ssh/{키_이름}
|
5. <젠킨스 EC2의 퍼블릭 IPv4 DNS>:8080 접속
6. Jenkins 관리 → 플러그인 관리 → Available plugins
- Publish Over SSH 검색 후 설치
- Jenkins 관리 → Configure System → Publish Over SSH
- Path to key : SSH 보관 경로 (ex.
/var/lib/jenkins/ssh/{폴더명}
) - Key : 복사한 pem 비밀키 붙여넣기
7. SSH Server 추가
- Name : SSH 서버명
- Hostname : 운영서버 IP 주소
- Username : 운영서버의 유저명 (필자는 유저를 따로 생성하지 않아
ubuntu
로 작성했다.)
이후 Test Configuration 클릭으로 연동테스트해서 Success가 뜨면 성공한거다.
Docker 설치 및 빌드
1. 젠킨스 EC2 apt 업데이트
2. 젠킨스 EC2에 아래 명령어 입력
1
| sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
|
apt-transport-https
: HTTPS를 통해 APT 패키지 전송에 사용되는 패키지ca-certificates
: 인증서 관련 패키지gnupg-agent
: GnuPG 패키지oftware-properties-common
: 소프트웨어 소스 관리 패키지
즉, HTTPS를 통해 안전한 패키지를 다운로드하고, SSL/TLS 인증서를 받을 수 있도록 도와주는 패키지, GPG키 설정 위한 패키지를 다운받는 명령어이다.
3. Docker GPG 키 추가 및 설치
1
2
3
| curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - // Docker GPG 키 추가
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" // Docker Repository 추가
sudo apt-get install docker-ce docker-ce-cli containerd.io // Docker Ce 설치
|
4. Docker 그룹에 젠킨스 유저 추가
1
2
| sudo usermod -aG docker {user} // 현 젠킨스 EC2 사용자 입력
su - {user}
|
5. 그룹에 잘 추가되었는지 확인
6. Docker 서버와 Docker 클라이언트 간의 통신 위한 .sock
권한 변경
1
| sudo chmod 666 /var/run/docker.sock
|
7. Docker 로그인
1
2
| sudo su - {user}
docker login
|
- Docker Hub의 아이디와 비밀번호를 입력하면 된다.
8. <젠킨스 EC2의 퍼블릭 IPv4 DNS>:8080 접속 후 item 생성
- 필자는 운영서버에서 이미 Redis가 실행 중이었기에 하나의 이미지만 빌드하고 배포하면 되었다.
- 보다 많은 이미지 빌드를 해야한다면 Pipeline으로 생성해야하지만 더 간편한
Freestyle project
로 생성하였다.
9. 생성한 프로젝트 → 소스 코드 관리
에서 GitHub Repository 설정
- Git 선택 → URL 작성
- Credentials : 아까 생성한 GitHub Credentials 선택
- Branch Specifier : main 혹은 배포할 브랜치를 작성한다. 필자는 프론트엔드와 같은 Repository를 사용하기에 다른 브랜치를 지정해줬다. (Ex. */bedev)
10. 빌드 환경
설정
1
2
3
4
| sudo docker pull {Docker_허브_유저명}/{Docker_허브_Repo명}
sudo docker stop {컨테이너_이름} || true && sudo docker rm {컨테이너_이름} || true
sudo docker run -d --name {컨테이너_이름} -p 8080:8080 {Docker_허브_유저명}/{Docker_허브_Repo명}:{버전}
|
11. Build Steps
설정
- Execute shell에 명령어를 입력한다. (Add build step을 클릭하여 Execute shell을 추가할 수 있다.)
1
2
3
| sudo chmod +x ./be/gradlew // 프로젝트 gradlew에 권한 부여
cd /var/lib/jenkins/workspace/{Repository_이름}/{프로젝트_저장된_폴더} // 프로젝트 위치로 이동
./gradlew clean build
|
1
2
| sudo docker build -t {Docker_허브_유저명}/{Docker_허브_Repo명} -f /{Repository_이름}/Dockerfile . // 이미지 빌드
sudo docker push {Docker_허브_유저명}/{Docker_허브_Repo명} // 도커 허브로 푸시
|
자동배포 설정
1. <젠킨스 EC2의 퍼블릭 IPv4 DNS>:8080 접속
2. Jenkins 관리 → 플러그인 관리 → Available plugins
3. 프로젝트
→ 빌드 유발
GitHub hook trigger for GITScm polling
체크
4. Github 프로젝트 → Settings → Webhooks → add Webhook
- Payload URL :
{젠킨스EC2_URL}:{젠킨스_포트번호}/github-webhook/
- Content type :
application/json