๐Ÿณ ์ธํ”„๋ผ/Jenkins

Jenkins ์›๊ฒฉ ์„œ๋ฒ„ ๋ฐฐํฌ(Publish Over SSH) (4)

๊ณ„๋ž€์†Œ๋…„ 2024. 5. 13. 16:15

1. ์  ํ‚จ์Šค ํŒŒ์ดํ”„๋ผ์ธ ์„ค์ •

Dashboard > New Item > Pipeline

Github project์— webhook ๋“ฑ๋กํ•œ repository URL ์ž…๋ ฅ

Build Triggers > Github hook trigger for GITscm polling ์ฒดํฌ

 

ํŒŒ์ดํ”„๋ผ์ธ 

 

ํฌ๊ฒŒ 3๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  1. Git Clone ๋‹จ๊ณ„
    • Git ์ €์žฅ์†Œ์—์„œ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋‹จ๊ณ„
    • branch ๊ฐ€์ ธ์˜ฌ ๋ธŒ๋žœ์น˜๋ฅผ ์ง€์ •
    • credentialsId ์‚ฌ์šฉํ•  Git ์ž๊ฒฉ ์ฆ๋ช…์˜ ID๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์‚ฌ์ „์— Jenkins์—์„œ ์„ค์ •๋œ ๊ฒƒ
    • url ๊ฐ€์ ธ์˜ฌ Git ์ €์žฅ์†Œ์˜ URL์„ ์ง€์ •
  2. Build ๋‹จ๊ณ„
    • Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๋Š” ๋‹จ๊ณ„
    • ./gradlew clean build ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ Gradle ๋นŒ๋“œ๋ฅผ ์ˆ˜ํ–‰
  3. Deploy ๋‹จ๊ณ„
    • sshagent ๋ธ”๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ SSH ์ž๊ฒฉ ์ฆ๋ช…์„ ์„ค์ •. ์‚ฌ์ „์— Jenkins์—์„œ ์„ค์ •๋œ ๊ฒƒ
    • ${DEPLOY_HOST} ๋ณ€์ˆ˜๋Š” ๋ฐฐํฌํ•  ํ˜ธ์ŠคํŠธ์˜ ์ฃผ์†Œ
    • scp ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๋นŒ๋“œ๋œ JAR ํŒŒ์ผ์„ ๋ฐฐํฌ ํ˜ธ์ŠคํŠธ๋กœ ์ „์†ก
    • deploy.sh ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์‹ค์ œ ๋ฐฐํฌ ์ž‘์—…์„ ์ˆ˜ํ–‰
  4. environment ๋ธ”๋ก
    • ํŒŒ์ดํ”„๋ผ์ธ ์‹คํ–‰ ์ค‘ ์‚ฌ์šฉํ•  ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ •์˜
    • DEPLOY_HOST ๋ฐฐํฌํ•  ํ˜ธ์ŠคํŠธ์˜ ์ฃผ์†Œ

์ด๋•Œ environment์—์„œ DEPLOY_HOST๋Š” private IP๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

2. ํŒŒ์ดํ”„๋ผ์ธ ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ

opensource๋ผ๋Š” ํด๋”๋ฅผ ๋งŒ๋“ ๋‹ค.

๋‚ด ํŒŒ์ดํ”„๋ผ์ธ ๊ฒฝ๋กœ๋ฅผ ์ €๊ธฐ๋กœ ์ง€์ •ํ–ˆ๊ธฐ๋•Œ๋ฌธ

๋นŒ๋“œ๊นŒ์ง€ ์„ฑ๊ณต์ ์œผ๋กœ ๋˜๋ฉด /jenkins/workspace/opensource ์•ˆ์— ๋‚ด์šฉ์ด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

ํ•ด๋‹น ํด๋”์—์„œ

$ sudo vim deploy.sh

์Šคํฌ๋ฆฝํŠธ ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

#!/bin/bash
REPOSITORY=/home/ubuntu/opensource
cd $REPOSITORY/
echo "> ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ PID ํ™•์ธ"
CURRENT_PID=$(sudo lsof -i tcp:8080 | awk 'NR!=1 {print$2}')
if [ -z "$CURRENT_PID" ]; then
    echo "ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์—†์Šต๋‹ˆ๋‹ค."
else
    echo "> ํ˜„์žฌ ๊ตฌ๋™์ค‘์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ PID: $CURRENT_PID"
    echo "> kill -9 $CURRENT_PID"
    sudo kill -9 $CURRENT_PID
    sleep 5
fi
echo "> ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ"
JAR_NAME="demo-0.0.1-SNAPSHOT.jar"
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 &
echo "> ์ƒˆ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์™„๋ฃŒ"

๋งŒ๋“  deploy.sh์— ๊ถŒํ•œ์„ ์ค€๋‹ค.

$ sudo chmod +x /home/ubuntu/opensource/deploy.sh

ํ•„์š”ํ•œ application.yml ํŒŒ์ผ์„ ๋งŒ๋“ ๋‹ค.

$ sudo vim application.yml
server:
  port: 8080

java๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด 

sudo apt install openjdk-17-jre-headless

ํ•„์š”ํ•œ java-version์„ ์„ค์น˜ํ•œ๋‹ค.

์ด์ œ ๊นƒ์— Push ํ•˜๊ฒŒ ๋˜๋ฉด

ํŒŒ์ดํ”„๋ผ์ธ์ด ์‹คํ–‰๋œ๋‹ค.

์„ฑ๊ณต์ ์œผ๋กœ ์ž๋™ํ™”๊ฐ€ ์ง„ํ–‰๋˜์—ˆ๊ณ ,

์„ฑ๊ณต์ ์œผ๋กœ ์Šคํ”„๋ง์ด ์‹คํ–‰๋จ์„ log์™€ ํ”„๋กœ์„ธ์Šค ์ƒํƒœ๋ฅผ ๋ณด๊ณ  ํ™•์ธ๊ฐ€๋Šฅํ•˜๋‹ค.

sudo lsof -i :8080

์ด์ƒ์œผ๋กœ Jenkins๋ฅผ ์‚ฌ์šฉํ•œ CI / CD ๋ฐฐํฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•˜๋‹ค.