울반 프로젝트의 아키텍처!!!
해당 아키텍처에서 Blue-Green 무중단 배포 과정을 정리합니다.
이제 이 글을 끝까지 보신다면 Gitlab, Jenkins, Docker, Docker Hub, Nginx 활용한 Blue-Green 무중단배포를 할 수 있게 되실겁니다...
거두절미하고 바로 들어가볼까요?
먼저 EC2 서버가 있어야겠죠?
혹시나 EC2 서버가 없으시다면 아래 링크를 보고 서버 구축을 먼저 해주세요!
AWS EC2 서버 구축하기
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
# 업데이트
sudo apt update
# 업그레이드
sudo apt upgrade
# 특정 버전 목록 조회
sudo apt list openjdk-[버전]*
# 설치
sudo apt install openjdk-[버전]-jdk
# 설치 확인
java --version
# 의존성 설치
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
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
간혹 Jenkins 설치가 안되는 경우가 있습니다.
설치가 안되면 아래 링크를 참조해주세요!
젠킨스 에러 완벽 해결
Nginx란?
웹 서버 소프트웨어로, 웹 콘텐츠를 인터넷을 통해 사용자에게 전달하는 역할을 합니다. 또한, 리버스 프록시, 로드 밸런서, 메일 프록시 등 다양한 기능을 수행할 수 있는 매우 강력한 도구입니다.
sudo apt update
sudo apt upgrade
sudo apt install nginx
sudo service nginx start
sudo service nginx status
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
토큰 먼저 발급 받아볼까?
Setting > Access Tokens > Add new token > 로컬에 토큰 Copy
아니 근데 잠깐만.. 나는 왜 Setting 이 없지???
그런 사람들
Manage > Member > 권한 확인하고 Maintainer 권한 달라고 하세용
Gitlab 다운로드 먼저 해야지?
Dashboard > jenkins 관리 > Plugins
Available plugins > gitlab 검색 후 다운
(저는 이미 다운 받아서 검색창에 없어영)
아 이 양반 또 장난치네?
그만 좀 괴롭혀라 진짜로...
하지만, 걱정마라 그냥 계속 재시도하면 된다..!!!
Credentials > global > Add credentials
Kind: GitLab API token
Scope: Global
API token: [앞서 발급한 gitlab access token]
ID: [원하는 ID값]
Kind: Username with password
Scope: Global
Username: [깃랩 아이디]
Password: [깃랩 비밀번호]
Dashboard > Jenkins 관리 > System > GitLab 부분 입력란
Connection name: [원하는 connection name] Ulvan
Gitlab host URL: [깃랩이 설치된 URL] --> https://lab.ssafy.com/
Credentials: [앞서 생성한 GitLab API token]
Test Connection > Success 확인 > 저장
Dashboard > All > New Item
Name : ProjectName
Pipline Check > Create
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 해두시고 !!
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 !'
}
}
}
}
}
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 :
^(브랜치명|브랜치명|브랜치명)$
자... 이제 Push event 눌러보자
설마 이것까지 알려달라는건 아니겠지???!!!!!
개발자라면 에러 로그 정도는 보고 고칠 수 있자나?
이제 본격적으로 Docker 를 이용해서 무중단 배포를 하러 가볼까요?
다음 편에서 보자고요ㅋ