Gitlab, Jenkins, Docker, Docker Hub, Nginx, Blue-Green 무중단배포 CI/CD 구축 - 1

2.5*2 하빈·2024년 5월 23일
41
post-thumbnail

울반 프로젝트의 아키텍처!!!
해당 아키텍처에서 Blue-Green 무중단 배포 과정을 정리합니다.

  • SSAFY 프로젝트를 진행하면서 3번 다 인프라를 담당했습니다.
    처음 인프라 담당했을 때가 떠오르네요..
    CI/CD 배포에 대한 지식이 너무나 얕아서 너무나도 막막했던 그때 그 심정...

이제 이 글을 끝까지 보신다면 Gitlab, Jenkins, Docker, Docker Hub, Nginx 활용한 Blue-Green 무중단배포를 할 수 있게 되실겁니다...


거두절미하고 바로 들어가볼까요?
먼저 EC2 서버가 있어야겠죠?
혹시나 EC2 서버가 없으시다면 아래 링크를 보고 서버 구축을 먼저 해주세요!
AWS EC2 서버 구축하기


  • 자 들어가봅시다!~!~!!!

1 - Swap 메모리 설정

  • Jenkins 서버에서 여러 빌드를 동시에 처리하는 경우 Swap 메모리는 물리적 메모리가 가득 차더라도 추가 작업을 수행할 수 있게 도와줍니다.

  • Swap 메모리 크기는 물리적 메모리의 1.5배에서 2배 사이가 일반적인 권장 사항이라고 하는데, 적절하게 설정하면 될 듯 합니다.

스왑 메모리 설정
// swap 파일을 생성해준다. 
// (메모리 상태 확인 시 swap이 있었지만 디렉토리 파일은 만들어줘야한다.)
sudo mkdir /var/spool/swap
sudo touch /var/spool/swap/swapfile
sudo dd if=/dev/zero of=/var/spool/swap/swapfile count=4096000 bs=1024

// swap 파일을 설정한다.
sudo chmod 600 /var/spool/swap/swapfile
sudo mkswap /var/spool/swap/swapfile
sudo swapon /var/spool/swap/swapfile

// swap 파일을 등록한다.
sudo echo '/var/spool/swap/swapfile none swap defaults 0 0' | sudo tee -a /etc/fstab

// 메모리 상태 확인
free -h

2 - JDK 설치

  • 버전에 맞는 JDK를 설치하자
# 업데이트
sudo apt update

# 업그레이드
sudo apt upgrade

# 특정 버전 목록 조회
sudo apt list openjdk-[버전]*

# 설치
sudo apt install openjdk-[버전]-jdk

# 설치 확인
java --version

3 - Docker 설치

# 의존성 설치
sudo apt update
sudo apt install ca-certificates curl gnupg lsb-release

# 레포지토리
sudo mkdir -p /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 레포지토리 추가
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# 도커 설치하기
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin

참고로 도커가 이미 설치가 되어있었다면 아래 명령어를 입력하고,
다시 설치하자

# 문제가 되었던 도커를 제거
sudo apt remove docker docker-engine docker.io containerd runc

4 - jenkins 설치

  • Docker outside of Docker(DooD) 방식으로 Jenkins Container를 띄우자~!!~!!!

DooD란 ?
Jenkins를 백그라운드에서 실행하면서, Jenkins 컨테이너가 호스트 시스템의 Docker 환경을 제어할 수 있도록 설정합니다.

이는 Jenkins에서 Docker 기반의 빌드나 테스트 환경을 직접 관리하고 조작할 수 있게 하는 일반적인 구성 방식으로, "Docker in Docker"(DinD) 또는 "Docker outside of Docker"(DooD) 방식 중 "DooD" 방식에 해당한다.

Jenkins에서 Docker 컨테이너를 직접 실행하고 관리할 수 있게 하여, 복잡한 CI/CD 파이프라인을 구현할 때 매우 유용하다!!

# 도커 소켓 마운트 하기 (젠킨스 컨테이너에서 도커 명령어 실행되도록 하기)
docker run -itd --name jenkins -p 9005:8080 -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker jenkins/jenkins:jdk21

# 도커 명령어가 젠킨스에서 실행이 안되거나 권한 오류가 나면 아래 명령어 실행
sudo chmod 666 /var/run/docker.sock

# 젠킨스 컨테이너 비밀번호 확인 명령어
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword

# 젠킨스 컨테이너로 접속해서 도커 명령어 실행 여부 확인 명령어
docker exec -it <container_name_or_id> /bin/bash
docker exec -it jenkins /bin/bash

# 젠킨스 컨테이너에 접속해서 Docker 명령어 되는지 확인
docker

4 - 1 Jenkins 접속

  • 설치된 9005 Port로 접속하여 Jenkins 를 설치하여 접속을 해봅니다.

간혹 Jenkins 설치가 안되는 경우가 있습니다.
설치가 안되면 아래 링크를 참조해주세요!

젠킨스 에러 완벽 해결


5 - Nginx 설치

Nginx란?
웹 서버 소프트웨어로, 웹 콘텐츠를 인터넷을 통해 사용자에게 전달하는 역할을 합니다. 또한, 리버스 프록시, 로드 밸런서, 메일 프록시 등 다양한 기능을 수행할 수 있는 매우 강력한 도구입니다.

