๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
[DevOps]/CI & CD

๋กœ์ปฌ์—์„œ ์  ํ‚จ์Šค๋กœ ๋ธ”๋ฃจ/๊ทธ๋ฆฐ ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ ํ…Œ์ŠคํŠธํ•˜๊ธฐ (2) - ์‰˜ ์Šคํฌ๋ฆฝํŠธ ๋ฐฐํฌ ํŒŒ์ผ ์ž‘์„ฑ

by ํŒกํŽ‘ํ 2023. 11. 25.
728x90
๐Ÿ’ก ์ด ๊ธ€์€ 2ํŽธ์œผ๋กœ 1ํŽธ์ธhttps://suzuworld.tistory.com/419์— ์ด์–ด ์“ฐ๋Š” ๊ธ€์ด๋‹ค.

 

๐Ÿค— ์‰˜ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ์ค€๋น„

  • ์ด์ œ ํ•  ์ผ์€ ๋จผ์ € ์‰˜์Šคํฌ๋ฆฝํŠธ๋กœ ๋ฐฐํฌ ํŒŒ์ผ์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด๋‹ค.
  • ์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ ์ƒ์œ„ ํด๋”์— script๋ผ๋Š” ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๋งŒ๋“  ๋‹ค์Œ์— deploy.sh๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ๋งŒ๋“ค์ž.

 

๐Ÿค” ๋“ค์–ด๊ฐ€๊ธฐ ์ „์—

 

  • ๋ณธ๊ฒฉ์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ์œ„ ๊ทธ๋ฆผ์„ ํ•œ ๋ฒˆ ๋” ๋ณด๊ณ  ์‹œ์ž‘ํ•˜๋ฉด ์Šคํฌ๋ฆฝํŠธ ์ดํ•ด์— ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ์ด๋‹ค.
  • ์ด๋ฒˆ์— ์‰˜ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ฒ˜์Œ ๋งŒ์ ธ๋ด์„œ ์ƒ๋‹นํžˆ ์• ๋จน์—ˆ๋Š”๋ฐ ๋Œ€๋ถ€๋ถ„์˜ ๋ธ”๋กœ๊ทธ๊ฐ€ ๊ฐ ๋ช…๋ น์–ด์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ง€ ์•Š์•„ ์‹œ๊ฐ„์ด ๋” ๊ฑธ๋ ธ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
  • ๋‚˜์ฒ˜๋Ÿผ ์‰˜ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ์ด ์ฒ˜์Œ์ธ ์‚ฌ๋žŒ์„ ์œ„ํ•ด ์ตœ๋Œ€ํ•œ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ๋ณด๊ฒ ๋‹ค.(์„ค๋ช…์ด ๋‹ค์†Œ ์žฅํ™ฉํ•˜๊ณ  ํ‹€๋ฆด ์ˆ˜๋„ ์žˆ์Œ๐Ÿ˜…)
  • ๋ฌถ์Œ ๋‹จ์œ„๋กœ ์„ค๋ช…ํ•˜๊ณ  ๋งจ ์•„๋ž˜์—๋Š” ์™„์„ฑ๋ณธ์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰ํ•˜๊ฒ ๋‹ค.
  • ๋‹ค ์ดํ•ดํ•œ๋‹ค๋ฉด ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์— ๋Œ€ํ•œ ์‘์šฉ ๋™์ž‘๋„ ๋งŒ๋“ค์–ด ๋‚ผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

 

โœ๐Ÿป ์‰˜ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

#!/bin/bash
  • /bin/bash ๊ฒฝ๋กœ์— ์žˆ๋Š” Bash ํ•ด์„๊ธฐ๋ฅผ ํ•ด๋‹น ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๊ณ  ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

SWITCH_SCRIPT="./switch.sh"

DEFAULT_SWITCH_SCRIPT="./default_switch.sh"

SERVER_HOME=์  ํ‚จ์Šค ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋‚ด ๋นŒ๋“œ ํ…Œ์ŠคํŠธ ๊ฒฝ๋กœ
  • SWITCH_SCRIPT์™€ DEFAULT_SWITCH_SCRIPT๋Š” ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•œ ๊ฒƒ์ด๋‹ค.
  • ์ด ๋‘ ๋ณ€์ˆ˜๋Š” deploy.sh ํŒŒ์ผ ๋‚ด์—์„œ ์กฐ๊ฑด๋ฌธ์œผ๋กœ ๋ถ„๊ธฐํ•˜์—ฌ ์‹คํ–‰๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ์‰˜์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์˜ ๊ฒฝ๋กœ๋ฅผ ๋‹ด๊ณ  ์žˆ๋‹ค.
  • SWITCH_SCRIPT๋Š” ๋ธ”๋ฃจ, ๊ทธ๋ฆฐ ํฌํŠธ ์ค‘ ํ•œ ๊ณณ์ด ์‹คํ–‰์ค‘์ผ ๋•Œ, ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ๋ฆฌ๋ฒ„์Šค ํ”„๋ก์‹œ๋ฅผ ์Šค์œ„์นญํ•˜๋Š” ๋ฐ์— ์‚ฌ์šฉ๋œ๋‹ค.
  • DEFAULT_SWITCH_SCRIPT์˜ ๊ฒฝ์šฐ ๋‘ ํฌํŠธ ๋ชจ๋‘ ์ฃฝ์–ด์žˆ์„ ๋•Œ(์Šคํ”„๋ง ๋ถ€ํŠธ ์„œ๋ฒ„๊ฐ€ ๊บผ์ ธ์žˆ์„ ๋•Œ) ๋””ํดํŠธ์ธ ๋ธ”๋ฃจ ํฌํŠธ๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  NGINX์˜ ํ”„๋ก์‹œ ๋ฐฉํ–ฅ์„ ๋ธ”๋ฃจ๋กœ ๋งž์ถฐ๋†“๋Š” ๋ฐ์— ์‚ฌ์šฉ๋œ๋‹ค.
  • SERVER_HOME์€ ํ”„๋กœ์ ํŠธ์˜ ์  ํ‚จ์Šค์—์„œ ๋นŒ๋“œํ•œ jar ํŒŒ์ผ์ด ์žˆ๋Š” ๊ฒฝ๋กœ์ด๋‹ค.
    • ๋‚˜์˜ ๊ฒฝ์šฐ์—๋Š” ์™„์ „ํžˆ ๋กœ์ปฌ PC ํ•œ ๊ณณ์—์„œ๋งŒ ํ…Œ์ŠคํŠธํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์  ํ‚จ์Šค์˜ ์›Œํฌ์ŠคํŽ˜์ด์Šค ํด๋” ๋‚ด์— ๋นŒ๋“œ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ์„œ๋ฒ„๋ฅผ ์‹คํ–‰์‹œํ‚จ๋‹ค๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋กœ ์ ‘๊ทผํ–ˆ๋‹ค.
    • ๋งŒ์•ฝ ๋ฐฐํฌ๋ฅผ ์œ„ํ•œ ์™ธ๋ถ€ ์„œ๋ฒ„(AWS ์ธ์Šคํ„ด์Šค ๋“ฑ)์— ๋ณด๋‚ผ ๊ฒƒ์ด๋ผ๋ฉด ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ๋ฅผ ์ฐธ๊ณ ํ•˜๋ฉด์„œ ๋”ฐ๋ผํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

