์์ ์ค์ต ๋ ํฌ์งํ ๋ฆฌ์ ํ๊ฒฝ ์ ํ ์ ์งํํ์ต๋๋ค.
๋ชป ๋ณด์ ๋ถ๋ค์ด ๊ณ์๋ค๋ฉด ๋จผ์ ์ด ํฌ์คํ ์ ๋ณด๊ณ , ๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ต์ ์งํํด์ฃผ์ธ์.
https://programmer-may.tistory.com/213
๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ต ๊ธฐ๋ณธ ์ ํ (Github Actions, Nginx ํ์ฉ)
๋ฌด์ค๋จ ๋ฐฐํฌ ์ด๋ก ์ ๋ํด์ ํ์ต์ ํ์๊ณ , ๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ์ด์ ์ค์ตํด๋ณด๊ฒ ์ต๋๋ค. ์ด๋ก ์ ๊ดํด์๋ ์๋ ํฌ์คํ ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.https://programmer-may.tistory.com/209 ๋ฌด์ค๋จ ๋ฐฐํฌ(Zero-downtime Deployment
programmer-may.tistory.com
๋ธ๋ฃจ ๊ทธ๋ฆฐ ์ ๋ต
๋ธ๋ฃจ ๊ทธ๋ฆฐ ์ ๋ต(Blue-Green Deployment)์ ๋ ๊ฐ์ ๋์ผํ ํ๊ฒฝ(๋ธ๋ฃจ ํ๊ฒฝ๊ณผ ๊ทธ๋ฆฐ ํ๊ฒฝ)์ ์ฌ์ฉํ์ฌ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ๋ธ๋ฃจ ํ๊ฒฝ์์ ํ์ฌ ์ด์ ์ค์ธ ๋ฒ์ ์ ์คํํ๊ณ , ๊ทธ๋ฆฐ ํ๊ฒฝ์์ ์๋ก์ด ๋ฒ์ ์ ๋ฐฐํฌํฉ๋๋ค. ์๋ก์ด ๋ฒ์ ์ด ์ค๋น๋๋ฉด ํธ๋ํฝ์ ๋ธ๋ฃจ ํ๊ฒฝ์์ ๋ชจ๋ ํ๋ฒ์ ๊ทธ๋ฆฐ ํ๊ฒฝ์ผ๋ก ์ ํํ์ฌ ๋ฐฐํฌ๋ฅผ ์๋ฃํฉ๋๋ค.
๋ฐฐํฌ๊ฐ ์๋ฃ๋ ํ ๊ธฐ์กด ๊ตฌ ๋ฒ์ ์ด ์๋ ํ๊ฒฝ์ ๋ค์ ๋ฐฐํฌ๋ฅผ ์ํด ์ฌ์ฌ์ฉํ๊ฑฐ๋ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
bluegreen_before ๋ธ๋์น
๋ธ๋ฃจ๊ทธ๋ฆฐ ๋ฌด์ค๋จ ๋ฐฐํฌ ์ ๋ต ๋์ ์ ํ๊ฒฝ์ ๊ตฌ์ถํฉ๋๋ค. cd-bluegreen.yml ํ์ผ์ ํตํด JAR ํ์ผ์ ์ ๋ก๋ํ๊ณ , ์ด์ ํ๋ก์ธ์ค๋ฅผ ์ฃฝ์ด๊ณ JAR ํ์ผ์ 8081ํฌํธ์์ ์คํํฉ๋๋ค. ์ด ๊ณผ์ ์์ ๋ค์ด ํ์์ด ๋ฐ์ํ๊ฒ ๋ฉ๋๋ค.
bluegreen_after ๋ธ๋์น
๋ธ๋ฃจ๊ทธ๋ฆฐ ์ ๋ต ๋์ ํ์ฌ ๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ์คํํฉ๋๋ค. cd-bluegreen.yml ํ์ผ์ ํตํด deploy.sh ํ์ผ์ ์คํํฉ๋๋ค.
deploy.sh ์ ํ
๋จผ์ Termius ์ผ์ EC2 ์ ์๊ฒฉ์ ์์ ์งํํฉ๋๋ค.
ํด๋น ๋๋ ํ ๋ฆฌ์ ๋ฐฐํฌ์ฉ ์ ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ญ๋๋ค. ๊ฒฝ๋ก์ ๊ธ์๊ฐ ํ๋ฆฌ์ง ์๊ฒ ์กฐ์ฌํด์ฃผ์ธ์.
$ sudo nano /home/ubuntu/cicd/bluegreen/deploy.sh
ํด๋น ์คํฌ๋ฆฝํธ๋ฅผ ๋ณต๋ถํด์ ๋ฃ์ด์ค๋๋ค.
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ด ์์ต๋๋ค.
์ด๊ณณ์์ zeroDownTimeDeployment ๋ํ jar ํ์ผ ๋ช ์ ๋ณ๊ฒฝํด์ค์ผํ ์ ์์ต๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์ง์ ์์ฑํด์ ๋ฐ๋ผํ์๋ ๋ถ์ด๋ rootProject.name ์ด ๋ค๋ฅธ ์ฌ๋์ ๋น๋ํ์ ๋ ๋ค๋ฅธ ์ด๋ฆ์ jar ํ์ผ์ด ์๊ธฐ๊ธฐ ๋๋ฌธ์ ์ด๋ถ๋ถ์ ๋ง๊ฒ ๋ฐ๊ฟ์ค์ผํฉ๋๋ค.
๋ณธ์ธ์ ํ๋ก์ ํธ์ settings.gradle ์ rootProject.name ๊ฐ์ zeroDownTimeDeployment ๋์ ๋ฃ์ด ์ค๋๋ค.
๋ค์ -*.jar ๋ ๊ทธ๋๋ก ์ ์งํด์ผํฉ๋๋ค. ๋น๋์ rootProject.name -๋ฒ์ -SNAPSHOT.jar ๋ก jar ํ์ผ์ด ๋ง๋ค์ด์ง๊ธฐ ๋๋ฌธ์
๋๋ค.
#!/bin/bash
# ํ์ฌ ์คํ ์ค์ธ Spring Boot ์ ํ๋ฆฌ์ผ์ด์
ํฌํธ ์๋ณ
CURRENT_PORT=$(sudo ss -tulnp | grep java | awk '{print $5}' | grep -o '[0-9]*$')
echo "Current port is: $CURRENT_PORT"
# ๊ธฐ๋ณธ ํฌํธ ์ค์
PORT1=8081
PORT2=8082
NEW_PORT=0
# ํ์ฌ ํฌํธ์ ๋ฐ๋ผ ์ ํฌํธ ๊ฒฐ์
if [ -z "$CURRENT_PORT" ]; then
# ์คํ ์ค์ธ ํฌํธ๊ฐ ์์ผ๋ฉด ๊ธฐ๋ณธ ํฌํธ ์ฌ์ฉ
NEW_PORT=$PORT1
elif [ "$CURRENT_PORT" -eq "$PORT1" ]; then
NEW_PORT=$PORT2
else
NEW_PORT=$PORT1
fi
echo "Deploying new application on port: $NEW_PORT"
# ๊ธฐ์กด์ app.jar ํ์ผ์ old_build ๋๋ ํ ๋ฆฌ๋ก ์ด๋
TIMESTAMP=$(date +"%Y%m%d%H%M%S")
if [ -f /home/ubuntu/cicd/app.jar ]; then
mv /home/ubuntu/cicd/app.jar /home/ubuntu/cicd/old_build/$TIMESTAMP.jar
fi
# ์๋ก ๋ฐฐํฌ๋ .jar ํ์ผ์ app.jar๋ก ์ด๋ฆ ๋ณ๊ฒฝ
NEW_JAR=$(ls /home/ubuntu/cicd/zeroDownTimeDeployment-*.jar | head -n 1)
mv $NEW_JAR /home/ubuntu/cicd/app.jar
# ์๋ก ๋ฐฐํฌ๋ app.jar ํ์ผ ์คํ
sudo chmod +x /home/ubuntu/cicd/app.jar
sudo nohup java -jar -Dserver.port=$NEW_PORT /home/ubuntu/cicd/app.jar > /home/ubuntu/console.log 2>&1 &
sleep 10
# ์ ์ ํ๋ฆฌ์ผ์ด์
์ด ์ ์์ ์ผ๋ก ์คํ๋์๋์ง ํ์ธ
CHECK_URL=http://localhost:$NEW_PORT/actuator/health
RETRY_COUNT=0
MAX_RETRY=10
until $(curl --output /dev/null --silent --head --fail $CHECK_URL); do
sleep 5
if [ ${RETRY_COUNT} -eq ${MAX_RETRY} ]; then
echo "New application failed to start. Deployment aborted."
# ํฌ์ค ์ฒดํฌ ์คํจ ์ $NEW_PORT์์ ์คํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ ์ข
๋ฃ
NEW_PID=$(lsof -t -i:$NEW_PORT)
if [ -n "$NEW_PID" ]; then
echo "Terminating process on port $NEW_PORT with PID $NEW_PID"
sudo kill -9 $NEW_PID
fi
exit 1
fi
RETRY_COUNT=$((RETRY_COUNT+1))
done
# Nginx ์ค์ ํ์ผ์์ proxy_pass ๋์ ์ผ๋ก ๋ณ๊ฒฝ
NGINX_CONFIG="/etc/nginx/sites-available/default"
NEW_PROXY_PASS="proxy_pass http://127.0.0.1:$NEW_PORT;"
# listen 80๋ฒ ํฌํธ์ location / ๋ธ๋ก ๋ด์์ proxy_pass ์ค๋ง ๋ณ๊ฒฝ
sudo sed -i '/location \/ {/!b;n;s|proxy_pass http://127.0.0.1:.*;|'"$NEW_PROXY_PASS"'|' $NGINX_CONFIG
# sed ๋ช
๋ น์ด๊ฐ ์ฑ๊ณตํ๋์ง ํ์ธ
if [ $? -ne 0 ]; then
echo "Error: Failed to update Nginx config."
exit 1
fi
# Nginx ์ค์ ์ฌ๋ก๋
sudo service nginx reload
# ์ด์ ์ ํ๋ฆฌ์ผ์ด์
์ข
๋ฃ
OLD_PID=$(lsof -t -i:$CURRENT_PORT)
if [ -n "$OLD_PID" ]; then
sudo kill -15 $OLD_PID
sleep 7
# ํ๋ก์ธ์ค๊ฐ ์ฌ์ ํ ์ข
๋ฃ๋์ง ์์๋์ง ํ์ธํ๊ณ , ๊ฐ์ ์ข
๋ฃ ์๋
if sudo kill -0 $OLD_PID 2>/dev/null; then
echo "Process $OLD_PID did not terminate, killing with -9"
sudo kill -9 $OLD_PID
fi
fi
echo "Deployment complete. Nginx is routing traffic to port $NEW_PORT."
๋ณต๋ถ์ด ์๋ฃ ๋๋ค๋ฉด, ctrl + o ๋ฅผ ์ ๋ ฅํ๊ณ ์ํธ๋ฅผ ๋๋ฌ์ ์ ์ฅํด ์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ctrl + x ๋ฅผ ๋๋ฌ์ ํธ์ง๊ธฐ์์ ๋๊ฐ๋๋ค.
Nginx ์ค์ ์ ํ
์ ๋ฒ ํฌ์คํ ์์ ์์ง์์ค์ ์ค์ ์ ๋ฐ๊ฟจ๋ค๋ฉด ์๊ด์ด ์๊ฒ ์ง๋ง ๊ทธ๋๋ ํ์ธํด์ฃผ๊ฒ ์ต๋๋ค.
$ sudo nano /etc/nginx/sites-available/default
์ ๋ ฅํ์ฌ ํธ์ง๊ธฐ๊ฐ ๋์์ ๋ ๋ค์๊ณผ ๊ฐ์ด ๋์ค๋ฉด ๋ฉ๋๋ค.
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;
}
}
bluegreen_ver1 ์ ํ
bluegreen_ver1 ๋ธ๋์น๋ก checkout ํด์ค๋๋ค.
๊ทธ๋ฆฌ๊ณ ํฐ๋ฏธ๋์ ์ผ์ git pull origin bluegreen ์ ๋ ฅํ์ฌ ๋ณ๊ฒฝ์ฌํญ์ ํด๋น ๋ธ๋์น์ ๋ฐ์ํด์ค๋๋ค.
๋ง์ฝ ์ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ fork ํด์ ํ๋ ๊ฒ์ด ์๋๋ผ ๋ ํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํด์ ๋ฐ๋ผํ์๋ ๋ถ์ด๋ฉด, main ๋ธ๋์น ๋ด์ฉ์ main ๋ธ๋์น ๋ณต๋ถ ํด์ ํธ์ํ๊ณ , ๊นํ๋ธ์์ main ๋ธ๋์น๋ฅผ ๋ณธ๋ฐ bluegreen, rolling, canary ๋ธ๋์น๋ฅผ ๋ง๋์๋ฉด ๋ฉ๋๋ค.
๋ง์ฝ ๋ณ๊ฒฝ์ฌํญ์ด ์์ด์ bluegreen_ver1 ๋ธ๋์น bluegreen๋ธ๋์น์ ํ๋ฆฌํ๋ฅผ ๋ณด๋ผ ์ ์์ ์๋ ์๊ธฐ์ ์์ ์ฌํญ์ ๋ง๋ค์ด ์ค๋๋ค.
TestController ์์ ๋ณํ๋ฅผ ์ฃผ๋ ๊ฑธ ์ถ์ฒ๋๋ฆฝ๋๋ค.
์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํ์ฌ ๊ธฐ๋ณธ๊ฐ์ ์ฃผ์์ต๋๋ค.
@RestController
public class TestController {
private static final String RESPONSE_BODY_MESSAGE = "๋ฒ์ 1 ์๋ต๊ฐ์
๋๋ค. ๋ฌด์ค๋จ ๋ฐฐํฌ๋ฅผ ๋์
์ ์
๋๋ค.";
@GetMapping("/hello")
public ResponseEntity test() {
return ResponseEntity.ok(RESPONSE_BODY_MESSAGE);
}
}
์์ ์ ํ ๋ ๊ตฌ๊ธ ์๋ฐ ์ปจ๋ฒค์ ์ ci ์ฒดํฌ์คํ์ผ ์ค์ ํ๊ธฐ ๋๋ฌธ์ ํ์ค์ 100๊ธ์๊ฐ ๋์ด๊ฐ์ง ์๋๋ก ์กฐ์ฌํด์ฃผ์ธ์! ํ์ฌ ๊ธฐ๋ณธ ์ํ๋ ๊ฑฐ์ 99์ 98์ ๋๋ ๊ฑฐ ๊ฐ๋ค์. ํฐ์ ์ค์ด 100๊ธ์ ํ์ ์ ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ cd-bluegreen.yml ํ์ผ์ ํ์ธํด์ค๋๋ค.
๋ค์๊ณผ ๊ฐ์ด jarํ์ผ์ ์ ๋ก๋ ํ๊ณ ์คํํ๋ ๋ช ๋ น์ด๋ก ๋์ด ์์ด์ผํฉ๋๋ค. ๋ง์ฝ ๋ด์ฉ์ด ๋ค๋ฅด๋ค๋ฉด ๋ณต๋ถ์ ํ์ฌ์ค๋๋ค.
name: Build and Deploy
on:
push:
branches:
- bluegreen
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: application.yml
run: |
mkdir -p src/main/resources
touch ./src/main/resources/application.yml
echo "${{ secrets.APPLICATION_YML }}" > ./src/main/resources/application.yml
cat ./src/main/resources/application.yml
- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew
- name: Build with Gradle
uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
with:
arguments: build
- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: build-file
path: build/libs/*.jar
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Download artifact
uses: actions/download-artifact@v2
with:
name: build-file
- name: Setup SSH
uses: webfactory/ssh-agent@v0.5.4
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Add remote server to known hosts
run: |
mkdir -p ~/.ssh
ssh-keyscan ${{ secrets.SERVER_IP }} >> ~/.ssh/known_hosts
- name: Rename and transfer artifact
run: |
mv *.jar app.jar
scp app.jar ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_IP }}:~/cicd/
- name: Execute remote commands
run: |
ssh -v ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_IP }} "sudo fuser -k 8081/tcp || true"
ssh -v ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_IP }} "sudo fuser -k 8082/tcp || true"
ssh -v ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_IP }} "sudo nohup /usr/bin/java -jar -Dserver.port=8081 ~/cicd/app.jar > ~/cicd/nohup.log 2>&1 &"
์์ ํ ์ปค๋ฐํ๊ณ ํธ์ ํด์ค๋๋ค.
Pull request ์์ฑ
๊นํ๋ธ์ ํ๋ฆฌํ๋ฅผ ๋ณด๋ ๋๋ค.
base ๋ bluegreen์ด๊ณ compare ์ bluegreen_ver1 ์ด์ฌ์ผ ํ๋ ๊ฑธ ๊ผญ ํ์ธํด์ฃผ์ธ์. ๋ํดํธ ๋ธ๋์น๊ฐ main ์ผ๋ก ๋์ด ์์ด์ base๊ฐ main์ผ๋ก ๋์ด ์์ ๊ฒ์ ๋๋ค. ๊ผญ ์์ ํด์ค์ผํฉ๋๋ค. bluegreen ์ ํธ์ ๋์ด์ผ ๊นํ๋ธ ์ก์ ์ค๊ฐ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ฒดํฌ ์คํ์ผ ํ ์คํธ์ ๋น๋ ํ ์คํธ๋ฅผ ํต๊ณผํ๊ฒ ๋๋ฉด merge pull reqeust ํด์ค๋๋ค.
๊ทธ๋ฌ๋ฉด Actions ์ ๋ค์ด๊ฐ๋ฉด ๋ฐฐํฌ๊ฐ ์งํ๋๊ณ ์๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
์ด๋ ๊ฒ ๋๋ฉด ๋ฐฐํฌ๊ฐ ์๋ฃ๋ ๊ฒ์ ๋๋ค.
ํฌ์คํธ๋งจ์ ํตํด์ {http://EC2 ํผ๋ธ๋ฆญ IP/hello} ์์ฒญ์ ๋ณด๋ด๋ฉด ๋ฌด์ค๋จ ๋ฐฐํฌ ์ ์ด๋ผ๋ ๋ง๊ณผ 8081 ํฌํธ์์ ์คํ ์ค์ธ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
bluegreen_ver2 ์ ํ
blueegreen_ver2 ๋ธ๋์น๋ก checkout ํด์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ git pull origin bluegreen ํ์ฌ ๋ณ๊ฒฝ์ ์ ์ต์ ํ ํด์ค๋๋ค.
ver2 ๋ ๋ฌด์ค๋จ ๋ฐฐํฌ ๋์ ๋ฒ์ ์ด๋๊น, ๊ทธ์ ๋ง๊ฒ ์์ ์ ํด์ค ๊ฒ๋๋ค.
๋จผ์ ์๋ต๊ฐ์ ์์ ํด์ฃผ๊ฒ ์ต๋๋ค.
์ด๋ ๊ฒ ๋ฒ์ 2์ด๋ผ๋ ๊ฑธ ํ์คํ๊ฒ ๋ช ์ํด์คฌ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ผ ์ค์ํ cd-bluegreen.yml ์ ์์ ํ๊ฒ ์ต๋๋ค.
jar ํ์ผ์ ์ ๋ก๋ํ๊ณ ์คํํ๋ ๊ฒ์ด ์๋, cicd/bluegreen/ ๋๋ ํ ๋ฆฌ์ ์๋ deploy.sh ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์์ผ์ค ๊ฒ์ ๋๋ค.
name: Build and Deploy
on:
push:
branches:
- bluegreen
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up JDK 17
uses: actions/setup-java@v3
with:
java-version: '17'
distribution: 'temurin'
- name: application.yml
run: |
mkdir -p src/main/resources
touch ./src/main/resources/application.yml
echo "${{ secrets.APPLICATION_YML }}" > ./src/main/resources/application.yml
cat ./src/main/resources/application.yml
- name: Run chmod to make gradlew executable
run: chmod +x ./gradlew
- name: Build with Gradle
uses: gradle/gradle-build-action@bd5760595778326ba7f1441bcf7e88b49de61a25 # v2.6.0
with:
arguments: build
- name: Upload artifact
uses: actions/upload-artifact@v2
with:
name: build-file
path: build/libs/*.jar
deploy:
needs: build
runs-on: ubuntu-latest
steps:
- name: Download artifact
uses: actions/download-artifact@v2
with:
name: build-file
- name: Setup SSH
uses: webfactory/ssh-agent@v0.5.4
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Add remote server to known hosts
run: |
mkdir -p ~/.ssh
ssh-keyscan ${{ secrets.SERVER_IP }} >> ~/.ssh/known_hosts
- name: SCP transfer
run: scp *.jar ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_IP }}:~/cicd
- name: Execute remote command
run: |
ssh -v ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_IP }} "sudo chmod +x ~/cicd/bluegreen/deploy.sh"
ssh -v ${{ secrets.SERVER_USERNAME }}@${{ secrets.SERVER_IP }} "sudo ~/cicd/bluegreen/deploy.sh"
์ํ์น ์ ์ด๋ฏธํฐ ํ ์คํธ ์ ํ
ํ ์คํธ๋ฅผ ํ์ฌ ๋ชจ๋ํฐ๋ง ํ๊ณ ์ถ์ผ์ ๋ถ๋ค์๊ฒ ์ถ์ฒ๋๋ฆฝ๋๋ค.
๋งค ๊ฐ๊ฒฉ๋ง๋ค HTTP ์์ฒญ์ ๋ณด๋ด์ ์ ๋ง ๋ค์ด ํ์ ์์ด ๋ฐฐํฌ๊ฐ ์งํ๋๋์ง ์ค์ ๋ก ๋ณด๊ธฐ ์ํจ์ผ ๋ฟ์ ๋๋ค.
๋จผ์ Simple HTTP rquest ํ ํ๋ฆฟ์ ์์ฑํ๊ฒ ์ต๋๋ค.
HTTP ๋ฉ์๋์ URL ์ ์ ๋ ฅํด์ค๋๋ค. URL์ HTTP ํ๋กํ ์ฝ๊ณผ ์์ ์ EC2 ํผ๋ธ๋ฆญ IP ๋ฅผ ๋ฃ์ด์ฃผ๋ฉด ๋ฉ๋๋ค.
์ํ์น ์ ์ด๋ฏธํฐ์ ํต์ฌ์ ์ฐ๋ ๋ ๊ทธ๋ฃน ์ค์ ์ ๋๋ค. ๊ทผ๋ฐ ์ ํฐ ์ฑ๋ฅ ํ ์คํธ ์๋๋ฆฌ์ค๋ฅผ ์ ๊ฒฝ์ธ ๊ฑด ์๋๋ผ์, ๋๋ต 7๋ถ์ ๊ธฐ์ค์ผ๋ก ์ ๋นํ ์์ฒญ ๊ฐ๊ฒฉ์ ๋ณด๋ด๊ธฐ ์ํด Ramp-up ์๊ฐ์ 420 ์ ์ฌ์ฉ์ ์๋ฅผ 200 ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๊ธฐ ์ํด์ ๊ฒฐ๊ณผ ํธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ์ถ๊ฐํ๊ฒ ์ต๋๋ค. ํ ์คํธ์์ ์ฐํด๋ฆญํ๋ฉด ์ถ๊ฐํ ์ ์์ต๋๋ค.
์คํ ๋ฒํผ์ ๋๋ฅด๋ฉด ํ ์คํธ๋ฅผ ํ์ผ๋ก ์ ์ฅํ๋ผ๋ ๋ง์ด ๋์ค๋๋ฐ, ์ ๋นํ ๊ฒฝ๋ก์ ์ํ๋ ์ด๋ฆ์ผ๋ก ์ ์ฅํฉ๋๋ค.
pull request๋ฅผ ๋จธ์งํ๊ณ ๋์ ํ ์คํธ๋ฅผ ์์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
Pull request ์์ฑ
๊นํ๋ธ์ ํ๋ฆฌํ๋ฅผ ๋ณด๋ ๋๋ค.
base ๋ bluegreen์ด๊ณ compare ์ bluegreen_ver2 ์ด์ฌ์ผ ํ๋ ๊ฑธ ๊ผญ ํ์ธํด์ฃผ์ธ์. ver1 ๋์ ๋๊ฐ์ต๋๋ค.
์ฒดํฌ์คํ์ผ ํ ์คํธ ํต๊ณผ์ ๋น๋ ํ ์คํธ ํต๊ณผ๋ฅผ ํ๋ฉด merge pull request ํด์ค๋๋ค.
ํธ์ ๋๊ณ ๋์ ์ก์ ์ค๊ฐ ๋์๊ฐ๋ฉด ์ํ์น ์ ์ด๋ฏธํฐ์์ ์ด๋ก์ ์ฌ์ ๋ฒํผ์ ๋๋ฌ์ค๋๋ค.
์ํ์น ์ ์ด๋ฏธํฐ์์ ๊ฒฐ๊ณผ๋ฅผ ํธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ๋๋ฌ๋ณด๋ฉด ๊ธฐ์กด์ ๋ฐฐํฌ๋ ๋ฒ์ 1๊ณผ 8081ํฌํธ์์ ์คํ๋๊ณ ์๋ ๊ฑธ ํ์ธํ ์ ์์ต๋๋ค.
๋ฐฐํฌ๊ฐ ์๋ฃ๋๊ณ ๋์ , ๋ฒ์ 2 ์๋ต๊ฐ๊ณผ ๋ฌด์ค๋จ ๋ฐฐํฌ๊ฐ ์ ๋์ ๋ ๊ฑธ ํ์ธ ํ ์ ์์ต๋๋ค.
ํ๋ณธ ์ถ์ถ๊ธฐ ์์ ์๋ต ๋ฐ์ดํฐ ํญ์์ ์๋ต body ์์ ํ์ธ ํ ์ ์์ต๋๋ค.
8081 ์์ ์คํ๋๋ ๋ธ๋ฃจ ์๋ฒ๊ฐ 8082 ์์ ๊ทธ๋ฆฐ ์๋ฒ๋ก ๋์ฒด๋๊ณ ๊ตฌ๋ฒ์ ์์ ์ ๋ฒ์ ์ผ๋ก ๋ค์ดํ์ ์์ด ์ ๋ฐฐํฌ๋๋ ๊ฑธ ์ค์ตํด ๋ณผ ์ ์์์ต๋๋ค.
๋ธ๋ฃจ๊ทธ๋ฆฐ ๋ฐฐํฌ ์ ๋ต์ ์๋ก์ด ๋ฒ์ ์ ๋ณ๋์ ํ๊ฒฝ์ ๋ฐฐํฌํ ํ, ํธ๋ํฝ์ ์ ํํ์ฌ ๋ค์ดํ์ ์์ด ๋ฐฐํฌ๋ฅผ ์๋ฃํ๋ ๋ฐฉ์์ ๋๋ค. ์ด ์ ๋ต์ ์ฅ์ ์ ๋ฐฐํฌ ์ค ์ค๋ฅ ๋ฐ์ ์ ๊ฐํธํ๊ฒ ์ด์ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑํ ์ ์์ด ์์ ์ฑ์ด ๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ํ, ํธ๋ํฝ ์ ํ์ด ๋น ๋ฅด๊ฒ ์ด๋ฃจ์ด์ ธ ์๋น์ค์ ์ค๋จ์ด ์๋ค๋ ์ ๋ ๊ฐ์ ์ ๋๋ค. ๊ทธ๋ฌ๋ ๋จ์ ์ผ๋ก๋ ๋ ๊ฐ์ ์์ ํ ์ธํ๋ผ๋ฅผ ์ ์งํด์ผ ํ๋ฏ๋ก, ๋น์ฉ์ด ์ฆ๊ฐํ ์ ์์ผ๋ฉฐ, ๋ณต์กํ ํ๊ฒฝ ์ค์ ์ด ํ์ํ ์ ์๋ค๋ ์ ์ด ์์ต๋๋ค. ์ง๊ธ ์ค์ต์์ ์ ๋ฒ์ ์ด ์ ๋ฐฐํฌ๋๋ฉด ๊ตฌ ๋ฒ์ ์ ํ๋ก์ธ์ค๋ ์์ ํ๊ฒ kill ํด์ฃผ์์ต๋๋ค. ์ค์ ์ด ๋ณต์กํ๊ธด ํ์ง๋ง, ๋กค๋ง๊ณผ ์นด๋๋ฆฌ ์ ๋ต๋ณด๋ค๋ ๋ณต์กํ์ง ์์ ๊ฒ๋ ์ฅ์ ์ด ๋ ์ ์์ ๊ฑฐ ๊ฐ์ต๋๋ค.
ํฌ์คํธ๋งจ์ผ๋ก ๊ตฌ ๋ฒ์ ์ด ๋์๊ฐ๋ ํฌํธ๋ฒํธ๋ก ํฌ์ค ์์ฒญ์ ๋ณด๋ด๋ฉด ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ด๋ ค๊ฐ ๊ฑธ ํ์ธ ํ ์ ์์ต๋๋ค.
'DevOps > CI&CD' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ต - ์นด๋๋ฆฌ ์ ๋ต (0) | 2024.09.07 |
---|---|
๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ต - ๋กค๋ง ์ ๋ต (0) | 2024.09.06 |
๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ต ๊ธฐ๋ณธ ์ ํ (Github Actions, Nginx ํ์ฉ) (0) | 2024.08.13 |
๋ฌด์ค๋จ ๋ฐฐํฌ(Zero-downtime Deployment) ์ ๋ต (0) | 2024.07.23 |
CI/CD ๋ ๋ฌด์์ธ๊ฐ? (0) | 2024.07.17 |
๋๊ธ