sudo apt update
sudo apt upgrade
sudo apt install nginx
sudo service nginx start
sudo service nginx status

6 - https 설정 (SSL)

  • Let's Encrypt를 사용하는 방법과 Symantec, Comodo, GeoTrust 등과 같은 상업 인증 기관에서 SSL 인증서를 구매하여 사용하는 방법이 있습니다.

  • 무료로 사용할 수 있는 Let's Encrypt를 사용하겠습니다.

#Encrypt 설치
sudo apt-get install letsencrypt

#Certbot 설치
sudo apt-get install certbot python3-certbot-nginx

#Certbot 동작 (nginx 중지하고 해야함)
sudo certbot --nginx
1번 방법 sudo certbot --nginx -d [도메인 혹은 ip 주소]
2번 방법 sudo letsencrypt certonly --standalone -d [도메인 혹은 ip 주소]
# 옵션 1번 선택
# 강제 리다이렉트 설정 부분에서 안한다고 함(1번 선택) http 와 https 같이 쓰는거임 

nginx 설정 적용
sudo service nginx restart
sudo systemctl reload nginx

7 - Jenkins, gitLab webhook 설정

7-1 Gitlab Token 발급

  • 먼저 Gitlab 으로 이동하자

토큰 먼저 발급 받아볼까?

Setting > Access Tokens > Add new token > 로컬에 토큰 Copy

아니 근데 잠깐만.. 나는 왜 Setting 이 없지???

그런 사람들

Manage > Member > 권한 확인하고 Maintainer 권한 달라고 하세용


7-2 Jenkins Gitlab Plugin Down

  • 자 이제 Jenkins로 이동하자

Gitlab 다운로드 먼저 해야지?

Dashboard > jenkins 관리 > Plugins


Available plugins > gitlab 검색 후 다운

(저는 이미 다운 받아서 검색창에 없어영)


  • Gitlab 다운로드가 안되는 경우가 있다

아 이 양반 또 장난치네?

그만 좀 괴롭혀라 진짜로...

하지만, 걱정마라 그냥 계속 재시도하면 된다..!!!


7-3 GitLab API token Credentials 등록

Credentials > global > Add credentials



Kind: GitLab API token
Scope: Global
API token: [앞서 발급한 gitlab access token]
ID: [원하는 ID값]


7-4 GitLab ID, PW 등록

Kind: Username with password
Scope: Global
Username: [깃랩 아이디]
Password: [깃랩 비밀번호]


7-5 GitLab - Jenkins 연결 확인

Dashboard > Jenkins 관리 > System > GitLab 부분 입력란


Connection name: [원하는 connection name] Ulvan
Gitlab host URL: [깃랩이 설치된 URL] --> https://lab.ssafy.com/
Credentials: [앞서 생성한 GitLab API token]

Test Connection > Success 확인 > 저장


7-6 New Item pipline 생성


Dashboard > All > New Item

Name : ProjectName
Pipline Check > Create


7-7 pipline Test Script 작성

Dashboard > [ProjectName] > Configuration (구성)


  • Build Triggers
    Build when a change is pushed to GitLab. GitLab webhook URL: [Gitlab URL:9005/project/ProjectName]
    Click!!!

  • 나머지 체크 박스는 팀원끼리 상의 후 원하는거 체크


  • 그대로 스크롤내려서 고급 눌러주시고~

Secret token 발급 받아주시고!~!!~!!
Copy 해두시고 !!


  • 이제 진짜 Script 작성해볼까?

git branch : 브랜치 경로
credentialsId : 7-4 GitLab ID, PW 등록 부분에서 ID로 설정한 이름
url : gitlab 프로젝트 경로

pipeline {
	agent any
	stages {
	    stage('Git Clone'){
            steps {
                git branch: '[브랜치경로]', credentialsId: 'GitLab_Login', url: 'https://example.com/test/Project.git'
            }
            post {
                failure {
                  echo 'Repository clone failure !'
                }
                success {
                  echo 'Repository clone success !'
                }
            }
	    }
	}
}

7-8 Gitlab Webhook Add

  • 다시 Gitlab 으로 돌아가자

WebHook 등록해보자잇

Setting > Webhook > Add new webhook


URL: (jenkins build Triggers에 있음)

Secret Token: (jenkins build Triggers 체크한거 고급 누르고 가장 마지막에 Token 발급 받은거 입력)

Trigger :
Push evenet & Merge request events Click
Wildcard pattern :
^(브랜치명|브랜치명|브랜치명)$


8 - Webhook Test

자... 이제 Push event 눌러보자


  • Build History에 이렇게 성공한 것을 볼 수 있다!


8-1 Webhook Test 에러 시

  • Console Output 들어가서 에러 로그보고 수정하세요..

설마 이것까지 알려달라는건 아니겠지???!!!!!

개발자라면 에러 로그 정도는 보고 고칠 수 있자나?

이제 본격적으로 Docker 를 이용해서 무중단 배포를 하러 가볼까요?

다음 편에서 보자고요ㅋ

profile
끝내주는 남자

0개의 댓글