echo "-> ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ<Jenkins ๋ฐฐํฌ ์‹œ์ž‘>"
CURRENT_SERVER_PROFILE=$(curl -s http://localhost:28080/profile | head -n 1)
  • echo ์ถœ๋ ฅ์œผ๋กœ ์  ํ‚จ์Šค ๋ฐฐํฌ๊ฐ€ ์‹œ์ž‘๋จ์„ ์•Œ๋ฆฐ๋‹ค.
    • ์‰˜ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์˜ˆ์˜๊ฒŒ ์ถœ๋ ฅ๋˜๋ฉด ๋ฐฐํฌํ•  ๋•Œ ๊ธฐ๋ถ„๋„ ์ข‹์•„์ง€์ง€ ์•Š์„๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์— ์ด๋ชจ์ง€๋ฅผ ๊ณ ๋ฅผ ๋•Œ ์‹ ์ค‘์„ ๊ฐ€ํ–ˆ๋‹ค.๐Ÿค—
  • ์ •๋ฆฌํ•˜๋ฉด ๋ฐฐํฌ ์‹œ์ž‘์„ ์•Œ๋ฆฌ๋Š” ์ถœ๋ ฅ๋ฌธ์„ ๋‚ด๋ณด๋‚ด๊ณ  curl์„ ์ด์šฉํ•ด ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์˜ ํŽ˜์ด์ง€์—์„œ ๋งจ ์•ž ์ค„ ์ฒซ ๋ฒˆ์งธ ํ‚ค์›Œ๋“œ๋งŒ์„ ๋ณ€์ˆ˜์— ๋„ฃ๋Š”๋‹ค.
    • ์—ฌ๊ธฐ์„œ ๋ณ€์ˆ˜์— ๋‹ด๊ธฐ๋Š” ๋‚ด์šฉ์€ ๋ฐ”๋กœ ์•ž์„  ๊ธ€์—์„œ ์„ค์ •ํ–ˆ๋˜ application.yml์˜ ํ”„๋กœํ•„ ์ด๋ฆ„์ธ blue, green์ด๋‹ค.
    • blue๋กœ ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋Š” 8081 ํฌํŠธ๋ผ๋ฉด blue๊ฐ€ ๋‹ด๊ธธ๊ฒƒ์ด๊ณ , green์œผ๋กœ ์‹คํ–‰๋˜๋Š” 8082 ํฌํŠธ๋ผ๋ฉด green์ด ๋‹ด๊ธธ ๊ฒƒ์ด๋‹ค.
  • 28080์€ nginx๋กœ ํฌํŠธํฌ์›Œ๋”ฉํ•œ ๊ฒƒ์ด๋‹ค.
    • nginx์— ๋Œ€ํ•œ ์„ค๋ช…์€ ์•„๋ž˜์— ์žˆ๋‹ค. 
    • if blue) 28080 -> 8081
    • else if green) 28080 -> 8082
  • echo : ์ฃผ์–ด์ง„ ์ธ์ž๋ฅผ ํ‘œ์ค€ ์ถœ๋ ฅ์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ๋ช…๋ น์–ด์ด๋‹ค.
  • curl : ์ฃผ์–ด์ง„ URL์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ฑฐ๋‚˜ ๋ฐ›์•„์˜ค๋Š” ๋ช…๋ น์–ด์ด๋‹ค.
  •  -s : curl์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์ง„ํ–‰ ์ƒํ™ฉ์ด๋‚˜ ์ง„๋‹จ ๋ฉ”์‹œ์ง€ ๋“ฑ์˜ ์ถœ๋ ฅ์„ ํ‘œ์‹œํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•œ๋‹ค.(silent)
  • head : ํ…์ŠคํŠธ์˜ ์•ž ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค.
  • -n 1 : ์ฒซ๋ฒˆ์งธ ์ค„์„ ์˜๋ฏธํ•œ๋‹ค.

 

if [ "$CURRENT_SERVER_PROFILE" == blue ]
then
echo "-> ๐Ÿ’ก ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Profile : $CURRENT_SERVER_PROFILE"
CURRENT_SERVER_PORT=8081
SWITCH_SERVER_PROFILE=green
SWITCH_SERVER_PORT=8082
elif [ "$CURRENT_SERVER_PROFILE" == green ]
then
echo "-> ๐Ÿ’ก ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Profile : $CURRENT_SERVER_PROFILE"
CURRENT_SERVER_PORT=8082
SWITCH_SERVER_PROFILE=blue
SWITCH_SERVER_PORT=8081
else
echo "-> โš ๏ธ profile not found : ์ผ์น˜ํ•˜๋Š” Profile์ด ์—†์Šต๋‹ˆ๋‹ค."
echo "-> โš ๏ธ set default profile : ๊ธฐ๋ณธ Profile์ธ blue๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค."
echo "-> โš ๏ธ ๋ธ”๋ฃจ, ๊ทธ๋ฆฐ์ด ๋ชจ๋‘ ๋™์ž‘์ค‘์ด ์•„๋‹ˆ์—ˆ์œผ๋ฏ€๋กœ, blue๋งŒ ๋ฐฐํฌํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค."
SWITCH_SERVER_PROFILE=blue
SWITCH_SERVER_PORT=8081
fi
  • ํ˜„์žฌ ์‹คํ–‰์ค‘์ธ ํฌํŠธ๊ฐ€ 8081์ด๋ผ๋ฉด green๊ณผ 8082๋ฅผ ๊ฐ switch ๋ณ€์ˆ˜์— ๋‹ด๊ณ , 8082๋ผ๋ฉด blue์™€ 8081์„ ๊ฐ switch ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค.
  • ๋‘˜ ๋‹ค ์•„๋‹ˆ๋ผ๋ฉด ๋””ํดํŠธ ํ”„๋กœํ•„์ธ blue์™€ ํฌํŠธ 8081์„ ๊ฐ switch ๋ณ€์ˆ˜์— ๋‹ด๋Š”๋‹ค.
  •  fi : if๋ฌธ์ด ์ข…๋ฃŒ๋จ์„ ๋œปํ•œ๋‹ค.

 

echo "-> ๐Ÿšš $SWITCH_SERVER_PROFILE ๋ฐฐํฌ"
SWITCH_PORT_PID=$(netstat -anv | grep $SWITCH_SERVER_PORT | head -n 1 | awk '{print $9}')
if [ ! -z "$SWITCH_PORT_PID" ]
then
echo "-> ๐Ÿ“ฆ $SWITCH_SERVER_PROFILE ์˜ PID : $SWITCH_PORT_PID"
kill $SWITCH_PORT_PID >/dev/null 2>&1
fi
  • swith ๋ณ€์ˆ˜์— ๋‹ด๊ธด ํ”„๋กœํ•„๋กœ ์Šคํ”„๋ง ๋ถ€ํŠธ ์„œ๋ฒ„ ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๋งŒ์•ฝ switch ํฌํŠธ๊ฐ€ ์ด๋ฏธ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ ์ค‘์ด๋ผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฒƒ์ž„์œผ๋กœ ๋จผ์ € switch ํฌํŠธ๋ฅผ ์ฃฝ์ด๊ณ  ์‹œ์ž‘ํ•œ๋‹ค.
  • ์ด๋•Œ ํ•ต์‹ฌ์€ ์šด์˜์ฒด์ œ ํ™˜๊ฒฝ๋งˆ๋‹ค ํ•ด๋‹น ํฌํŠธ๋ฅผ ์ฐพ๊ณ  ๊ทธ ํฌํŠธ์˜ pid๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ธ๋ฐ ์œ„ ๋ช…๋ น์–ด๋ฅผ ์‘์šฉํ•˜์—ฌ ์ถœ๋ ฅ๋ฌธ์„ ๋ณด๊ณ  ํ•ด๋‹น pid์˜ ์œ„์น˜๋ฅผ ์ฐพ๊ฒŒ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.
