DevLog ๐ถ
[Jenkins] AWS ์ธ์คํด์ค๋ฅผ ์ ํจ์ค๋ก ๋ฐฐํฌํด๋ณด๊ธฐ - 2ํธ ๋ณธ๋ฌธ
[Jenkins] AWS ์ธ์คํด์ค๋ฅผ ์ ํจ์ค๋ก ๋ฐฐํฌํด๋ณด๊ธฐ - 2ํธ
dolmeng2 2023. 5. 30. 20:32๐ฑ ๋ค์ด๊ฐ๊ธฐ ์
์ง๋ ํฌ์คํ ์ ์ ํจ์ค๋ฅผ ์ค์นํ๊ณ ํ์ํ ํ๋ฌ๊ทธ์ธ์ ์ค์นํ๋ ๊ณผ์ ๊น์ง ์งํํ์๋ค.
๐ฑ ๋ ํ์งํ ๋ฆฌ WebHook ๋ฑ๋กํ๊ธฐ
์ฐ๋ฆฌ๋ ๊นํ๋ธ ๋ ํ์งํ ๋ฆฌ์ ํน์ ๋ธ๋์น์ push ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ์๋์ผ๋ก ๋ฐฐํฌ๊ฐ ์ผ์ด๋๊ฒ ๋ง๋ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์, ํด๋น push ์ด๋ฒคํธ์ ๋ํด์ ๊ฐ์งํ ์ ์๋๋ก 'webhook'์ด๋ผ๋ ์น๊ตฌ๋ฅผ ๋ฑ๋กํด์ผ ํ๋ค.
๋ฑ๋กํ๊ณ ์ถ์ ๋ ํ์งํ ๋ฆฌ์ Settings > Webhooks > Add webhook์ ํด๋ฆญํ๋ค.
์ด๋ฐ ์์ผ๋ก payload URL๊ณผ content-type์ ์ง์ ํด์ค๋ค.
aws ์ธ์คํด์ค๋ก ๋์ ๋ค๋ฉด publicIP:8081๊ณผ ๊ฐ์ ํํ๊ฐ ์ URL์ ๋ค์ด๊ฐ ๊ฒ์ด๋ค.
โญ๏ธ ์ฌ๊ธฐ์ ์ ์ผ ์ค์ํ ๊ฑฐ, ๋์ ๊ผญ /github-webhook/ ๋ถ์ฌ์ค์ผ ํ๋ค... ์ด๊ฑฐ ๋๋ฌธ์ 1์๊ฐ ๋๊ฒ ์ฝ์งํ๋ค.
์ฑ๊ณต์ ์ผ๋ก ์นํ ์ ๋ฑ๋กํ๋ค๋ฉด ์๋์ ๊ฐ์ด ๋ชฉ๋ก์ ๋จ๊ฒ ๋๋ค.
๐ฑ ๊นํ๋ธ ํ ํฐ ๋ฐ๊ธ๋ฐ๊ธฐ
์ ํจ์ค์์ ๊นํ๋ธ์ ๋ํ ์ ๊ทผ ๊ถํ์ ๋ฐ๊ธฐ ์ํด์๋ ๊นํ๋ธ์์ ํค๋ฅผ ๋ฐ๊ธ๋ฐ์ ์ ํจ์ค์๊ฒ ์ค์ ํด์ค์ผ ํ๋ค.
๊นํ๋ธ ๊ณ์ ์ ๋ํ settings์ ๋ค์ด๊ฐ์ค๋ค. ๊ทธ๋ฆฌ๊ณ ์ผ์ชฝ์ ์๋ 'Developer Settings'์ ๋ค์ด๊ฐ๋ค.
Personal access tokens > Tokens (classic) > Generate new token > Generate new token (classic)์ ํด๋ฆญํ๋ค.
๊ทธ๋ฆฌ๊ณ Select Scopes์์ repo, admin:org, admin:repo_hook 3๊ฐ์ง์ ๋ํ ๊ถํ์ ์ค๋ค.
๊ฐ๋จํ๊ฒ ์ค๋ช ํ๋ฉด ๋ ํ์งํ ๋ฆฌ์ ๋ํ ๊ถํ, orgnaization์ ๋ํ ๊ถํ, ๋ ํ์งํ ๋ฆฌ ํ (์นํ ๊ฐ์)์ ๋ํ ๊ถํ์ ์ฃผ๋ ๊ฒ์ด๋ค.
Generate token์ ํด๋ฆญํ๋ฉด ํ ํฐ ์ ๋ณด๊ฐ ๋์ฌ ํ ๋ฐ, ์์ด๋ฒ๋ฆฌ์ง ์๊ฒ ๋ค๋ฅธ ๊ณณ์ ๋ณต์ฌํด๋์.
๐ฑ ์ ํจ์ค์ ๊นํ๋ธ ์ฐ๋ํด์ฃผ๊ธฐ - ํ ํฐ ์ฐ๋
๋จผ์ , ์์์ ๋ฐ๊ธ๋ฐ์ ๊นํ๋ธ ํ ํฐ ์ ๋ณด๋ฅผ ์ ํจ์ค์ ๋ฑ๋กํด์ฃผ๋ ๊ณผ์ ์ ์งํํด์ผ ํ๋ค.
๊นํ๋ธ ๋์๋ณด๋์์ Manage Jenkins > ์๋์ชฝ์ Credentials ํด๋ฆญ!
Stores Scope to Jenkin์์ Domains์ (globals) ํด๋ฆญ. (์ ์ญ์ ์ผ๋ก ์ค์ ์ ๋ฑ๋กํด์ค์ผ ํจ)
Add Credentials ํด๋ฆญ. (1ํธ๋ถํฐ ๋ฐ๋ผํ๋ค๋ฉด ์๋ ์ฌ๊ธฐ์ ssh ํค๋ ์์ด์ผ ํ๋๋ฐ, ์ด์ ์ ์บก์ณํ ์๋ฃ๋ฅผ ๊ฐ์ ธ์ค๋๋ผ ์ด๋ ๊ฒ ๋๋ค... ใ ใ )
์ดํ Username with password ์ง์ ํ, ๊นํ๋ธ ์์ด๋์ ์์์ ๋ฐ๊ธ๋ฐ์ token ์ ๋ณด, ๊ทธ๋ฆฌ๊ณ id๋ฅผ ์ง์ ํด์ค๋ค.
์ต์ข ์ ์ผ๋ก ์ด๋ฐ ๋ชจ์ต์ผ๋ก ๋ฑ๋ก์ด ์๋ฃ๋์์ ๊ฒ์ด๋ค.
๐ก ์ฌ๊ธฐ์ secret-id๋ ์ง๊ธ ์ ๊ฒฝ์ฐ์ง ์์๋ ๋๋ค. ๋ฐ๋ก ์๋์์ ์งํํ ์์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค ใ ใ
๐ฑ ์ ํจ์ค์ ๊นํ๋ธ ์ฐ๋ํด์ฃผ๊ธฐ - ๊นํ๋ธ ์๋ฒ ์ฐ๋
๋ค์ ์ ํจ์ค ๋์๋ณด๋์์ Manage Jenkins > System์ ํด๋ฆญํ๋ค.
๋ด๋ฆฌ๋ค ๋ณด๋ฉด GitHub๋ผ๋ ๊ฒ ์์ ํ ๋ฐ, Name ์ง์ ํ Credentials ๋ฐ์ ์๋ Add > Jenkins๋ฅผ ํด๋ฆญํด์ค๋ค.
๊ทธ๋ผ ์ด๋ฐ ์์ผ๋ก ๋ ๋ค์ Credential์ ๋ฑ๋กํ๋ ๊ณผ์ ์ด ์์ ํ ๋ฐ, ์ฌ๊ธฐ์ ์์์ ๋ฐ๊ธ๋ฐ์ ๊นํ๋ธ token์ ๋ ๋ค์ ๋ฃ์ด์ค๋ค.
์์ ์นํ ๋ฑ๋ก์, ๊นํ๋ธ ์ธก์์ POST ์์ฒญ์ผ๋ก ์ฐ๋ฆฌ์ ์ ํจ์ค ์๋ฒ์ ์์ฒญ์ ๋ณด๋ธ๋ค๊ณ ํ์๋๋ฐ, ์ฌ๊ธฐ์ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ฑ๋กํ๋ ๊ณผ์ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
Credentials์ ์์์ ์ง์ ํ id ๊ฐ์ ์ ํํด์ฃผ๊ณ , Test Connection์ด ์ฑ๊ณตํ๋์ง ํ์ธํ๋ค.
๐ฑ ์ ํจ์ค ์ก ์์ฑํ๊ธฐ
๋ค์ ๋์๋ณด๋๋ก ๋์์์, ์ด๋ฒ์๋ New Item์ ํด๋ฆญํ๋ค.
์์ดํ ์ด๋ฆ์ ์์ ๋กญ๊ฒ ์ค์ ํด์ฃผ๊ณ , Pipeline์ ์ ํํ๋ค.
Github project, Build Triggers > Github hook trigger for GITscm polling์ ์ฒดํฌํ๋ค.
๐ฑ ํ์ดํ๋ผ์ธ ์คํฌ๋ฆฝํธ ์์ฑํ๊ธฐ
์ ๋ง ๋ง์ง๋ง ๋จ๊ณ์ด๋ค. ํ์ดํ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ฅผ ์์ฑํด์ฃผ๋ฉด ๋๋ค.
์ฐ์ , ํ์ฌ ๋์ EC2 ์ ์ฅ์์ ๊ตฌ์กฐ์ด๋ค.
pipeline {
agent any
tools {
gradle 'gradle'
}
stages {
stage('Git Clone') {
steps {
git branch: '{branch_name}', credentialsId: 'secret-id-github', url: '{Git Repository URL}'
}
}
stage('Build') {
steps {
sh "./gradlew clean build"
}
}
stage('Deploy') {
steps {
sshagent(credentials: ['journey-shop-ec2']) {
sh '''
ssh -o StrictHostKeyChecking=no ${DEPLOY_HOST} uptime
scp build/libs/jwp-shopping-order.jar ${DEPLOY_HOST}:/home/ubuntu/jwp-shopping-order
ssh -t ${DEPLOY_HOST} /home/ubuntu/jwp-shopping-order/deploy.sh
'''
}
}
}
}
environment {
DEPLOY_HOST = '{EC2 ์ ์ ์ฌ์ฉ์ ์ด๋ฆ}@{EC2 private IP}'
}
}
๊ณผ์ ์ ๊ฐ๋จํ๋ค.
์ํ๋ ๊น ๋ ํ์งํ ๋ฆฌ์ ๋ธ๋์น์์ clone์ ํ ๋ค์, gradlew๋ฅผ ํตํด ๋น๋๋ฅผ ์งํํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฐํฌ๋ฅผ ์์ํ๋๋ฐ, ssh agent๋ฅผ ์ฌ์ฉํ ๋๋ถ์ ์์ ๊ฐ์ด ssh ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
1. ์๊ฒฉ ํธ์คํธ์ ๋ํด์ SSH ์ฐ๊ฒฐ ํ uptime์ ํตํด ์คํ ์๊ฐ ์ ๋ณด๋ฅผ ํ์ํ๋ค. ์ด๋, ํธ์คํธ์ ๊ณต๊ฐ ํค๋ฅผ ๊ฒ์ฌํ์ง ์๊ณ SSH ์ฐ๊ฒฐ์ ์งํํ๋ค.
2. ์์์ ๋น๋๋ build/libs/jwp-shopping-order.jar ํ์ผ์ ์ง์ ํ ๊ฒฝ๋ก๋ก ๋ณต์ฌํ๋ค.
3. ssh ์ฐ๊ฒฐ ํ deploy.sh ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ๋ค. (๋ฐฐํฌ)
โญ๏ธ ์ด๋, ์๊ฒฉ ํธ์คํธ ์ ๋ณด๋ ์ด๋ฏธ ์ ํจ์ค ์์ฒด๊ฐ EC2 ์์ ๋์์ ธ ์๊ธฐ ๋๋ฌธ์ private IP๋ก ์ ์ํด์ผ ํ๋ค.
๋์ ๊ฒฝ์ฐ ์ ์คํฌ๋ฆฝํธ๋ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์๋ค.
#!/bin/bash
REPOSITORY=/home/ubuntu/jwp-shopping-order
PROJECT_NAME=jwp-shopping-order
cd $REPOSITORY/$PROJECT_NAME/
echo "> ํ์ฌ ๊ตฌ๋์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
pid ํ์ธ"
CURRENT_PID=$(sudo lsof -i tcp:8080 | awk 'NR!=1 {print$2}')
echo "ํ์ฌ ๊ตฌ๋์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> ํ์ฌ ๊ตฌ๋์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ผ๋ฏ๋ก ์ข
๋ฃํ์ง ์์ต๋๋ค."
else
echo "> kill -9 $CURRENT_PID"
sudo kill -9 $CURRENT_PID
sleep 5
fi
echo "> ์ ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ"
JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
rm -rf $REPOSITORY/deploy.log $REPOSITORY/deploy-err.log
nohup sudo java -jar $JAR_NAME --spring.profiles.active=prod --spring.config.location=$REPOSITORY/application.yml >> $REPOSITORY/deploy.log 2> $REPOSITORY/deploy-err.log &
๊ทธ๋ฅ ์ด๋ํ๊ณ , 8080์ผ๋ก ๋์์ง ์ ํ๋ฆฌ์ผ์ด์ ํ์ธ ํ ๊ธฐ์กด์ ๋์๊ฐ๋ ๊ฒ์ ์ ๊ฑฐํ๋ค.
์๋กญ๊ฒ ๋น๋ํ๋ฉด ๊ธฐ์กด์ ๋ก๊ทธ ํ์ผ์ ์ ๊ฑฐํ ๋ค์, cp๋ก ์ธํด ๋ณต์ฌ๋ ํ์ผ์ java-jar๋ฅผ ํตํด์ ์คํํด์ค๋ค ใ ใ
config ์ ๋ณด์ ๊ฒฝ์ฐ ์ธ๋ถ๋ก ๋ ธ์ถ์ํค์ง ์๊ธฐ ์ํด์ ์ธ์คํด์ค ๋ด๋ถ์ ์ ์ฅํด๋๊ณ ์ฌ์ฉํ๊ณ ์๋ค ๐
์๋๋ ์ ํจ์ค ์ฌ์ฉ ์ ์คํฌ๋ฆฝํธ ํ์ผ์ธ๋ฐ, ํน์ ๋์์ด ๋ ์๋ ์์ผ๋ ์ฒจ๋ถํด๋๊ฒ ๋ค.
#!/bin/bash
REPOSITORY=/home/ubuntu/jwp-shopping-order
PROJECT_NAME=jwp-shopping-order
cd $REPOSITORY/$PROJECT_NAME/
echo "> Git Pull"
git pull origin step1
echo "> ํ์ฌ ๊ตฌ๋์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
pid ํ์ธ"
CURRENT_PID=$(sudo lsof -i tcp:8080 | awk 'NR!=1 {print$2}')
echo "ํ์ฌ ๊ตฌ๋์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
pid: $CURRENT_PID"
if [ -z "$CURRENT_PID" ]; then
echo "> ํ์ฌ ๊ตฌ๋์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ผ๋ฏ๋ก ์ข
๋ฃํ์ง ์์ต๋๋ค."
else
echo "> kill -9 $CURRENT_PID"
sudo kill -9 $CURRENT_PID
sleep 5
fi
echo "> ํ๋ก์ ํธ Build ์์"
./gradlew build -x test
echo "> Build ํ์ผ ๋ณต์ฌ"
cp $REPOSITORY/$PROJECT_NAME/build/libs/*.jar $REPOSITORY/
echo "> ์ ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ"
JAR_NAME=$(ls -tr $REPOSITORY/*.jar | tail -n 1)
echo "> JAR Name: $JAR_NAME"
rm -rf $REPOSITORY/deploy.log $REPOSITORY/deploy-err.log
nohup sudo java -jar --Dspring.profiles.active=prod $JAR_NAME --spring.config.location=$REPOSITORY/application.yml >> $REPOSITORY/deploy.log 2> $REPOSITORY/deploy-err.log &
์ต์ข ์ ์ผ๋ก ๋ธ๋์น์ push ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๊ฒ ๋๋ฉด, ์ ํจ์ค ํ์ดํ๋ผ์ธ์ด ๋๋ฉด์ ์์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ ๋ฐฐํฌ์ ์ฑ๊ณตํ๊ฒ ๋๋ค!!
๋๋ฌด ๊ฐ๊ฒฉ์ด๋ค... ๐ฅน
๋ง์ ๋์์ ์ค ๋ฒ ๋ฒ ์๊ฒ ๋ค์ ํ ๋ฒ ๊ฐ์ฌ ์ธ์ฌ ์ฌ๋ฆฝ๋๋ค...
๐โ๏ธ