이번 장에서 만들 파일들은 한경로에 넣어준다.
젠킨스 파이프 라인 스크립트
pipeline {
agent any
stages {
stage('Clone') {
steps {
script {
git branch: 'develop', credentialsId: 'ljh8651', url: 'https://github.com/sudosoo/ElasitcKafka'
}
}
}
stage('Build') {
steps {
script {
sh './gradlew clean bootJar'
}
}
}
stage('Deploy') {
steps {
script {
sshagent(credentials: ['ssh_key']) {
// 파일 전송
'scp -o StrictHostKeyChecking=no -P 포트 로컬_JAR파일경로/takeItEasy-0.0.1-SNAPSHOT.jar ssh접속ID@IP:/Jar파일_넣을경로/'
// 배포 스크립트 실행
'ssh -p 포트 SSH접속ID@IP /배포스크립트경로/deploy.sh'
}
}
}
}
}
}
젠킨스 설정이 끝났다면 Deploy 단계를 설정 해주어야한다.
Deply 과정에선 SSH 로 접속하여 파일을 수정, 스크립트 실행을 해야 하기 때문에 SSH에 접근할 공개키를 설정 해주어야 한다.
젠킨스 공개키 설정은 아래 링크를 확인해보자
stage('Deploy') {
steps {
script {
sshagent(credentials: ['ssh_key']) {
// 파일 전송
#'scp -o StrictHostKeyChecking=no -P 포트 build/libs/takeItEasy-0.0.1-SNAPSHOT.jar ssh접속ID@IP:/Jar파일_넣을경로/'
'scp -o StrictHostKeyChecking=no -P 5112 build/libs/takeItEasy-0.0.1-SNAPSHOT.jar sudosoo@16.23.50.22:/volume1/docker/springApp/'
// 배포 스크립트 실행
#'ssh -p 포트 SSH접속ID@IP /배포스크립트경로/deploy.sh'
'ssh -p 5112 ljh8651@16.23.50.22 /volume1/docker/springApp/deploy.sh'
}
}
}
}
Blue Green 두개의 서버를 만들어주는 docker-compose 파일을 만들어야한다.
1. Build 단계에서 업데이트된 JAR파일 경로에 복사하기
'scp -o StrictHostKeyChecking=no -P 5112 build/libs/takeItEasy-0.0.1-SNAPSHOT.jar sudosoo@16.23.50.22:/volume1/docker/springApp/'
빌드 완료된 JAR 파일을 deply.sh 스크립트가 있는곳으로 복사해준다.
2. deploy.sh 스크립트 작성 및 파일 생성
'ssh -p 5112 ljh8651@16.23.50.22 /volume1/docker/springApp/deploy.sh'
was서버로 만들 서버에 접속하여 deply.sh 파일을 실행시켜준다.
해당 서버에 설치가 되어있어야할 것들
- NginX
- Docker
- Docker-compose
Nginx로 Blue 서버와 Green 서버를 교체해준다.
docker-compose 파일 생성
docker-compose.blue.yml
version: '3.1'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- '9090:8080'
networks:
default:
external:
name: service-network
docker-compose.green.yml
version: '3.1'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- '9091:8080'
networks:
default:
external:
name: service-network
8080으로 올라오는 spring 서버를 9090 / 9091로 붙여준다.
이미지는 전 글에서 만든 Dockerfile과 Jar파일을 이용하여 이미지를 만들고 docker-copose로 컨테이너를 올리는 동작이다.
deploy.sh 중요 !!
#1
EXIST_BLUE=$(docker-compose -p spring-blue -f docker-compose.blue.yaml ps | grep Up)
if [ -z "$EXIST_BLUE" ]; then
docker-compose -p spring-blue -f /volume1/docker/springApp/docker-compose.blue.yaml up -d
BEFORE_COLOR="green"
AFTER_COLOR="blue"
BEFORE_PORT=9091
AFTER_PORT=9090
else
docker-compose -p spring-green -f /volume1/docker/springApp/docker-compose.green.yaml up -d
BEFORE_COLOR="blue"
AFTER_COLOR="green"
BEFORE_PORT=9090
AFTER_PORT=9091
fi
echo "${AFTER_COLOR} server up(port:${AFTER_PORT})"
# 2
for cnt in {1..10}
do
echo "서버 응답 확인중(${cnt}/10)";
UP=$(curl -s http://localhost:${AFTER_PORT}/api/check)
if [ -z "${UP}" ]
then
sleep 10
continue
else
break
fi
done
if [ $cnt -eq 10 ]
then
echo "서버가 정상적으로 구동되지 않았습니다."
exit 1
fi
# 3
echo "NginX Setting..."
docker exec -it nginx1 /bin/bash -c "sed -i 's/${BEFORE_PORT}/${AFTER_PORT}/' /etc/nginx/conf.d/include/service_url.conf && nginx -s reload"
echo "Deploy Completed!!"
# 4
echo "$BEFORE_COLOR server down(port:${BEFORE_PORT})"
docker-compose -p spring-${BEFORE_COLOR} -f docker-compose.${BEFORE_COLOR}.yaml down
#1
spring-blue 컨테이너가 올라와 있으면 if 분기문으로 green을 올릴 준비를 한다.
변수 설정 및 [docker-compose.반대색상.yml] 파일 실행
#2
컨테이너가 올라갔다면 WAS서버가 올라가서 올라갔는지 check 하는 api에게 요청을 보낸다.
curl -s http://localhost:${AFTER_PORT}/api/check
ssh를 접속하여 curl 로 요청을 보내면 check 라는 메세지가 나온다.
@RestController
@RequestMapping("/api")
public class ProfileController {
@GetMapping("/check")
public String checkServerStatus(){
return "check";
}
}
#3
NginX를 이용해서 blue(9090)와 연결되어있는 포트를 green(9091)으로 변경 해준다.
docker exec -it nginx1 /bin/bash -c "sed -i 's/${BEFORE_PORT}/${AFTER_PORT}/' /etc/nginx/conf.d/include/service_url.conf && nginx -s reload"
sed를 사용하여 '/etc/nginx/conf.d/service_url.conf' 파일에서 ${BEFORE_PORT} 변수가 포함된 모든 텍스트를 ${AFTER_PORT} 변수 값으로 변경한다는 의미이다. 이를 통해 Nginx에서 사용하는 포트 번호를 변경할 수 있다.
vi 에디터로 service_url.conf 파일을 만들어준다.
vi /etc/nginx/conf.d/include/service_url.conf
set $service_url 127.0.0.1:9090;
위의 환경 변수는 나중에 deploy시 셸 스크립트에서 사용된다.
블루에서 그린으로 혹은 그린에서 블루로 스위칭할 때, 동적으로 주소를 변경해주는 역할을 한다.
vim /etc/nginx/sites-available/default 명령어로 Nginx의 proxy 설정을 편집해 준다.
필자는 NPM(NginX Proxy Manager)을 사용해서 경로가 조금 다르다
NPM config파일 위치는 data/nginx/proxy_host/x.conf -> x는 해당 프록시서버 순서번호이다.
/etc/nginx/conf.d/include/service_url.conf
add_header X-Served-By $host;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Scheme $scheme;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass $forward_scheme://$server:9091$request_uri;
3번 처음에 설명한 곳 sed를 사용해서 $ server:9091 < 해당 포트를 바꿔서 컨테이너를 스위치 시켜준다.
설정을 변경 한 후에는 nginx -s reload 로 설정을 적용시켜준다.
#4
docker-compose -p spring-${BEFORE_COLOR} -f docker-compose.${BEFORE_COLOR}.yaml down
이전 컨테이너를 docker-compose로 내려(삭제) 준다.
참고 문헌
https://sihyung92.oopy.io/e5300d92-1a4e-40f4-b927-a93b2bbb17d2
'개-발 > Infra' 카테고리의 다른 글
[Kafka + SSE] 실시간 알림 메세지 구현 (0) | 2024.01.10 |
---|---|
[Docker + NginX + Jenkins] Jenkins pipline verbose 옵션 CICD번외 편 (0) | 2023.12.13 |
[Docker + NginX + Jenkins] Spring 프로젝트 Blue,Green 무중단 배포 CI CD 1/2 (2) | 2023.11.28 |
[Docker] SpringBoot 프로젝트 올리기 (2) | 2023.11.28 |
[NginX] docker NginX (NPM) 역방향프록시 설정 NAS 2 (1) | 2023.11.25 |