wonyonghwang@Wonyongs-MacBook-Pro jenkins % netstat -anv | grep 8081
tcp46      0      0  *.8081                 *.*                    LISTEN       131072  131072   3953      0 00000 00000006 00000000000057ce 00000000 00000800      2      0 000001
wonyonghwang@Wonyongs-MacBook-Pro jenkins % netstat -anv | grep 8082
tcp46      0      0  *.8082                 *.*                    LISTEN       131072  131072   4392      0 00000 00000006 0000000000008378 00000000 00000800      2      0 000001
  • netstat -anv : ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ ํ”„๋กœ์„ธ์Šค ๊ด€๋ จ ๋‚ด์šฉ์ด ์ถœ๋ ฅ๋œ๋‹ค.
  • grep : ์—ฌ๊ธฐ์„œ grep์œผ๋กœ ์Šค์œ„์น˜ํ•  ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ถ”๋ ค๋‚ธ๋‹ค.
  • head -n 1 :  ๋งจ ์œ„ ์ค„๋งŒ ์ถœ๋ ฅํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
  • awk '{print $9}' : 9 ๋ฒˆ์งธ ๋ฌธ์ž๋ฅผ ์ถœ๋ ฅํ•˜๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
    • ์œ„์˜ ์ถœ๋ ฅ๋ฌธ์„ ์„ธ์–ด๋ณด๋ฉด 3953, 4392๊ฐ€ 9๋ฒˆ์งธ์— ์œ„์น˜ํ•ด ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

wonyonghwang@Wonyongs-MacBook-Pro jenkins % netstat -anv | grep 8081 | head -n 1 | awk '{print $9}'
3953
wonyonghwang@Wonyongs-MacBook-Pro jenkins % netstat -anv | grep 8082 | head -n 1 | awk '{print $9}'
4392
  • ์ด๋ ‡๊ฒŒ ์ถœ๋ ฅํ•˜๋ฉด PID๋งŒ ์ถœ๋ ฅ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
  • ์ด๋ฅผ PID ๋ณ€์ˆ˜์— ๋„ฃ๊ณ  ํ•ด๋‹น ํฌํŠธ์˜ PID๋กœ ํฌํŠธ๋ฅผ kill ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • /dev/null 2>&1 : ๋ช…๋ น์–ด ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•˜์ง€ ์•Š๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค.
    • kill ํ–ˆ์„ ๋•Œ ์ถœ๋ ฅ๋ฌธ์ด ๋‚˜์˜ค๋Š”๊ฒŒ ๋ณด๊ธฐ ์‹ซ์–ด ๋„ฃ์—ˆ๋‹ค.

 

echo "-> ๐Ÿšš nohup java -jar $SERVER_HOME/forJenkins.jar --spring.profiles.active=$SWITCH_SERVER_PROFILE > /dev/null &"
nohup java -jar $SERVER_HOME/forJenkins.jar --spring.profiles.active=$SWITCH_SERVER_PROFILE > /dev/null &

echo "-> ๐Ÿš‘ $SWITCH_SERVER_PROFILE : 10์ดˆ ํ›„ Health Check Start"
echo "-> ๐Ÿš‘ curl -s http://localhost:$SWITCH_SERVER_PORT/actuator/health"
sleep 10
  • ์Šค์œ„์นญํ•  ํ”„๋กœํ•„ ์Šคํ”„๋ง๋ถ€ํŠธ ์„œ๋ฒ„๋ฅผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ๋กœ ์‹คํ–‰์„ ํ•œ๋‹ค.(nohup)
  • SERVER_HOME์€ ์œ„์˜ jar ํŒŒ์ผ์ด ์ €์žฅ๋  ์œ„์น˜์ด๋ฉฐ, PROFILE์€ switch ํ•  ํ”„๋กœํ•„์ด๋‹ค.
  • ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๋ฉด sleep์œผ๋กœ 10์ดˆ ํ›„ health check๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.
    • ์Šคํ”„๋ง๋ถ€ํŠธ ์‹คํ–‰ ์™„๋ฃŒ ์‹œ๊ฐ„์„ ๋„‰๋„‰ํ•˜๊ฒŒ ์žก์•„ ์„ค์ •ํ•œ ๊ฒƒ์ด๋‹ค.
  • echo๋Š” ์ง€๊ธˆ ์ด ์ถœ๋ ฅ๋ฌธ์ด ์‹คํ–‰๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฆฌ๊ธฐ ์œ„ํ•œ ์ถœ๋ ฅ๋ฌธ์ผ ๋ฟ์ด๋‹ˆ ํฐ ์˜๋ฏธ์„ ๊ฐ•์กฐํ•œ๋‹ค. ์ž์œ ๋กญ๊ฒŒ ๋ณ€๊ฒฝํ•˜์ž.

 

