๋ฌด์ค๋จ ๋ฐฐํฌ ์ด๋ก ์ ๋ํด์ ํ์ต์ ํ์๊ณ , ๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ์ด์ ์ค์ตํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋ก ์ ๊ดํด์๋ ์๋ ํฌ์คํ
์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
https://programmer-may.tistory.com/209
๋ฌด์ค๋จ ๋ฐฐํฌ(Zero-downtime Deployment) ์ ๋ต
๐ฉ๊ฐ์๋ค์ด ํ์(Downtime)์ ์์คํ , ์๋ฒ, ๋คํธ์ํฌ, ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ์๋น์ค๊ฐ ์ ์์ ์ผ๋ก ์๋ํ์ง ์๋ ์๊ฐ์ ์๋ฏธํฉ๋๋ค. ์ฆ, ์ฌ์ฉ์๊ฐ ํด๋น ์์คํ ์ด๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ ์ ์๋ ์ํ๋ฅผ
programmer-may.tistory.com
๋ณธ ์ค์ต์์ ๋ฌด์ค๋จ ๋ฐฐํฌ ์งํ ๊ณผ์
์ ๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ต์ ์๋์ ๊ฐ์ด ์งํ๋์ต๋๋ค. ์ต์ํ์ ๊ธฐ์ ๋ก ๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ์ฒ์ ๋์ ํด๋ณด๋ ์ค์ต์์๊ฒ ๋ถ๋ด์์ด ๋ค๊ฐ๊ฐ ์ ์๊ฒ ํ์์ต๋๋ค. ๋์ปค๋ฅผ ํจ๊ปํด์ ๋์ปค ์ด๋ฏธ์ง๋ฅผ ๋ฐ๊ฟ ์๋ ์์ง๋ง, ๋ฌ๋ ์ปค๋ธ๋ฅผ ์ต์ํ์ผ๋ก ํ๊ฒ ํ๋ ๊ฒ์ด ๋ชฉํ์์ต๋๋ค. ์ด๋ ค์์ ์ต๋ํ ๋๋ ํํํ์ ๊ฐ๋๋ก ์ ์ ๊ธฐ์ค์์ ์ต์ํ์ผ๋ก ํ์ํ ๊ธฐ์ ๋ค์ ์ ์ฉํด ๋ณด์์ต๋๋ค.
1. Github Actions : ์ก์ ์ค๋ฅผ ํ์ฉํ์ฌ ์๋ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ์๊ณ , cicd๋ฅผ ํตํด์ ๋ฌด์ค๋จ ๋ฐฐํฌ ๋์ ์ ์ ์ง์ jar ํ์ผ์ ๋๋ ํ ๋ฆฌ๋ก ์ฎ๊ธฐ๊ณ , jar ํ์ผ์ ์คํ ์์ผฐ์ต๋๋ค. ๋ฌด์ค๋จ ๋ฐฐํฌ ๋์ ํ์ AWS EC2 ํน์ ๋๋ ํ ๋ฆฌ ์์ deploy.sh ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋์ด Github Actions ์ ํตํด cd yml ํ์ผ์์ ๋ช ๋ น์ด๋ก ๊ทธ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋๋ก ํ์์ต๋๋ค.
2. Sell Script : ์ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ฉํ์ฌ, ๋ฐฐํฌ ๋ฐ ํฌ์ค ์ฒดํฌ๋ฅผ ์งํํ๊ณ , ๋กค๋ฐฑ ๋ํ ๊ฐ๋ฅํ๋๋ก ํ์์ต๋๋ค. ๋ํ ์์ง์์ค์ ์ค์ ํ์ผ์ ๋์ ์ผ๋ก ๋ฐ๊พธ์ด ํธ๋ํฝ์ ์ ๋ฒ์ ์ด ์คํ๋ ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก ๋ฐ๊พธ๊ฑฐ๋ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ์ค์ ์ ๋์ ์ผ๋ก ๋ณํ์์ผ์คฌ์ต๋๋ค.
3. Nginx : ์์ง์์ค์ /etc/nginx/sites-available/default ํ์ผ์ ๋์ ์ผ๋ก ๋ณํ์์ผ ๋ก๋ ๋ฐธ๋ฐ์ฑ์ ๋ฌด์ค๋จ ๋ฐฐํฌ ์ ๋ต์ ๋ง๊ฒ ๋ฐ๊พธ์์ต๋๋ค. ์์ง์์ค์ SSL Termination ๊น์ง ์ ์ฉํ๋ ค๋ฉด ๋๋ฉ์ธ๋ ์์ด์ผ ํ๊ณ , ๊ณผ์ ์ด ๋ณต์กํ์ฌ HTTPS ๊ฐ ์๋ HTTP ์์ฒญ์ ๊ธฐ์ค์ผ๋ก๋ง ์งํํ์์ต๋๋ค. Nginx ์์ SSL Termination ๊น์ง ์งํํ๊ณ ์ถ์ผ์ ๋ถ์ ์ ๋ธ๋ก๊ทธ์ Nginx ๊ตฌ์ถ ํฌ์คํ ์ ์ฐธ๊ณ ํด์ฃผ์ธ์!
4. Spring Boot : ๊ธฐ๋ณธ์ ์ผ๋ก 8081 ํฌํธ์ ๊ตฌ๋ฒ์ ์ด, 8082ํฌํธ์ ์ ๋ฒ์ ์ดํ๋ฆฌ์ผ์ด์
๊ตฌ๋ ๋๊ณ ์ค์ ํ๊ณ , ๋กค๋ง ์ ๋ต ๊ฒฝ์ฐ ๋ ํฌํธ ๋ชจ๋์์ ๊ตฌ ๋ฒ์ , ์ ๋ฒ์ ์ด ๋์๊ฐ๊ฒ๋ ํ์ต๋๋ค.
ํฌ์ค ์ฒดํฌ๋ก๋ Spring actuator ์์กด์ฑ์ ๋ฐ์, {http:// EC2 ํผ๋ธ๋ฆญ IP }:{ํฌ์ค ์ฒดํฌ ํ๋ ค๋ ํฌํธ๋ฒํธ}/autator/health ๋ฅผ ํตํด ์๋ต์ด ์ ์ค๋ ์ง ํ์ธํ์์ต๋๋ค.
5. Termius : SSH Client ๋ก๋ Termius ๋ฅผ ํ์ฉํ์ต๋๋ค. ์๋๋ MobaXterm ์ ์ฌ์ฉํ์ง๋ง, ์ ์์ฑ ์ ์ฝ๋ ๋ ์์ ์ปดํจํฐ OS ๊ฐ Window ๊ฐ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉ์ด ๋ถ๊ฐ๋ฅ ํ๊ธฐ์, macOS, Window ๋๊ฐ์ง OS ๋ชจ๋ ์ง์ํ๋ ํด์ ์ฌ์ฉํ์ต๋๋ค.
Termius ๋ฅผ ํ์ฉํ์ฌ CLI ๋ก JDK ์ ์์ง์์ค๋ฅผ ์ค์นํ๊ณ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ , deploy.sh ํ์ผ๋ ์์ฑํ์์ต๋๋ค.
6. Apache JMeter : ํ ์คํ ํด๋ก๋ ์ํ์น ์ ์ด๋ฏธํฐ๋ฅผ ํ์ฉํ์ต๋๋ค. ์ ์๊ฒ ์ต์ํ๊ธฐ๋ ํ๊ณ , simple http request ํ ํ๋ฆฟ๋ ์ง์ํด์ฃผ๊ธฐ์ ์ฌ์ฉํ์ต๋๋ค. {ํธ์คํธ ์ฃผ์}/hello ์์ฒญ์ ์ง์์ ์ผ๋ก ๋ณด๋ด์ด ์๋ต๊ฐ์ ํ์ธ ํ์ฌ, ์ ๋๋ก ๋ฌด์ค๋จ ๋ฐฐํฌ๊ฐ ๋ค์ด ํ์ ์์ด ์งํ์ด ๋๋์ง ํ์ธํ์์ต๋๋ค. ํนํ๋ ๋กค๋ง ์ ๋ต์ด๋ ์นด๋๋ฆฌ ์ ๋ต์ ํธ๋ํฝ์ ๋์ ์ผ๋ก ๋ฐ๊พธ๋ ๋ถ๋ถ์ด ํฌ๊ธฐ์ ์ค์๊ฐ์ผ๋ก ์ด๋ ํฌํธ์ ํธ๋ํฝ์ด ์๊ฐ๊ณ ๊ฐ๋์ง๋ ํ์ธ์ด ๊ฐ๋ฅํ์ต๋๋ค.
7. Postman : ์ํ์น ์ ์ด๋ฏธํฐ๋ก ์์ฒญ์ ๋ํ ์๋ต์ ๊ณ์ ํ์ธํ๋ค๋ฉด, ํฌ์คํธ๋งจ์ ์ด์ฉํด์๋ ๋ก์ปฌ์์ ํฌ์ค ์ฒดํฌ๋ฅผ ์งํ ํ์ต๋๋ค. ์ค์ ๋ก ๋ฌด์ค๋จ ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง๊ณ ๋์, ๊ตฌ๋ฒ์ ์ด ์๋ ํฌํธ์ ํ๋ก์ธ์ค๋ kill ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ ํฌ์ค ์ฒดํฌ๋ฅผ ํด๋ ์ปค๋ฅ์ ์๋ฌ๊ฐ ์๊ฒจ์ผํฉ๋๋ค. ๋ฌด์ค๋จ ๋ฐฐํฌ๊ฐ ์ ์ด๋ค์ก๋์ง ๋ก์ปฌ์์ ํ์ธ ์ฉ์ผ๋ก ํฌ์คํธ๋งจ์ ์ฌ์ฉํ๊ณ ,
{ http:// EC2 ํผ๋ธ๋ฆญ IP }:{๊ตฌ๋ฒ์ ์ jar ๊ฐ ์คํ๋ ํ๋ก์ธ์ค์ ํฌํธ๋ฒํธ}/autator/health ํตํ์ฌ ์์ฒญ์ด ๊ฐ๋ ๊ฒ์ด ์๋ ์๋ฌ๊ฐ ์ ์ค๋์ง ํ์ธํ์ต๋๋ค.
์ค์ต ๋ธ๋์น ์ ๋ต
์ค์ต ๋ธ๋์น ์ ๋ต์ ์๋ ๊ทธ๋ฆผ์ผ๋ก ์ ๋ฆฌํด๋์์ต๋๋ค.
ver1์ ๊ฐ๊ฐ์ ๋ธ๋์น์ ๋ฌด์ค๋จ ๋ฐฐํฌ ์ ์ฉ ์ ๋ฐฐํฌ ํ๊ฒฝ์ ๊ตฌ์ถํ ๊ฒ์ด๊ณ , ver2 ๋ ๊ฐ๊ฐ์ ๋ธ๋์น์ ๋ง๋ ๋ฌด์ค๋จ ๋ฐฐํฌ ์ ๋ต์ ์ ์ฉํ ๋ธ๋์น์ ๋๋ค.
bluegreen, rolling, canary ๋ธ๋์น๋ ๊ฐ๊ฐ push ํธ๋ฆฌ๊ฑฐ๊ฐ ์ ํด์ ธ ์์ด ver1 ๋๋ ver2 ์ ํ๋ฆฌํ์คํธ ๋ณด๋ด๊ณ ํด๋น ๋ธ๋์น์ merge ํ๋ฉด Github Actions ๊ฐ ์คํ๋๊ฒ ๋ฉ๋๋ค.
on:
push:
branches:
- [๊ฐ๊ฐ์ ๋ธ๋์น]
์ค์ต ์ ์ ํ
์ค์ต์ ๋ฐ๋ผํ์๊ธฐ ์ ์ ์ ํ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ํ๊ฒฝ ์ ํ
๋จผ์ EC2์ ์๊ฒฉ ์ ์์ ํ์ฌ JDK17 ๊ณผ Nginx ๋ฅผ ์ค์นํด์ฃผ์ด์ผ ํฉ๋๋ค.
Termius ๋ฅผ ํตํด ์งํ ํ ๊ฒ์ธ๋ฐ, Termius ์์ EC2 ์๊ฒฉ ์ ์์ ์๋ ๋ธ๋ก๊ทธ ํฌ์คํ ์ ์์ธํ๊ฒ ์ ๋ฆฌ ํด๋์์ต๋๋ค.
https://programmer-may.tistory.com/212
Termius ๋ค์ด๋ก๋ ๋ฐ ์คํ, EC2 ์ ์
๊ฐ์์๊ฒฉ ๋ฐ์คํฌํฑ ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก MobaXterm ์ ์ ์ฌ์ฉํ๊ณ ์์๋๋ฐ, ๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ต์ ํ๊ธฐ ์ํด์ ํ์๋ค๊ณผ ๊ฐ์ ํด์ ๋ฐ๊ฟ์ผ ํ๋ค.Telnet, SSH ์ ์์ ์ํด PuTTY๋ XShell์ ๊น๊ณ , FTP/SFTP์ ์
programmer-may.tistory.com
์ ์์ ํ ๋ค CLI ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ฌ ํ์ํ ํ์ผ์ ๋ค์ด์ ๋ฐ์ ๋ณด๊ฒ ์ต๋๋ค.
๋จผ์ ์ ๋ฐ์ดํธ๋ฅผ ํ๊ธฐ ์ํด apt update๋ฅผ ์ ๋ ฅํด์ค๋๋ค.
$ sudo apt update
JDK 17 ์ค์น, ์ค๊ฐ์ ๋์ ๊ตฌํ๋ ๊ฑด ๋์คํฌ๋ฅผ ์ผ๋งํผ ์ฐจ์งํ๋๋ฐ ์ค์น ํ ๊ฒ์ธ๊ฐ์ ๊ดํ ๊ฒ์ด๋ y ๋ฅผ ์ ๋ ฅํด์ค๋๋ค.
$ sudo apt install openjdk-17-jdk
JDK๊ฐ ์ ์ค์น ๋์๋์ง ๋ฒ์ ํ์ธ
$ java -version
์ด๋ ๊ฒ 17.xxx ๋ก ๋ฒ์ ์ด ์ ๋์ค๋ฉด ์ ์ค์น ๋ ๊ฒ์ ๋๋ค.
Nginx ์ค์น
$ sudo apt install nginx
$ nginx -v
์์ง์์ค์ ๋ฒ์ ์ ํ์ธํ์ฌ ์ ์ค์น ๋์ด ์๋์ง ํ์ธํด๋ด ๋๋ค.
์ค์ ํ์ผ์ ์ผ์ ์ค์ ํ์ผ ์์๋ฅผ ํ์ธํด ๋ด ๋๋ค.
$ sudo nano /etc/nginx/sites-available/default
๋ง๋ํ ์ฃผ์๋ฌธ์ผ๋ก ์ค์ ํ์ผ ์์์ ์ค๋ช ์ด ์๋ ํ์ผ์ด ์ผ์ก๋ค๋ฉด, ์ ๋๋ก ์ค์น๊ฐ ๋ ๊ฒ์ด๊ณ , ํ ๋น์ด์๊ฑฐ๋ ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ์๊ฐ ์๋ค๊ณ ๋ํ๋๋ฉด ๊ฒฝ๋ก๋ฅผ ์๋ชป ๊ธฐ์ ํ ๊ฒ์ ๋๋ค.
ctrl +k ๋ฅผ ๋๋ฌ ์ฃผ์๋ฌธ๊ณผ ์์๋ฅผ ๋ชจ๋ ๋ ๋ ค ๋ฒ๋ฆฌ๊ณ ๊ธฐ๋ณธ nginx ์ค์ ํ์ผ์ ๋ณต๋ถ ํ๊ฒ ์ต๋๋ค.
๊ฐ๊ฐ ์ ๋ต๋ง๋ค ์ด๊ธฐ ์์ง์์ค ์ค์ ์ด ๋ค๋ฅธ๋ฐ, ๋ธ๋ฃจ ๊ทธ๋ฆฐ ๊ธฐ์ค์ผ๋ก ๋จผ์ ํด์ฃผ๊ฒ ์ต๋๋ค.
server {
listen 80;
server_name _;
location / {
proxy_pass http://127.0.0.1:8081; # ์ด ๋ถ๋ถ์ deploy.sh์์ ๋์ ์ผ๋ก ๋ณ๊ฒฝ๋ฉ๋๋ค.
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Termius ๊ธฐ์ค ๋ณต์ฌ๋ ctrl + shift + c ์ด๊ณ ๋ถ์ฌ๋ฃ๊ธฐ๋ ctrl + shift + v ์
๋๋ค.
nano ๋ช
๋ น์ด๋ก ํจ ํธ์ง๊ธฐ์ ์ ์ฅ์ ์ํด์ ctrl + o ๋ฅผ ์
๋ ฅํ๊ณ ์ํฐ๋ฅผ ๋๋ฌ์ฃผ๋ฉด ๋ฉ๋๋ค. ๋๊ฐ๊ธฐ๋ฅผ ํ๋ ค๋ฉด ctrl + x ๋ฅผ ํ๋ฉด ๋ฉ๋๋ค.
์ค์ ํ์ผ์ด ์ ์ ์ฅํ๋์ง ์์ ๋ช ๋ น์ด๋ฅผ ๋ค์ ํ๋ฒ ์ ๋ ฅํ์ฌ ํ์ธ ํ ๋๊ฐ์ค๋๋ค.
ํ ์คํธ๋ฅผ ํ์ฌ ์์ง์์ค ์ค์ ์ด ๋ฌธ์ ๊ฐ ์๋์ง ํ์ธํด์ค๋๋ค.
$ sudo nginx -t
๋ค์๊ณผ ๊ฐ์ด ok๊ฐ ๋์ค๋ฉด ๋ณ ๋ฌธ์ ์๋ ๊ฒ์ ๋๋ค.
์ค์ ์ ํด์ฃผ์๊ธฐ์ ์์ง์์ค๋ฅผ ์คํํด์ฃผ๊ฒ ์ต๋๋ค.
$ sudo systemctl start nginx
์์ง์์ค์ ์ํ๋ฅผ ํ์ธํด์ฃผ๊ฒ ์ต๋๋ค.
$ sudo systemctl status nginx
์์ ๊ฐ์ด active (running) ์ด ๋์ด์์ผ๋ฉด ์ ์ ์คํ์ค์ธ ๊ฒ์ ๋๋ค.
์ด์ jar ํ์ผ์ scp ํ ๋๋ ํ ๋ฆฌ์ ๊ฐ๊ฐ ์ ๋ต์ ๋ง๋ deploy.sh ๋ฅผ ์คํํ๊ธฐ ์ํ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ฒ ์ต๋๋ค.
๋จผ์ ๋ฃจํธ ๊ฒฝ๋ก์์ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค ๊ฒ์
๋๋ค. ๋ฃจํธ๋ก ์ค๋ ค๋ฉด cd ~ ์
๋ ฅํ๋ฉด ๋ฃจํธ๋ก ์์ง๋๋ค.
$ mkdir cicd
cicd ํด๋๋ฅผ ๋ง๋ค์ด์ ์์ผ๋ก ์ ํฌ๊ฐ ๋ง๋ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฒ์ ์ jar ํ์ผ์ ์ด๊ณณ์ ๋๊ฒ๋๋ค.
cicd ๋๋ ํ ๋ฆฌ๋ก ๊ฒฝ๋ก๋ฅผ ์ด๋ํ๊ฒ ์ต๋๋ค.
$ cd cicd
์ด๋ํ ๋ค์ ๋ช ๋ น์ด๋ฅผ ํ์ค ์ฉ ์ ๋ ฅํฉ๋๋ค.
$ mkdir old_build
$ mkdir bluegreen
$ mkdir rolling
$ mkdir canary
cicd ๋๋ ํ ๋ฆฌ ์๋์ old_build ๋๋ ํ ๋ฆฌ์๋ ๋ฐฐํฌํ ๊ตฌ๋ฒ์ ์ jar ํ์ผ์ด ์ด๊ณณ์ผ๋ก ์ฎ๊ฒจ์ง ๊ฒ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ์ ๋ฐฐํฌ ์ ๋ต์ ๋ง๋ deploy.sh ์ ์คํฌ๋ฆฝํธ๋ฅผ ๊ฐ๊ฐ ๋ฐฐํฌ์ ๋ต ๋๋ ํ ๋ฆฌ ์๋์ ์์ฑํ ๊ฒ์ ๋๋ค.
2. ํ๋ก์ ํธ ์ ํ
ํ๋ก์ ํธ์ cd yml ํ์ผ์ ๋ณด๋ฉด Repository Secrets ๋ฅผ ๋์ด ๋์ ์ผ๋ก ๋ฐ์ธ๋ฉํ์ฌ ๋ฐฐํฌํ๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
๊ฐ์ธ์ ์ธ ์ ๋ณด๊ฐ ๋ค์ด๊ฐ๊ธฐ์ ๊นํ๋ธ์ ์คํ๋ ๊ณต๊ฐ์ ์ ์ฅํ์ง ์๊ธฐ ์ํด Secrets ๋ง๋ค์ด์ ๊ด๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
์ด 4๊ฐ์ง๋ฅผ ๋ง๋ค๊ฒ์ ๋๋ค.
์์ ์ EC2์ pem Key ๋ฅผ ์ด์ด ๋ด์ฉ์ ์ ์ฒด ๋ณต๋ถ ํด์ค๋๋ค. ๋ง์ฝ OpenSSH ํค๊ฐ ์๋๋ผ๋ฉด ๋ณํํด์ผํ๋๋ฐ, ๋ณํํ๋ ๊ณผ์ ์ ์ ๋ธ๋ก๊ทธ์ ๋ค๋ฅธ ๊ธ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
Name์ SSH_PRIVATE_KEY ๋ฅผ ์ ๊ณ ๋ถ์ด ๋ฃ์ด์ค๋๋ค.
์์ฑํ ๋ค ๋ค์๋ ๋๊ฐ์ด ํ๋ฉด ๋ฉ๋๋ค.
APPLICATION_YML
management:
endpoints:
web:
exposure:
include: health,info
endpoint:
health:
show-details: always
SERVER_IP
์์ ์ EC2์ ํผ๋ธ๋ฆญ IP ์ฃผ์ ๋๋ ํผ๋ธ๋ฆญ DNS ์ฃผ์
SERVER_USERNAME
ubuntu
SERVER_USERNAME์ ๊ฒฝ์ฐ EC2 AMI ์ OS ๋ง๋ค ๊ฐ๊ฐ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ ๋ EC2์ AMI ๋ฅผ ์ฐ๋ถํฌ๋ก ํ์๊ธฐ ๋๋ฌธ์ username ์ด ubuntu ์ ๋๋ค. ์์ ์๊ฒ ๋ง๋ ๊ฒ์ ๋ฃ์ด์ผ ํฉ๋๋ค.
๋ชจ๋ ๋ค ํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
main ๋ธ๋์น ์ ํ
๋ฉ์ธ ๋ธ๋์น๋ ๊ฐ๊ฐ bluegreen, rolling, canary ๋ธ๋์น์ ํ ๋๊ฐ ๋๋ ๋ธ๋์น๋ก bulid.gradle ์ค์ , Test API ์์ฑ, Custom Health Indicator ์์ฑ, ci.yml ์์ฑ์ ํ๊ฒ ์ต๋๋ค.
bulid.gradle
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named("jar") {
enabled = false
}
์์กด์ฑ ์ผ๋ก๋ Spring web ๊ณผ Spring actuator ๋ฅผ ์ฃผ์ ๋ฐ๊ณ jar ํ์ผ ์์ฑ์ false ๋ก ํ๊ฒ ์ต๋๋ค. ์๋ํ๋ฉด ๊นํ๋ธ ์ก์ ์ค์ ๋ช ๋ น์ด์์๋ jar ํ์ผ์ ๋ง๋ค๊ธฐ ๋๋ฌธ์ false ํด์ฃผ์ง ์์ผ๋ฉด jar ํ์ผ์ด ๋ณต์๊ฐ๋ผ์ ์ด๋ ๊ฒ์ ๋ฐฐํฌํ jar์ธ์ง ๋ชจ๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.
Test API ์์ฑ
import org.springframework.boot.web.server.WebServer;
import org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
private final ServletWebServerApplicationContext webServerAppContext;
private static final String RESPONSE_BODY_MESSAGE = "๋ฒ์ 1 ์๋ต๊ฐ์
๋๋ค. ๋ฌด์ค๋จ ๋ฐฐํฌ ๋์
์ ์
๋๋ค.";
public TestController(ServletWebServerApplicationContext webServerAppContext) {
this.webServerAppContext = webServerAppContext;
}
@GetMapping("/hello")
public ResponseEntity<String> test() {
WebServer webServer = webServerAppContext.getWebServer();
int port = webServer.getPort();
String response = RESPONSE_BODY_MESSAGE + "\n์คํ ์ค์ธ ํฌํธ๋ " + port + "์
๋๋ค.";
return ResponseEntity.ok(response);
}
}
์ด๋ ๋ฒ์ ์ธ์ง ์๋ต์ ๋ฐ์ ์ ์๊ณ ํฌํธ ๋ฒํธ๋ฅผ ์ ์ ์๊ฒ ๋ API ๋ฅผ ๋ง๋ค์์ต๋๋ค. ์์ฑ์ ์ฃผ์ ์ ํ๊ธฐ๋๋ฌธ์ ์๋์ผ๋ก ์์ฑ๋ Test ํด๋์ TestController ํ ์คํธ ํ์ผ์ ์ง์์ฃผ์ ์ผํฉ๋๋ค. ์๊ทธ๋ฌ๋ฉด ๋์ค์ pr ์ CI ์ฒดํฌ์์ ๋น๋ ํ ์คํธ๋ฅผ ํต๊ณผ ๋ชปํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ๊ธด ์์กด์ฑ ์ฃผ์ ์ด ๋๋๋ฐ, Test ํ์ผ์ ์์กด์ฑ ์ฃผ์ ์ด ์๋๊ธฐ ๋๋ฌธ์ด์ฃ .
Custom Health Indicator ์์ฑ
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.stereotype.Component;
@Component
public class CustomHealthIndicator implements HealthIndicator {
@Override
public Health health() {
boolean isHealthy = checkSomeCondition();
if (isHealthy) {
return Health.up().withDetail("customHealth", "All systems go!").build();
} else {
return Health.down().withDetail("customHealth", "Something is wrong!").build();
}
}
private boolean checkSomeCondition() {
long freeMemory = Runtime.getRuntime().freeMemory();
long totalMemory = Runtime.getRuntime().totalMemory();
return freeMemory > (totalMemory * 0.15);
}
}
Actuator ๋ฅผ ํ์ฉํ์ฌ ์ปค์คํ ์ผ๋ก ํฌ์ค ํ์ธ์ ํ ์ ์์ต๋๋ค. DB ์ปค๋ฅ์ ์ ํ์ธ ํ๋ค๊ฑฐ๋, ์ธ๋ถ API๊ฐ ์ ํธ์ถ ๋๋์ง ํ์ธ ํ๋ค๊ฑฐ๋, ์๋๋ฉด ์์ ์ด ๋ง๋ ์๋น์ค์ ๊ธฐ๋ฅ์ด ์ ๋์ํ๋์ง ํ์ธ์ ํ ์๋ ์๊ฒ ์ฃ .
์ DB ์ฐ๋์ด๋ ๋ค๋ฅธ ์ธ๋ถ์ ์ธ ์์ธ์ด ์๊ธฐ์, ๊ทธ๋ฅ return true ๋ก ํ๋ฉด ์ฌ์ฌํ๋ ๊ฐ์ฉ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ์ 15% ์ด์์ธ์ง ํ์ธํ๋ ๋ก์ง์ ๋ฃ์ด ๋ดค์ต๋๋ค.
๋ชจ๋ ์ ํ ์ ๋๋ฌ๊ธฐ์ ์ด์ ๊ฐ๊ฐ์ ์ ๋ต์ ๋ง๋ ์ค์ต์ ์งํํด ๋ณด๊ฒ ์ต๋๋ค.
'DevOps > CI&CD' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ต - ์นด๋๋ฆฌ ์ ๋ต (0) | 2024.09.07 |
---|---|
๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ต - ๋กค๋ง ์ ๋ต (0) | 2024.09.06 |
๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ต - ๋ธ๋ฃจ๊ทธ๋ฆฐ ์ ๋ต (0) | 2024.08.18 |
๋ฌด์ค๋จ ๋ฐฐํฌ(Zero-downtime Deployment) ์ ๋ต (0) | 2024.07.23 |
CI/CD ๋ ๋ฌด์์ธ๊ฐ? (0) | 2024.07.17 |
๋๊ธ