λͺ©μ°¨
λ°°κ²½
λͺ¨λ½ μλΉμ€λ₯Ό λ°°ν¬ν μ΄ν, μ¬μ©μμ νΌλλ°±κ³Ό μΆκ° κΈ°λ₯λ€μ ν¨κ» λ°μνλ©° μ΄μ μλ²λ‘ μμ£Ό λ°°ν¬νκ² λμμ΅λλ€. μ΄ κ³Όμ μμ κΈ°μ‘΄ λ²μ μ μ΄μ μλ²λ₯Ό μ’
λ£μν€κ³ , μλ‘μ΄ λ²μ μ μ΄μ μλ²λ₯Ό μ€νμν€λ©° μ½ 20μ΄ μ λμ λ€μ΄νμμ΄ λ°μνκ² λμμ΅λλ€. μ΄ 20μ΄ κ°μ λ€μ΄νμλ λ¬Έμ μμ§λ§, κ°λ° μλ²μμ λ―Έμ² μμμ°¨λ¦¬μ§ λͺ»ν μλ¬κ° λ°μν λλ λ¬Έμ κ° μμμ΅λλ€. μ ν¬ νλ‘μ νΈμμ λ°°ν¬νλ λ°©μμ κΈ°μ‘΄ λ²μ μ jar νμΌμ μλ‘μ΄ λ²μ μ jar νμΌλ‘ μ€λ²λΌμ΄λνκ³ μλ‘μ΄ λ²μ μ jar νμΌμ μ€ννλ λ°©μμ΄μμ΅λλ€. μ΄λ¬ν λ°©μμΌλ‘ μΈν΄ μλ‘μ΄ λ²μ μμ μλ¬κ° λ°μνλ€λ©΄ μ΄μ λ²μ μ jar νμΌμ΄ μμ΄, λ‘€λ°±νκΈ° μν΄μλ μ΄μ λ²μ μ jar νμΌλ‘ λ€μ μ€λ²λΌμ΄λνμ¬ μλ²λ₯Ό μ€νν΄μΌ νμ΅λλ€. μ΄μ κ°μ μ΄μ λ‘ νλ² μλ¬κ° λ°μνλ©΄ λ€μ΄νμμ΄ κΈΈμ΄μ ΈμλΉμ€ μ΄μμ μΉλͺ
μ μΌλ‘ λ€κ°μ€κ² λ©λλ€. μ΄μ λ°λΌ μμ μ μΈ μλΉμ€ μ΄μμ μν΄ λ€μ΄νμμ μ΅μνμν€κ³ , λΉ λ₯΄κ² λ‘€λ°±ν μ μλ 무μ€λ¨ λ°°ν¬ λ°©μ μ μ μ©νκ³ μ νμμ΅λλ€. λν μλ²κ° μκΈ°μΉ λͺ»νκ² μ’
λ£λμμ λλ₯Ό λλΉνκ³ νΈλν½ λΆμ°μ μν΄ λ‘λ λ°Έλ°μ± νκ²½λ ν¨κ» μ μ©ν΄ λ³΄κ² μ΅λλ€.
무μ€λ¨ λ°°ν¬ μ λ΅
무μ€λ¨ λ°°ν¬ μ λ΅μλ λ‘€λ§ λ°©μ, λΈλ£¨/κ·Έλ¦° λ°©μ, μΉ΄λ리μ λ°©μ λ± ν¬κ² μΈ κ°μ§κ° μμ΅λλ€. κ° λ°©μμ λν μΈλΆμ μΈ λ΄μ©μ νλμ 무μ€λ¨ λ°°ν¬ μν€ν
μ²μ λ°°ν¬ μ λ΅ ν¬μ€ν
μ μμΈνκ² λμμκΈ°μ μ΄ ν¬μ€ν
μμλ μλ΅νκ² μ΅λλ€. μ ν¬ λͺ¨λ½ νλ‘μ νΈμμ μ νν 무μ€λ¨ λ°°ν¬ μ λ΅μ λΈλ£¨/κ·Έλ¦° λ°©μμ
λλ€. μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
β’
λ‘€λ§, μΉ΄λ리μ λ°©μμ νΈνμ±μ λ¬Έμ κ° μμ κ²μ΄λΌ νλ¨
μΉ΄λ리μμ λ‘€λ§ λ°©μμ μ μ°¨ μλ‘μ΄ λ²μ μ λμ
νκΈ°λλ¬Έμ, ꡬ λ²μ κ³Ό μ λ²μ μ΄ λμμ μ΄μλλ νμ΄λ°μ΄ μ‘΄μ¬νκ³ , μ΄λ νΈνμ±μ λ¬Έμ λ₯Ό μΌκΈ°ν μ μλ€κ³ μκ°νμ΅λλ€. μλ₯Ό λ€μ΄ λμμ μ΄μλλ μμ μμ μ¬μ©μκ° μλ‘μ΄ λ²μ μμ μλ‘ μΆκ°λ νλ©΄μ μμ²νλ λ²νΌμ λλ μ λ, ꡬ λ²μ μ μλ²λ‘ μμ²μ΄ λ€μ΄κ°λ©΄ 404 νμ΄μ§κ° μλ΅λ κ²μ
λλ€. λ°λ©΄ λΈλ£¨/κ·Έλ¦° λ°©μμ μλ‘μ΄ λ²μ μ΄ νλ²μ μ€νλκΈ°λλ¬Έμ, reload νλ νμ΄λ°λ§ νΈνμ± λ¬Έμ κ° λ°μνμ¬ νΈνμ± μΈ‘λ©΄μμ μ₯μ μ΄ μλ€κ³ νλ¨νμ΅λλ€.
β’
λΈλ£¨/κ·Έλ¦° λ°©μμ λ‘€λ°±μ΄ μ¬μ
μλΉμ€ νΉμ± μ λ°°ν¬λ₯Ό μμ£Ό νκΈ°λλ¬Έμ, λ°°ν¬ κ³Όμ μμ μλ‘μ΄ λ²μ μ μλ¬κ° λ°μν κ°λ₯μ±λ λμμ§λλ€. μ΄μ λ°λΌ λ‘€λ°±μ ν΄μΌ νλ μν©λ λ§μ£Όν΄μΌ νλλ°, λΈλ£¨/κ·Έλ¦° λ°°ν¬ λ°©μμ ꡬ λ²μ μ μλ²κ° λ°±μ
μ©μΌλ‘ λ μμ μ μκ³ , λλ λ°±μ
λ ꡬ λ²μ μ jar νμΌμ λ°λ‘ μ€ν μν¬ μλ μμ΅λλ€. κ·Έλμ λ‘€λ°± μν© μ, λΌμ°ν
λ§ κ΅¬ λ²μ μ μλ²λ‘ λ°κΏμ£Όκ±°λ ꡬ λ²μ μ jar νμΌμ μ€νμμΌ λΌμ°ν
μ λ°κΏμ£Όλ©΄ λ‘€λ°±μ μ½κ² ν μ μκΈ°λλ¬Έμ, λ‘€λ°± κ΄μ μμλ μ ν¬ μλΉμ€μ μ λ§λλ€κ³ νλ¨νμ΅λλ€.
λ¬Όλ‘ λΈλ£¨/κ·Έλ¦° λ°°ν¬ λ°©μμ 리μμ€κ° 2λ°°λ‘ λ€μ΄κ°λ€λ λ¨μ μ΄ μμ΅λλ€. νμ§λ§ μΆκ°μ μΌλ‘ μ¬μ©ν μΈμ€ν΄μ€λ t4g micro μ΄κΈ°μ λΉμ©μ΄ μλμ μΌλ‘ μ κ² μλͺ¨λκ³ , νλμ μΈμ€ν΄μ€λ₯Ό λ μ¬μ©νλ λΉμ©λ³΄λ€ λΈλ£¨/κ·Έλ¦° λ°©μμ μ¬μ©νλ©΄μ μ»μ μ΄μ μ΄ λ λλ€κ³ νλ¨νμμ΅λλ€.
λ‘λ λ°Έλ°μ±
무μ€λ¨ λ°°ν¬ νκ²½μ μ μ©νλ©΄μ, μμ μ μΈ μλΉμ€ μ 곡μ μν΄ λ‘λ λ°Έλ°μ± νκ²½λ ν¨κ» ꡬμΆν΄ 보μμ΅λλ€. λ‘λ λ°Έλ°μ± νκ²½μ μλ²κ° μ²λ¦¬ν΄μΌ ν μμ²μ μ¬λ¬ λμ μλ²λ‘ λλμ΄ μ²λ¦¬ν μ μλ νκ²½μ μλ―Έν©λλ€. λ‘λ λ°Έλ°μ±μ νΈλν½μ λλμ΄ μ²λ¦¬νκΈ°λλ¬Έμ νλμ μλ²κ° μ²λ¦¬νλ λΆνλ₯Ό μ€μΌ μ μκ³ , λ§μΌμ μν©μ νλμ μλ²κ° μμμΉ λͺ»νκ² λ€μ΄λμμ λ, λ¨μ μλ²λ‘ μλΉμ€λ₯Ό μ§μμ μΌλ‘ μ΄μ©ν μ μλλ‘ λλΉν μ μλ νκ²½μ λ§λλ μ΄μ λ μμ΅λλ€.
μΈνλΌ κ΅¬μ‘°
μ ν¬ νλ‘μ νΈμμλ μμ κ°μ΄ λΈλ£¨/κ·Έλ¦° 무μ€λ¨ λ°°ν¬ λ°©μκ³Ό λ‘λ λ°Έλ°μ±μ λͺ¨λ μ μ©μν€κΈ°λ‘ νμκ³ , μ΄λ¬ν νκ²½μ λ¨μν μ μ©νλ©΄ μ΄ 4κ°μ μΈμ€ν΄μ€λ₯Ό μ¬μ©ν΄μΌ ν©λλ€.
μ΄ λ°©μμ μ΄μλμ§ μλ μΈμ€ν΄μ€κ° 2κ°λ μκΈ°λλ¬Έμ, 리μμ€ νμ© μΈ‘λ©΄μμ λ€μ λΉν¨μ¨μ μ΄λΌκ³ νλ¨νμμ΅λλ€. μ΄μ λ°λΌ μ μ 리μμ€λ‘ μ΅λν νμ©ν μ μλ λ°©λ²μ μκ°ν΄λ³΄μκ³ λ€μκ³Ό κ°μ μΈνλΌ κ΅¬μ‘°λ₯Ό λ μ¬λ Έμ΅λλ€.
λ κ°μ μΈμ€ν΄μ€ λͺ¨λ 8080, 8081 ν¬νΈλ₯Ό νμ©νμ¬ μ΄ 4κ°μ μ± μλ²κ° ꡬλλ©λλ€. κ·Έλ¦¬κ³ κ° ν¬νΈλ μ λ²μ λλ ꡬ λ²μ μ κ°μ§λλ€. μλ₯Ό λ€μ΄ νμ¬ λ λμ WAS 8080 ν¬νΈμ μ λ²μ μ΄ μ€νλκ³ μλ€λ©΄, 8081 ν¬νΈμλ ꡬ λ²μ μ΄ μ€νλκ³ μλ κ²μ
λλ€. μ΄ λ λΈλ£¨ μλ²μΈ 8081ν¬νΈλ μ΄μλμ§ μκ³ , jar νμΌλ‘ λ°±μ
νμΌλ§ μ‘΄μ¬ν©λλ€.
λ°°ν¬ κ³Όμ μ λ€μκ³Ό κ°μ΅λλ€.
1.
μλ‘μ΄ λ°°ν¬λ₯Ό μ§νν λ μ΄μλμ§ μλ ν¬νΈλ₯Ό νμΈν©λλ€.
2.
μ΄μλμ§ μλ ν¬νΈμ μλ‘μ΄ λ²μ μ λ°°ν¬λ₯Ό μ§νν©λλ€.
3.
μλ‘μ΄ λ²μ μ μλ²κ° ꡬλλ κ²μ νμΈνλ©΄ νμ¬ μ΄μμ€μΈ λ€λ₯Έ ν¬νΈμ μλ²λ₯Ό μ’
λ£ν©λλ€.
μ¦ κ°κ°μ ν¬νΈλ‘ λΈλ£¨/κ·Έλ¦° λ°°ν¬ λ°©μμ μ μ©νκ³ , λ κ°μ μΈμ€ν΄μ€λ‘ λ‘λ λ°Έλ°μ±μ μ μ©νλ ꡬ쑰μ
λλ€. μμ ꡬ쑰λ₯Ό μ μ©νμ¬ 2κ°μ μΈμ€ν΄μ€λ§μΌλ‘ λΈλ£¨/κ·Έλ¦° λ°°ν¬ λ°©μκ³Ό λ‘λ λ°Έλ°μ±μ μ΄μ μ λͺ¨λ κ°μ Έμ¬ μ μμμ΅λλ€.
μ μ©νκΈ°
DB μ€μ
κ°μ₯ λ¨Όμ μλ‘μ΄ μΈμ€ν΄μ€μμλ DB μ μ κ·Όμ΄ κ°λ₯νλλ‘ DB νΈμ€νΈλ‘ μΆκ°ν΄μ£Όμμ΅λλ€. κ°μ μλΈλ· λ€νΈμν¬μ μκΈ°λλ¬Έμ private IP λ‘ μΆκ°ν΄ μ£Όμμ΅λλ€.
jenkins νμ΄νλΌμΈ
κΈ°μ‘΄μ μ ν¬ νλ‘μ νΈμμλ λ°°ν¬λ₯Ό jenkins μ ν리μ€νμΌμ νμ©ν΄ μ§ννμμ΅λλ€. νλ‘μ νΈ μ΄κΈ°μ λ°°ν¬ μλνλ₯Ό μ μ©ν λ νμ΄νλΌμΈ λ°©μλ³΄λ€ μ μνκ² ν μ μμκΈ°λλ¬Έμ
λλ€. νμ§λ§ 무μ€λ¨ λ°°ν¬μ λ‘λ λ°Έλ°μ± λ± λ°°ν¬ κ³Όμ μ΄ μ μ 볡μ‘ν΄μ§λ©΄μ ν리μ€νμΌ λ°©μμΌλ‘λ μ μ©νκΈ° νλ€κ² λ€κ³ νλ¨νμκ³ , λ°°ν¬ μλν λ°©μμ ν리μ€νμΌ λ°©μμμ νμ΄νλΌμΈ λ°©μμΌλ‘ λ³κ²½νμμ΅λλ€.
jenkins νμ΄νλΌμΈμ groovy μΈμ΄μ DSLλ‘ μμ±νλ©°Β declarativeΒ λ°©μκ³ΌΒ scriptedΒ λ°©μμ΄ μμ΅λλ€.
β’
declarativeΒ λ°©μ
μ΅μλ¨μ΄ 'pipeline' μΌλ‘ μμνκ³ , κΈ°μ‘΄μ μ μλ λ¬Έλ²κ³Ό νμμ λ°λΌ μμ±ν μ μμ΅λλ€. λ°λΌμ λΉκ΅μ κ²°κ³Όλ¬Όμ κ°λ¨νμ§λ§, λ‘μ§μ μΆκ°νλ €λ©΄ jenkinsμ pluginμ΄ μ 곡νλ λ¬Έλ²μ λͺ¨λ μμ§ν΄μΌν©λλ€.
β’
scriptedΒ λ°©μ
μ΅μλ¨μ΄ 'node'λ‘ μμνκ³ , μ΅μνμ λ¬Έλ²κ³Ό νμλ§ λ°λΌ μμ±ν©λλ€. μ½λλ λΉκ΅μ 볡μ‘νμ§λ§, μλμ μΌλ‘ μμ λ‘κ² λ‘μ§μ μΆκ°μ μμ μ΄ κ°λ₯ν©λλ€.
μ ν¬ νλ‘μ νΈμμλ μ΅μνμ λ¬Έλ²λ§ μμ§νλ©΄ μμ λ‘κ² μ¬μ©ν μ μλ scripted λ°©μμ μ¬μ©νμμ΅λλ€.
μ΄ ν¬μ€ν
μμλ μ 체 μ€ν¬λ¦½νΈλ λ무 κΈΈκΈ°λλ¬Έμ, κ°λ
μ±μ μν΄ κ°κ°μ stage μ λν μ€μ μ μ€λͺ
νκ² μ΅λλ€. μ 체 μ€ν¬λ¦½νΈλ jenkins prdμμ νμΈν μ μμ΅λλ€.
stage('check-out') {
// Get some code from a GitHub repository
slackSend (channel: "jenkins", color: "good", message: "Build Started - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)")
git url: 'https://github.com/woowacourse-teams/2022-mo-rak.git',
branch: 'main'
}
Groovy
볡μ¬
check-out stage μμλ git λͺ
λ Ήμ΄λ‘ github μμ μ½λλ₯Ό κ°μ Έμ΅λλ€. slackSend λ‘ μ¬λμ μλ¦Όμ λ³΄λΌ μ μμ΅λλ€. λ΄λΆμ νκ²½ λ³μλ jenkins μ μ€μ λ νκ²½ λ³μμ
λλ€.
stage('build') {
dir ('./backend') {
try {
sh './gradlew clean build'
slackSend (channel: "jenkins", color: "good", message: "Build Succeeded - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)")
} catch(e) {
slackSend (channel: "jenkins", color: "warning", message: "Build Failed - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)")
throw e
}
}
}
Groovy
볡μ¬
build stage μμλ gradle buildλ₯Ό μνν©λλ€. dir λ‘ λͺ
λ Ήμ μνν λλ ν 리λ₯Ό μ§μ ν μ μμ΅λλ€. λ΄λΆ λΈλ‘μμλ Groovy λ¬Έλ²μΌλ‘ try/catch λ₯Ό μνν μ μμ΅λλ€. λ΄λΆμ sh μ 리λ
μ€ λͺ
λ Ήμ΄μ κ°μ΄ shell script λ₯Ό μννλ λͺ
λ Ήμ΄μ
λλ€.
stage('deploy') {
try {
OUTPUT = sh ( script: '''#!/bin/bash
{μνν shell script}
''',
returnStdout: true
).trim()
OUTPUT = OUTPUT.split("\n")
echo "result is : ${OUTPUT}"
slackSend (channel: "jenkins", color: "good", message: "Deploy Succeeded - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)")
} catch(e) {
slackSend (channel: "jenkins", color: "warning", message: "Deploy Failed - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)")
throw e
}
}
Groovy
볡μ¬
deploy stage μμλ λ κ°μ μΈμ€ν΄μ€μ λ°°ν¬ μ€ν¬λ¦½νΈλ₯Ό μ€νμν€κ³ κ·Έ κ²°κ³Ό λ°μ κ·Έλ¦° μλ² ν¬νΈμ λν μ 보λ₯Ό λ°μμ΅λλ€. script λ‘ μνν μ€ν¬λ¦½νΈλ₯Ό μμ±ν μ μμ΅λλ€. μ ν¬κ° μμ±ν shell script λ λ무 κΈΈμ΄ μλμ λ°λ‘ λΊμ΅λλ€. returnStdout μΌλ‘ μ€ν¬λ¦½νΈ μν ν μΆλ ₯λλ λ΄μ©μ μ λ¬λ°μ μ μκ³ , μ΄ μΆλ ₯λλ λ΄μ©μΌλ‘ κ·Έλ¦° μλ² ν¬νΈ μ 보λ₯Ό λ°μμ΅λλ€.
β’
μνν shell script
#!/bin/bash
IP_LIST=(${PRD_WAS_IP_LIST})
SIZE=${#IP_LIST[@]}
PORT_A=8080
PORT_B=8081
PREVIOUS_PORT_LIST=()
NEXT_PORT_LIST=()
for IP in ${IP_LIST[@]}
do
if curl -s -I -X OPTIONS "http://${IP}:${PORT_A}" > /dev/null; then
PREVIOUS_PORT_LIST+=("${PORT_A}")
NEXT_PORT_LIST+=("${PORT_B}")
else
PREVIOUS_PORT_LIST+=("${PORT_B}")
NEXT_PORT_LIST+=("${PORT_A}")
fi
done
for index in $(seq ${SIZE})
do
PREVIOUS=${PREVIOUS_PORT_LIST[index-1]}
NEXT=${NEXT_PORT_LIST[index-1]}
IP=${IP_LIST[index-1]}
ssh -i ${PEM_KEY} ubuntu@"${IP}" "sh ${BACKUP_SCRIPT} ${NEXT} 1>/dev/null 2>/dev/null"
scp -i ${PEM_KEY} ./backend/build/libs/*.jar ubuntu@"${IP}":/home/ubuntu/deploy 1>/dev/null 2>/dev/null
ssh -i ${PEM_KEY} ubuntu@"${IP}" "sh ${DEPLOY_SCRIPT} ${NEXT} 1>/dev/null 2>/dev/null"
done
for retry in $(seq 10)
do
COUNT=0
for index in $(seq ${SIZE})
do
IP=${IP_LIST[index-1]}
NEXT=${NEXT_PORT_LIST[index-1]}
if curl -s -I -X OPTIONS "http://${IP}:${PORT_A}" > /dev/null; then
COUNT=$(($COUNT + 1))
fi
done
if [ $COUNT -eq $SIZE ]
then
break
fi
if [ $retry -eq 10 ]
then
exit 1
fi
sleep 5
done
for index in $(seq ${SIZE})
do
echo "${IP_LIST[index-1]}:${NEXT_PORT_LIST[index-1]}"
done
for index in $(seq ${SIZE})
do
echo "${PREVIOUS_PORT_LIST[index-1]}"
done
Bash
볡μ¬
β’
IP_LIST=(${PRD_WAS_IP_LIST})
β¦
jenkins νκ²½ λ³μλ‘ μ μ₯ν μ΄μ μλ² IP λ¬Έμμ΄μ () λ₯Ό ν΅ν΄ 리μ€νΈλ‘ κ°μ Έμ΅λλ€.
β’
for IP in ${IP_LIST[@]}
β¦
κ° μλ²μ 8080 ν¬νΈμ curl λͺ
λ Ήμ΄λ‘ μμ²μ 보λ΄κ³ μλ΅μ΄ μ€λ©΄ νμ¬ κ΅¬λλκ³ μλ ν¬νΈ, μλλ©΄ μμΌλ‘ ꡬλν ν¬νΈλ‘ λλμ΄ μ μ₯ν©λλ€.
β’
for index in $(seq ${SIZE})
β¦
κ° μλ²μ ssh λͺ
λ Ήμ΄λ‘ μ μνκ³ , sh λͺ
λ Ήμ΄λ‘ κ° μλ²μ μλ λ°±μ
μ€ν¬λ¦½νΈμ λ°°ν¬ μ€ν¬λ¦½νΈλ₯Ό μ€νμν΅λλ€. μ΄ λ λΈλ£¨ μλ² ν¬νΈμ κ·Έλ¦° μλ² ν¬νΈλ₯Ό νλΌλ―Έν°λ‘ ν¨κ» μ€ μ μμ΅λλ€.
β¦
μ²μμλ 1>/dev/null 2>/dev/null μ μ§μ νμ§ μμ ν΄λΉ μ€ν¬λ¦½νΈλ₯Ό μ€νμμΌ°μ λ output μ λ°κΈ° μν΄ λ¬΄νμ λκΈ°νλ μλ¬κ° λ°μνμμ΅λλ€.
β’
for retry in $(seq 10)
β¦
10 λ² λλ©΄μ μλ‘ μ€νν μλ²κ° μ μ€νλμλμ§ 5μ΄ κ°κ²©μΌλ‘ νμΈν©λλ€.
β’
for index in $(seq ${SIZE})
β¦
κ°κ°μ μλ²μμ μλ‘ μ€νμν¨ κ·Έλ¦° μλ²μ ν¬νΈλ₯Ό echo ν©λλ€. echo λ₯Ό ν΅ν΄ μΆλ ₯μ λ§λ€κ³ μ΄ μΆλ ₯λ¬Όμ λ€μ μ€ν
μ΄μ§μμ λΌμ°ν
ν λ μ¬μ©νμμ΅λλ€.
stage('route') {
try {
echo "URL_A=${OUTPUT[0]}"
echo "URL_B=${OUTPUT[1]}"
sh 'ssh -i {PEM_KEY} ubuntu@${WS_IP} "bash {ROUTE_SCRIPT} ' + OUTPUT[0] + ' ' + OUTPUT[1] + '"'
slackSend (channel: "jenkins", color: "good", message: "Route Succeeded - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)")
} catch(e) {
slackSend (channel: "jenkins", color: "warning", message: "Route Failed - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)")
throw e
}
}
Groovy
볡μ¬
route stage μμλ nginx κ° μλ μλ²μ λΌμ°ν
λ³κ²½ μ€ν¬λ¦½νΈλ₯Ό μ€νμν΅λλ€. μ΄μ ν¨κ» κ·Έλ¦° μλ²μ ν¬νΈλ₯Ό μΈμλ‘ μ λ¬ν©λλ€.
stage('kill') {
try {
sub_list = []
for (res in OUTPUT) {
sub_list.add(res)
}
sub_list = sub_list[(int) (sub_list.size() / 2)..sub_list.size() - 1]
println sub_list
PRD_KILL_WAS_IP_LIST = PRD_WAS_IP_LIST.split(" ")
PRD_KILL_WAS_IP_LIST.eachWithIndex { item, index ->
sh 'ssh -i PEM_KEY ubuntu@' + item + ' "bash KILL_SCRIPT ' + sub_list[index] + ' 1>/dev/null 2>/dev/null"'
}
slackSend (channel: "jenkins", color: "good", message: "Down Succeeded - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)")
} catch(e) {
slackSend (channel: "jenkins", color: "warning", message: "Down Failed - ${env.JOB_NAME} ${env.BUILD_NUMBER} (<${env.BUILD_URL}|Open>)")
throw e
}
}
Groovy
볡μ¬
kill stageμμλ ꡬ λ²μ μ μλ²λ₯Ό λ΄λ¦½λλ€. μ¬κΈ°μλ groovy λ¬Έλ²μ λ€μ λ§μ΄ νμ©νμμ΅λλ€. μ΄ κ³Όμ μμ jenkins νκ²½ λ³μλ₯Ό λ°μμ€λ €λ©΄ ${} ννκ° μλ PRD_WAS_IP_LIST λ³μλͺ
μ κ·Έλλ‘ μ¬μ©ν΄μΌ groovy μ νμ
μΌλ‘ λ°μμ¬ μ μμμ΅λλ€. μ¬κΈ°μ μ΅μμ§ μμ groovy λ¬Έλ²κ³Ό μλ¬ λ΄μ©λλ¬Έμ μ λ₯Ό λ§μ΄ λ¨Ήμμ΅λλ€
WAS μ€ν¬λ¦½νΈ μ€μ
β’
backup μ€ν¬λ¦½νΈ
cp {jar file μμΉ} /home/ubuntu/deploy/backup/
Bash
볡μ¬
λ°±μ
μ€ν¬λ¦½νΈμμλ κΈ°μ‘΄μ jar νμΌμ backup ν΄λμ 볡μ¬ν©λλ€.
β’
deploy μ€ν¬λ¦½νΈ
PORT=$1
pid=$(lsof -i:${PORT} | sed -n 2p | sed -e "s/ \{1,\}/ /g" | cut -d ' ' -f 2)
if [ -n"${pid}" ]
then
kill -15 ${pid}
echo kill process ${pid}
else
echo no process
fi
echo 'sleep..'
sleep 30
echo 'now start'
nohup java -jar -Dserver.port=${PORT} {jar file μμΉ} >> {log file μμΉ} &
echo 'completed'
Bash
볡μ¬
μ jenkins νμ΄νλΌμΈμ deploy stageμμ μ€νμν€λ deploy μ€ν¬λ¦½νΈμ
λλ€. jenkins μμ μ μ€ν¬λ¦½νΈ μνν λ λ°μ ν¬νΈ μΈμλ₯Ό PORT λ³μμ μ μ₯ν©λλ€. κ·Έλ¦¬κ³ νΉμ ν΄λΉ ν¬νΈμ νλ‘κ·Έλ¨μ΄ μ€νλκ³ μλ€λ©΄ -15 λ‘ μ’
λ£μν΅λλ€. μ΄ν nohup κ³Ό java λͺ
λ Ήμ΄λ‘ jar νμΌμ μ€νμν΅λλ€.
β’
kill μ€ν¬λ¦½νΈ
PORT=$1
pid=$(lsof -i:${PORT} | sed -n 2p | sed -e "s/ \{1,\}/ /g" | cut -d ' ' -f 2)
if [ -n"${pid}" ]; then
kill -15 ${pid}
echo kill process ${pid}
echo 'kill μ±κ³΅'
else
echo no process
fi
Bash
볡μ¬
μ¬κΈ°μλ jenkins μμ ν΄λΉ μ€ν¬λ¦½νΈ μνμ μΈμλ‘ λ°μ port λ₯Ό νμ©ν©λλ€. μ΄ port λ‘ κΈ°μ‘΄μ μ± μλ² pid λ₯Ό μ°Ύκ³ μ’
λ£μν΅λλ€.