for retry_count in {1..10}
do
response=$(curl -s http://localhost:$SWITCH_SERVER_PORT/actuator/health)
count=$(echo $response | grep "UP" | wc -l)

if [ $count -ge 1 ]
then
echo "-> ๐Ÿšจ [$retry_count ๋ฒˆ์งธ Health Check]"
echo "-> โœ… Health Check ์„ฑ๊ณต!!!"
break
else
echo "-> โŒ Health Check ์‹คํŒจ, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."
echo "-> ๐Ÿ“ฃ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต : $response"
fi

if [ $retry_count -eq 10 ]
then
echo "-> ๐Ÿ˜ต‍๐Ÿ’ซ Health Check $retry_count ํšŒ ์‹œ๋„ ๋ชจ๋‘ ์‹คํŒจ..."
echo "-> ๐Ÿซ  ๋ฐฐํฌ ์ข…๋ฃŒ"
exit 1
fi

echo "-> ๐Ÿค” Health Check ์‹คํŒจ, 5์ดˆ ํ›„ ์žฌ์‹œ๋„..."
sleep 5
done
  • wc -l : ์ž…๋ ฅ๋œ ํ…์ŠคํŠธ์˜ ์ค„ ์ˆ˜๋ฅผ ์„ธ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • -ge : "Greater than or equal to"๋ผ๋Š” ์˜๋ฏธ๋กœ, ์—ฌ๊ธฐ์„œ๋Š” ์ €์žฅ๋œ ๊ฐ’์ด 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.
  • -eq : "Equal to"๋ผ๋Š” ์˜๋ฏธ๋กœ, ์ฃผ์–ด์ง„ ๊ฐ’์ด ๋‹ค๋ฅธ ๊ฐ’๊ณผ ๊ฐ™์€์ง€๋ฅผ ๋น„๊ตํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.
  • exit 1 : 0 ์ด์™ธ์˜ ๊ฐ’์€ ์˜ค๋ฅ˜์ž„์„ ๋ช…์‹œํ•˜๊ณ  ํ”„๋กœ๊ทธ๋žจ์„ ์ข…๋ฃŒํ•˜๋ฉฐ, 0์ผ ๊ฒฝ์šฐ ์ •์ƒ ์ข…๋ฃŒ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 
  • ์ด 10 ๋ฒˆ์„ ์ฒดํฌํ•œ๋‹ค. do done ์•ˆ์—๋Š” ๋ฐ˜๋ณต๋ฌธ ๋‚ด์šฉ์ด ๋“ค์–ด๊ฐ„๋‹ค.

 

if [ -z "$CURRENT_SERVER_PORT" ]
then
echo "-> ๐Ÿ”„ NGINX : Default Port๋กœ ํ”„๋ก์‹œ ์„ค์ •"
if [ ! -x "$DEFAULT_SWITCH_SCRIPT" ]
then
chmod +x "$DEFAULT_SWITCH_SCRIPT"
fi
"$DEFAULT_SWITCH_SCRIPT"
echo "->๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ<Jenkins ๋ฐฐํฌ ์„ฑ๊ณต> ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค."
exit 0
fi
  • -z : ๋ณ€์ˆ˜๊ฐ€ ๋น„์–ด์žˆ์„ ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • -x : ํŒŒ์ผ ์‹คํ–‰ ๊ถŒํ•œ์ด ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
  • chmod +x : .sh ํŒŒ์ผ ์‹คํ–‰ ๊ถŒํ•œ์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
  • exit 0 : ์ •์ƒ ์ข…๋ฃŒ์ž„์„ ๋ช…์‹œํ•œ๋‹ค.
  • ์—ฌ๊ธฐ์„œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ถ„๊ธฐ๊ฐ€ ์‹œ์ž‘๋œ๋‹ค.
  • ํ˜„์žฌ ํฌํŠธ๊ฐ€ ๋น„์–ด์žˆ๋‹ค๋ฉด blue, green ๋ชจ๋‘ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ DEFAULT_SWITCH_SCRIPT๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ณ  ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•œ๋‹ค.

 

echo "-> ๐Ÿคผ NGINX ํฌํŠธ ์Šค์œ„์นญ ์Šคํฌ๋ฆฝํŠธ ์‹œ์ž‘"
if [ ! -x "$SWITCH_SCRIPT" ]
then
chmod +x "$SWITCH_SCRIPT"
# .sh ํŒŒ์ผ ์‹คํ–‰ ๊ถŒํ•œ์„ ํ™•์ธํ•˜๊ณ  ์—†์œผ๋ฉด ์ถ”๊ฐ€
fi
"$SWITCH_SCRIPT"

echo "-> ๐Ÿ”ซ ๊ธฐ์กด ํฌํŠธ์ธ $CURRENT_SERVER_PROFILE ํฌํŠธ : $CURRENT_SERVER_PORT KILL"
CURRENT_PORT_PID=$(netstat -anv | grep $CURRENT_SERVER_PORT | head -n 1 | awk '{print $9}')
echo "-> ๐Ÿ“ฆ $CURRENT_SERVER_PROFILE ์˜ PID : $CURRENT_PORT_PID"
kill $CURRENT_PORT_PID >/dev/null 2>&1
echo "->๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ<Jenkins ๋ฐฐํฌ ์„ฑ๊ณต> ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค."
  • ๋งŒ์•ฝ ์œ„์˜ if ๋ฌธ์—์„œ ํ•ด๋‹น์ด ์•ˆ ๋œ๋‹ค๋ฉด(blue or green ์ค‘ ํ•˜๋‚˜๊ฐ€ ์‚ด์•„์žˆ์Œ) ํฌํŠธ ์Šค์œ„์นญ์„ ์œ„ํ•ด ์ด if ๋ฌธ์œผ๋กœ ๋‚ด๋ ค์˜จ๋‹ค.
  • SWITCH_ SCRIPT๋ฅผ ์‹คํ–‰ํ•˜์—ฌ nginx์˜ ํ”„๋ก์‹œ ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ธฐ์กด์— ์‹คํ–‰๋˜๊ณ  ์žˆ๋˜ ํ”„๋กœํ•„์˜ ํฌํŠธ๋ฅผ ์ฃฝ์ธ๋‹ค.
  • ๋งˆ์ง€๋ง‰์œผ๋กœ ์Šคํฌ๋ฆฝํŠธ ์ข…๋ฃŒ๋ฅผ ์•Œ๋ฆฌ๋Š” ์ถœ๋ ฅ๋ฌธ์„ ์ถœ๋ ฅํ•˜๊ณ  ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์€ ์ตœ์ข…์ ์œผ๋กœ ์ข…๋ฃŒ๋œ๋‹ค.

 

๐Ÿ“Œ deploy.sh ์Šคํฌ๋ฆฝํŠธ ์™„์„ฑ๋ณธ

#!/bin/bash

SWITCH_SCRIPT="./switch.sh"

DEFAULT_SWITCH_SCRIPT="./default_switch.sh"

SERVER_HOME=์  ํ‚จ์Šค ์›Œํฌ์ŠคํŽ˜์ด์Šค ๋‚ด ๋นŒ๋“œ ํ…Œ์ŠคํŠธ ๊ฒฝ๋กœ

echo "-> ๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ<Jenkins ๋ฐฐํฌ ์‹œ์ž‘>"
CURRENT_SERVER_PROFILE=$(curl -s http://localhost:28080/profile | head -n 1)

if [ "$CURRENT_SERVER_PROFILE" == blue ]
then
echo "-> ๐Ÿ’ก ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Profile : $CURRENT_SERVER_PROFILE"
CURRENT_SERVER_PORT=8081
SWITCH_SERVER_PROFILE=green
SWITCH_SERVER_PORT=8082
elif [ "$CURRENT_SERVER_PROFILE" == green ]
then
echo "-> ๐Ÿ’ก ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Profile : $CURRENT_SERVER_PROFILE"
CURRENT_SERVER_PORT=8082
SWITCH_SERVER_PROFILE=blue
SWITCH_SERVER_PORT=8081
else
echo "-> โš ๏ธ profile not found : ์ผ์น˜ํ•˜๋Š” Profile์ด ์—†์Šต๋‹ˆ๋‹ค."
echo "-> โš ๏ธ set default profile : ๊ธฐ๋ณธ Profile์ธ blue๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค."
echo "-> โš ๏ธ ๋ธ”๋ฃจ, ๊ทธ๋ฆฐ์ด ๋ชจ๋‘ ๋™์ž‘์ค‘์ด ์•„๋‹ˆ์—ˆ์œผ๋ฏ€๋กœ, blue๋งŒ ๋ฐฐํฌํ•˜๊ณ  ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค."
SWITCH_SERVER_PROFILE=blue
SWITCH_SERVER_PORT=8081
fi

echo "-> ๐Ÿšš $SWITCH_SERVER_PROFILE ๋ฐฐํฌ"
SWITCH_PORT_PID=$(netstat -anv | grep $SWITCH_SERVER_PORT | head -n 1 | awk '{print $9}')
if [ ! -z "$SWITCH_PORT_PID" ]
then
echo "-> ๐Ÿ“ฆ $SWITCH_SERVER_PROFILE ์˜ PID : $SWITCH_PORT_PID"
kill $SWITCH_PORT_PID >/dev/null 2>&1
fi

echo "-> ๐Ÿšš nohup java -jar $SERVER_HOME/forJenkins.jar --spring.profiles.active=$SWITCH_SERVER_PROFILE > /dev/null &"
nohup java -jar $SERVER_HOME/forJenkins.jar --spring.profiles.active=$SWITCH_SERVER_PROFILE > /dev/null &

echo "-> ๐Ÿš‘ $SWITCH_SERVER_PROFILE : 10์ดˆ ํ›„ Health Check Start"
echo "-> ๐Ÿš‘ curl -s http://localhost:$SWITCH_SERVER_PORT/actuator/health"
sleep 10

for retry_count in {1..10}
do
response=$(curl -s http://localhost:$SWITCH_SERVER_PORT/actuator/health)
count=$(echo $response | grep "UP" | wc -l)

if [ $count -ge 1 ]
then
echo "-> ๐Ÿšจ [$retry_count ๋ฒˆ์งธ Health Check]"
echo "-> โœ… Health Check ์„ฑ๊ณต!!!"
break
else
echo "-> โŒ Health Check ์‹คํŒจ, ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‘๋‹ต์„ ๋ฐ›์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค."
echo "-> ๐Ÿ“ฃ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์‘๋‹ต : $response"
fi

if [ $retry_count -eq 10 ]
then
echo "-> ๐Ÿ˜ต‍๐Ÿ’ซ Health Check $retry_count ํšŒ ์‹œ๋„ ๋ชจ๋‘ ์‹คํŒจ..."
echo "-> ๐Ÿซ  ๋ฐฐํฌ ์ข…๋ฃŒ"
exit 1
fi

echo "-> ๐Ÿค” Health Check ์‹คํŒจ, 5์ดˆ ํ›„ ์žฌ์‹œ๋„..."
sleep 5
done

if [ -z "$CURRENT_SERVER_PORT" ]
then
echo "-> ๐Ÿ”„ NGINX : Default Port๋กœ ํ”„๋ก์‹œ ์„ค์ •"
if [ ! -x "$DEFAULT_SWITCH_SCRIPT" ]
then
chmod +x "$DEFAULT_SWITCH_SCRIPT"
fi
"$DEFAULT_SWITCH_SCRIPT"
echo "->๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ<Jenkins ๋ฐฐํฌ ์„ฑ๊ณต> ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค."
exit 0
fi

echo "-> ๐Ÿคผ NGINX ํฌํŠธ ์Šค์œ„์นญ ์Šคํฌ๋ฆฝํŠธ ์‹œ์ž‘"
if [ ! -x "$SWITCH_SCRIPT" ]
then
chmod +x "$SWITCH_SCRIPT"
fi
"$SWITCH_SCRIPT"

echo "-> ๐Ÿ”ซ ๊ธฐ์กด ํฌํŠธ์ธ $CURRENT_SERVER_PROFILE ํฌํŠธ : $CURRENT_SERVER_PORT KILL"
CURRENT_PORT_PID=$(netstat -anv | grep $CURRENT_SERVER_PORT | head -n 1 | awk '{print $9}')
echo "-> ๐Ÿ“ฆ $CURRENT_SERVER_PROFILE ์˜ PID : $CURRENT_PORT_PID"
kill $CURRENT_PORT_PID >/dev/null 2>&1
echo "->๐Ÿ‘จ๐Ÿป‍๐Ÿ’ผ<Jenkins ๋ฐฐํฌ ์„ฑ๊ณต> ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค."

๐Ÿ› ๏ธ NGINX ์„ค์ •

server {
        listen       28080;
        server_name  localhost;

        include /usr/local/etc/nginx/conf.d/service-url.inc;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            proxy_pass $service_url;
            proxy_redirect     off;
            proxy_http_version 1.1;
            proxy_set_header   Host $http_host;
            proxy_set_header   Connection "";
            proxy_set_header   X-Real-IP $remote_addr;
            proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header   X-Forwarded-Host $server_name;
    }
  • nginx๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์„ค์น˜ํ•œ๋‹ค.
  • ๋ณดํ†ต nginx ํด๋”์˜ ๊ฒฝ๋กœ๋Š” ๋‘ ๊ฐ€์ง€์ธ ๊ฒƒ ๊ฐ™๋‹ค.
    • /usr/local/etc/nginx
    • /opt/homebrew/etc/nginx
  • nginx.conf์— ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ ํžŒ ๋‚ด์šฉ์ด ์žˆ์„ ํ…๋ฐ ์ „๋ถ€ ๋ฌด์‹œํ•˜๊ณ  http {} ์•ˆ์— ์œ„์™€ ๊ฐ™์ด ์ ๋Š”๋‹ค.
  • ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๐Ÿ’ก listen

  • ํฌํŠธํฌ์›Œ๋”ฉํ•  ํฌํŠธ์ด๋‹ค.
  • nginx์— ์œ„์™€ ๊ฐ™์ด 28080์ด๋ผ ์ ๋Š”๋‹ค๋ฉด ํฌํŠธ ํฌ์›Œ๋”ฉ๋˜์–ด nginx ํฌํŠธ๋กœ ์ ‘์†ํ•  ๋•Œ 28080 -> 8081 or 28080 -> 8082๋กœ ์Šคํ”„๋ง๋ถ€ํŠธ ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋  ๊ฒƒ์ด๋‹ค.

๐Ÿ’ก include /usr/local/etc/nginx/conf.d/service-url.inc;

  • include๋กœ ํ•ด๋‹น ๊ฒฝ๋กœ์˜ service-url.inc๋ฅผ nginx.conf์— ๊ฐ€์ ธ์˜จ๋‹ค๋Š” ๋œป์ด๋‹ค.
  • nginx ํด๋”์— conf.d๊ฐ€ ์—†๋‹ค๋ฉด ๋งŒ๋“ค์–ด๋„ ๋ฌด๋ฐฉํ•˜๋‹ค. ์ด ํด๋” ์•ˆ์— vi service-url.inc ๋ช…๋ น์–ด๋กœ ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด๋‘”๋‹ค.
  • ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ set \$service_url http://127.0.0.1:8081๊ณผ ๊ฐ™์ด ๋ธ”๋ฃจ or ๊ทธ๋ฆฐ ํฌํŠธ ํ•˜๋‚˜๋ฅผ ์ง€์ •ํ•ด ๋†“๋Š”๋‹ค.(ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด blue๋กœ ํ•ด๋†“์ž.)

๐Ÿ’ก location / {proxy_pass $service_url}

  • ์œ„์˜ service-url.inc์˜ service_url ๋ณ€์ˆซ๊ฐ’์„ ๊ฐ€์ ธ์™€ ์‚ฌ์šฉํ•œ๋‹ค.

 

โŒจ๏ธ NGINX ํ…Œ์ŠคํŠธ

  • ๋กœ์ปฌ์—์„œ ์Šคํ”„๋ง๋ถ€ํŠธ ์„œ๋ฒ„๋ฅผ blue๋กœ ์‹คํ–‰์‹œ์ผœ ๋†“๊ณ  localhost:28080์œผ๋กœ ์ ‘์†ํ•˜๋ฉด 280280 -> 8081๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์Šคํ”„๋ง๋ถ€ํŠธ์˜ ์ถœ๋ ฅ๋ฌธ์ด ํ™”๋ฉด์— ๋‚˜์˜ฌ ๊ฒƒ์ด๋‹ค.

 

๐Ÿ“Œ DEFAULT_SWITCH_SCRIPT

#!/bin/bash

SWITCH_PROXY_PORT=8081
echo "-> โšก๏ธ set default port : ๊ธฐ๋ณธ ํฌํŠธ์ธ $SWITCH_PROXY_PORT ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค."

echo "-> ๐Ÿ”„ NGINX ๋‚ด์˜ ํ”„๋ก์‹œ ๋ฐฉํ–ฅ ์„ค์ •"
echo "-> ๐Ÿฅณ set \$service_url http://127.0.0.1:${SWITCH_PROXY_PORT};"
echo "set \$service_url http://127.0.0.1:${SWITCH_PROXY_PORT};"| tee /usr/local/etc/nginx/conf.d/service-url.inc >/dev/null 2>&1

echo "-> ๐Ÿ”„ NGINX ์žฌ์‹œ์ž‘"
/usr/local/bin/nginx -s reload
  • set a b : a ๋ณ€์ˆ˜์— b๋ฅผ ํ• ๋‹นํ•œ๋‹ค.
  • tee : ์•ž์—์„œ ์ถœ๋ ฅํ•œ ๋ฌธ์ž์—ด์„ ํ•ด๋‹น ๊ฒฝ๋กœ์— ๋ฎ์–ด์“ด๋‹ค.
  • nginx ์„ค์ •์„ ์™„๋ฃŒํ–ˆ๋‹ค๋ฉด ์ด์ œ ์ด ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ดํ•ด๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.
  • ๋งŒ์•ฝ blue, green์ด ๋ชจ๋‘ ์‹คํ–‰ ์ค‘์ด ์•„๋‹ˆ๋ผ๋ฉด ๋””ํดํŠธ ํ”„๋กœํ•„์ธ blue๊ฐ€ ์‹คํ–‰ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • SWITCH ํ•  ํฌํŠธ๋ฅผ 8081๋กœ ์„ค์ •ํ•˜์—ฌ nginx.conf์˜ proxy_pass์— ์—ฐ๊ฒฐํ•  ํฌํŠธ๋ฅผ 8081๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
  • ๋งˆ์ง€๋ง‰์—๋Š” nginx ํด๋”๋กœ ๊ฒฝ๋กœ๋ฅผ ์„ค์ •ํ•˜๊ณ  reload๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
    • ์ด๋ ‡๊ฒŒ ํ•ด์ฃผ๋Š” ์ด์œ ๋Š” ์  ํ‚จ์Šค๊ฐ€ ๋กœ์ปฌ ์„œ๋ฒ„์— ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์‹คํ–‰์‹œํ‚ฌ ๋•Œ nginx ํด๋”๋ฅผ ์ฐพ์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

๐Ÿ“Œ SWITCH_SCRIPT

#!/bin/bash

CURRENT_PROFILE=$(curl -s http://localhost:28080/profile)
echo "-> ๐Ÿ’ก ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ Spring Boot Port : $CURRENT_PROFILE"

if [ $CURRENT_PROFILE == blue ]
then
CURRENT_PROXY_PORT=8081
SWITCH_PROXY_PORT=8082
elif [ $CURRENT_PROFILE == green ]
then
CURRENT_PROXY_PORT=8082
SWITCH_PROXY_PORT=8081
else
echo "-> โš ๏ธ profile not found : $CURRENT_PROFILE -> ์ผ์น˜ํ•˜๋Š” Profile์ด ์—†์Šต๋‹ˆ๋‹ค."
echo "-> โš ๏ธ set default port : ๊ธฐ๋ณธ ํฌํŠธ์ธ 8081์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค."
SWITCH_PROXY_PORT=8081
fi

echo "-> โšก๏ธ ํ˜„์žฌ NGINX ํ”„๋ก์‹œ ํฌํŠธ : $CURRENT_PROXY_PORT"
echo "-> โšก๏ธ ๋ณ€๊ฒฝํ•  NGINX ํ”„๋ก์‹œ ํฌํŠธ : $SWITCH_PROXY_PORT"

echo "-> ๐Ÿ”„ NGINX ๋‚ด์˜ ํ”„๋ก์‹œ ๋ฐฉํ–ฅ ๋ณ€๊ฒฝ"
echo "-> ๐Ÿฅณ set \$service_url http://127.0.0.1:${SWITCH_PROXY_PORT};"
echo "set \$service_url http://127.0.0.1:${SWITCH_PROXY_PORT};"| tee /usr/local/etc/nginx/conf.d/service-url.inc >/dev/null 2>&1

echo "-> โœ… NGINX ์žฌ์‹œ์ž‘"
/usr/local/bin/nginx -s reload
  • SWITCH ์Šคํฌ๋ฆฝํŠธ์˜ ๊ฒฝ์šฐ ๋ณ„๋„์˜ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ ํ•œ๋ฒˆ ํ˜„์žฌ ํฌํŠธ์˜ ํ”„๋กœํ•„์„ ํ™•์ธํ•œ๋‹ค.
  • ์ดํ›„ blue๋ผ๋ฉด green์œผ๋กœ, green์ด๋ผ๋ฉด blue๋กœ ์Šค์œ„์นญํ•  SWITCH ํฌํŠธ ๋ณ€์ˆ˜์— ๊ฐ’์„ ์ฑ„์›Œ์ค€๋‹ค.
  • ํ”„๋ก์‹œ ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๋‚˜์„œ๋Š” ์œ„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ nginx๋ฅผ reload ํ•œ๋‹ค.

 

๐Ÿค” nginx reload ํ…Œ์ŠคํŠธ

  • ์ด ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ๋ณด์ž.

 

  • ์œ„์˜ SWITCH_SCRIPT๋Š” ์ด ๋ถ€๋ถ„์— ํ•ด๋‹น๋˜๋Š” ๊ฒƒ์ธ๋ฐ ๋ฌธ๋“ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค.
  • ์ง€๊ธˆ ๋‚ด๊ฐ€ ํ•˜๋Š” ๋ฐฐํฌ ๋ฐฉ์‹์€ ๊ณผ์—ฐ 100% ๋ฌด์ค‘๋‹จ ๋ฐฐํฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„๊นŒ?
    • blue์—์„œ green์œผ๋กœ, green์—์„œ blue๋กœ nginx ํ”„๋ก์‹œ ๋ฐฉํ–ฅ์„ ๋ณ€๊ฒฝํ•˜๊ณ  nginx reload ํ•˜๋Š” ์ˆœ๊ฐ„ nginx๋Š” ์ฐฐ๋‚˜์˜ ์ˆœ๊ฐ„์ด์ง€๋งŒ ๋ถ„๋ช… ์ค‘๋‹จ๋  ๊ฒƒ์ด๋‹ค.
    • ์ฆ‰, reload ๋˜๋Š” ์ˆœ๊ฐ„ ์š”์ฒญ์ด ๋“ค์–ด์˜จ๋‹ค๋ฉด ๊ทธ ์š”์ฒญ์€ ์ฒ˜๋ฆฌ ๋ชปํ•˜๋Š” ๊ฒŒ ์•„๋‹๊นŒ?
  • ๊ทธ๋ž˜์„œ ์‹คํ—˜ํ•ด ๋ดค๋‹ค.

 

  • ์Šคํ”„๋ง๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ ๋‚ด์— nginx_test.sh์™€ count_line์ด๋ผ๋Š” ํŒŒ์ผ์„ ์ƒ์„ฑํ–ˆ๋‹ค.

 

๐Ÿ“Œ nginx_test.sh

count = 0

while true
do
count=$((count+1))
profile=$(curl -s http://localhost:28080/profile | head -n 1)
current_time=$(date "+%Y-%m-%d %H:%M:%S")
echo "Profile : $profile | Count: $count | Time: $current_time"
done
  • ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ•œ๋‹ค.
  • ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์€ ๊ฐ„๋‹จํ•˜๋‹ค.
    • ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค ํ˜„์žฌ Nginx๊ฐ€ ๋ฐ”๋ผ๋ณด๊ณ  ์žˆ๋Š” ์Šคํ”„๋ง๋ถ€ํŠธ ์„œ๋ฒ„์˜ ํ”„๋กœํ•„์ด ์ถœ๋ ฅํ•˜๊ณ , nginx๊ฐ€ reload ๋˜๊ณ  blue๋กœ ๋ฐ”๋€Œ๋Š” ์ˆœ๊ฐ„ ์–ผ๋งˆ๋‚˜ ์ค‘๋‹จ์ด ์ง€์†๋˜๋Š”์ง€๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
    • ๋ฐ˜๋ณต๋ฌธ ์กฐ๊ฑด์„ true๋กœ ์„ค์ •ํ•˜์—ฌ ๋ฌดํ•œ ๋ฐ˜๋ณตํ•œ๋‹ค.
    • ๋ฐ˜๋ณต๋ฌธ์€ curl ๋ช…๋ น์–ด๋กœ ๋‹ด์‹  profile์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€ "ํ”„๋กœํ•„ | ๋ฐ˜๋ณต๋ฌธ ํšŸ์ˆ˜ | ์ดˆ๋‹จ์œ„ ํ˜„์žฌ์‹œ๊ฐ„์„ ๋งค๋ฒˆ ์ถœ๋ ฅํ•  ๊ฒƒ์ด๋‹ค.
    • deploy.sh ํŒŒ์ผ์„ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ํ•œ๋‹ค.
    • nginx ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ข…๋ฃŒ๋˜์–ด ํ”„๋ก์‹œ ๋ฐฉํ–ฅ์ด ๋ณ€๊ฒฝ๋˜๋ฉด ctrl + c๋กœ nginx_test.sh๋ฅผ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.
    • ์ดํ›„ ์ถœ๋ ฅ๋œ ๋‚ด์šฉ์—์„œ 1์ดˆ ์•ˆ์— ๋ณด๋‚ด์ง„ ์š”์ฒญ์„ ์ž˜๋ผ count_line.txt์— ๋ถ™์—ฌ ๋„ฃ๊ณ  1์ดˆ ์•ˆ์— ๋ช‡ ๋ฒˆ ์ค‘๋‹จ๋˜๋Š”์ง€๋ฅผ ํ™•์ธํ•œ๋‹ค.

 

์‹คํ—˜ ๊ฒฐ๊ณผ

Profile : blue | Count: 442 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 443 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 444 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 445 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 446 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 447 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 448 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 449 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 450 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 451 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 452 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 453 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 454 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 455 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 456 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 457 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 458 | Time: 2023-11-22 21:39:30
Profile : blue | Count: 459 | Time: 2023-11-22 21:39:30
Profile : <!DOCTYPE html> | Count: 460 | Time: 2023-11-22 21:39:30
Profile : green | Count: 461 | Time: 2023-11-22 21:39:30
Profile : green | Count: 462 | Time: 2023-11-22 21:39:30
Profile : green | Count: 463 | Time: 2023-11-22 21:39:30
Profile : green | Count: 464 | Time: 2023-11-22 21:39:30
Profile : green | Count: 465 | Time: 2023-11-22 21:39:30
Profile : green | Count: 466 | Time: 2023-11-22 21:39:30
Profile : green | Count: 467 | Time: 2023-11-22 21:39:30
Profile : green | Count: 468 | Time: 2023-11-22 21:39:30
Profile : green | Count: 469 | Time: 2023-11-22 21:39:30
Profile : green | Count: 470 | Time: 2023-11-22 21:39:30
Profile : green | Count: 471 | Time: 2023-11-22 21:39:30
Profile : green | Count: 472 | Time: 2023-11-22 21:39:30
Profile : green | Count: 473 | Time: 2023-11-22 21:39:30
Profile : green | Count: 474 | Time: 2023-11-22 21:39:30
Profile : green | Count: 475 | Time: 2023-11-22 21:39:30
Profile : green | Count: 476 | Time: 2023-11-22 21:39:30
Profile : green | Count: 477 | Time: 2023-11-22 21:39:30
Profile : green | Count: 478 | Time: 2023-11-22 21:39:30
Profile : green | Count: 479 | Time: 2023-11-22 21:39:30
Profile : green | Count: 480 | Time: 2023-11-22 21:39:30
Profile : green | Count: 481 | Time: 2023-11-22 21:39:30
Profile : green | Count: 482 | Time: 2023-11-22 21:39:30
Profile : green | Count: 483 | Time: 2023-11-22 21:39:30
Profile : green | Count: 484 | Time: 2023-11-22 21:39:30
Profile : green | Count: 485 | Time: 2023-11-22 21:39:30
Profile : green | Count: 486 | Time: 2023-11-22 21:39:30
Profile : green | Count: 487 | Time: 2023-11-22 21:39:30
Profile : green | Count: 488 | Time: 2023-11-22 21:39:30
Profile : green | Count: 489 | Time: 2023-11-22 21:39:30
Profile : green | Count: 490 | Time: 2023-11-22 21:39:30
Profile : green | Count: 491 | Time: 2023-11-22 21:39:30
Profile : green | Count: 492 | Time: 2023-11-22 21:39:30
Profile : green | Count: 493 | Time: 2023-11-22 21:39:30
Profile : green | Count: 494 | Time: 2023-11-22 21:39:30
Profile : green | Count: 495 | Time: 2023-11-22 21:39:30
Profile : green | Count: 496 | Time: 2023-11-22 21:39:30
Profile : green | Count: 497 | Time: 2023-11-22 21:39:30
Profile : green | Count: 498 | Time: 2023-11-22 21:39:30
Profile : green | Count: 499 | Time: 2023-11-22 21:39:30
Profile : green | Count: 500 | Time: 2023-11-22 21:39:30
Profile : green | Count: 501 | Time: 2023-11-22 21:39:30
Profile : green | Count: 502 | Time: 2023-11-22 21:39:30
Profile : green | Count: 503 | Time: 2023-11-22 21:39:30
Profile : green | Count: 504 | Time: 2023-11-22 21:39:30
Profile : green | Count: 505 | Time: 2023-11-22 21:39:30
Profile : green | Count: 506 | Time: 2023-11-22 21:39:30
Profile : green | Count: 507 | Time: 2023-11-22 21:39:30
Profile : green | Count: 508 | Time: 2023-11-22 21:39:30
Profile : green | Count: 509 | Time: 2023-11-22 21:39:30
Profile : green | Count: 510 | Time: 2023-11-22 21:39:30
Profile : green | Count: 511 | Time: 2023-11-22 21:39:30
Profile : green | Count: 512 | Time: 2023-11-22 21:39:30
Profile : green | Count: 513 | Time: 2023-11-22 21:39:30
Profile : green | Count: 514 | Time: 2023-11-22 21:39:30
Profile : green | Count: 515 | Time: 2023-11-22 21:39:30
Profile : green | Count: 516 | Time: 2023-11-22 21:39:30
Profile : green | Count: 517 | Time: 2023-11-22 21:39:30
Profile : green | Count: 518 | Time: 2023-11-22 21:39:30
Profile : green | Count: 519 | Time: 2023-11-22 21:39:30
Profile : green | Count: 520 | Time: 2023-11-22 21:39:30
Profile : green | Count: 521 | Time: 2023-11-22 21:39:30
Profile : green | Count: 522 | Time: 2023-11-22 21:39:30
Profile : green | Count: 523 | Time: 2023-11-22 21:39:30
Profile : green | Count: 524 | Time: 2023-11-22 21:39:30
Profile : green | Count: 525 | Time: 2023-11-22 21:39:30
Profile : green | Count: 526 | Time: 2023-11-22 21:39:30
Profile : green | Count: 527 | Time: 2023-11-22 21:39:30
Profile : green | Count: 528 | Time: 2023-11-22 21:39:30
Profile : green | Count: 529 | Time: 2023-11-22 21:39:30
Profile : green | Count: 530 | Time: 2023-11-22 21:39:30
Profile : green | Count: 531 | Time: 2023-11-22 21:39:30
Profile : green | Count: 532 | Time: 2023-11-22 21:39:30
Profile : green | Count: 533 | Time: 2023-11-22 21:39:30
Profile : green | Count: 534 | Time: 2023-11-22 21:39:30
Profile : green | Count: 535 | Time: 2023-11-22 21:39:30
Profile : green | Count: 536 | Time: 2023-11-22 21:39:30
Profile : green | Count: 537 | Time: 2023-11-22 21:39:30
Profile : green | Count: 538 | Time: 2023-11-22 21:39:30
Profile : green | Count: 539 | Time: 2023-11-22 21:39:30
Profile : green | Count: 540 | Time: 2023-11-22 21:39:30
Profile : green | Count: 541 | Time: 2023-11-22 21:39:30
Profile : green | Count: 542 | Time: 2023-11-22 21:39:30
Profile : green | Count: 543 | Time: 2023-11-22 21:39:30
Profile : green | Count: 544 | Time: 2023-11-22 21:39:30
Profile : green | Count: 545 | Time: 2023-11-22 21:39:30
Profile : green | Count: 546 | Time: 2023-11-22 21:39:30
Profile : green | Count: 547 | Time: 2023-11-22 21:39:30
Profile : green | Count: 548 | Time: 2023-11-22 21:39:30
Profile : green | Count: 549 | Time: 2023-11-22 21:39:30
Profile : green | Count: 550 | Time: 2023-11-22 21:39:30
Profile : green | Count: 551 | Time: 2023-11-22 21:39:30
Profile : green | Count: 552 | Time: 2023-11-22 21:39:30
Profile : green | Count: 553 | Time: 2023-11-22 21:39:30
Profile : green | Count: 554 | Time: 2023-11-22 21:39:30
Profile : green | Count: 555 | Time: 2023-11-22 21:39:30
  • 21์‹œ 39๋ถ„ 30์ดˆ 00์—์„œ 31์ดˆ๊ฐ€ ๋˜๊ธฐ ์ „๊นŒ์ง€ ์ด 114๋ฒˆ์˜ curl ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์„ ํ–ˆ๊ณ  ๊ทธ์ค‘์— ๋”ฑ ํ•œ ๋ฒˆ ์ค‘๋‹จ์ด ๋˜์—ˆ๋‹ค.
  • ์ค‘๋‹จ๋˜๋Š” ์ˆœ๊ฐ„์€ 0.01์ดˆ๋„ ์•ˆ ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค. 
    • 100% ๋ฌด์ค‘๋‹จ์€ ์•„๋‹ˆ์ง€๋งŒ ๊ฑฐ์˜ ๋ฌด์ค‘๋‹จ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?
    • ์ด๋งˆ์ €๋„ ์™„๋ฒฝํžˆ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด nginx๊ฐ€ ์ค‘๋‹จ๋  ๋•Œ ์š”์ฒญ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ฐ€ ์—ฐ๊ฒฐ๋˜๋ฉด ๋ณด๋‚ธ๋‹ค๋Š” ์„ค์ •์„ nginx์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์ง€ ์•Š์„๊นŒ ์ƒ๊ฐํ•œ๋‹ค. ์ด๊ฑด ๋‚˜์ค‘์— nginx๋ฅผ ์ œ๋Œ€๋กœ ๊ณต๋ถ€ํ•  ๋•Œ ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค.

 

๐Ÿ“œ ์ •๋ฆฌ

  • ๋ฐฐํฌ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ์ž‘์„ฑ์ด ๋๋‚ฌ๋‹ค.
  • ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋ฉฐ ๋“ค์—ˆ๋˜ "์„œ๋น„์Šค๊ฐ€ ์ค‘๋‹จ๋˜๋Š” ์ˆœ๊ฐ„์ด ์–ด๋Š ์ •๋„์ผ๊นŒ?"์— ๋Œ€ํ•œ ์˜๋ฌธ๋„ ๊ฐ„๋‹จํ•œ ํ…Œ์ŠคํŠธ๋กœ ์–ด๋Š์ •๋„ ํ•ด๊ฒฐ๋˜์—ˆ๋‹ค.
  • ์ด์ œ ๊ฐ€์žฅ ์ƒ์†Œํ•œ ์ž‘์—…์ด์—ˆ๋˜ Groovy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์  ํ‚จ์Šค ํŒŒ์ผ์„ ์ž‘์„ฑํ•˜๋Š” ๋‹จ๊ณ„๋งŒ ๋‚จ์•˜๋‹ค.
  • ๋‹ค์Œ ๊ธ€์— ๊ณ„์†๋œ๋‹ค.

 

 

 

์ฐธ๊ณ 

๋คผํŠผ

https://hudi.blog/zero-downtime-deployment-with-jenkins-and-nginx/

https://hyunminh.github.io/nonstop-deploy/

https://iizz.tistory.com/341

 

 

 

 

728x90