λΈλμΉ μ΄λ¦μ μ 리νλ©΄μ dev λ₯Ό develop μΌλ‘ λ°κΏ¨λ€. λ©°μΉ λ€ κ³ μΉ κ² μ μ¬λΌκ°λ€λ λ§μ΄ λμλλ° λ°°ν¬ μ΄λ ₯μ μ λΆ μ±κ³΅μ΄μλ€.
Table of contents
Open Table of contents
μ¦μ β μ±κ³΅ μ΄λ ₯κ³Ό μ λ°λ κ²°κ³Ό
λ°°ν¬ λ‘κ·Έλ₯Ό μ΄μλ€.
Started by user ...
Fetching changes from the remote Git repository
Checking out Revision 3c81f0a (origin/dev)
...
Finished: SUCCESS
origin/dev λ₯Ό λ°κ³ μμλ€.
dev λ μ΄μ μ μ°λλ° μ격μ μ°Έμ‘°κ° λ¨μ μμ΄μ λ°μμ§κΈ΄ νλ€. λ°μμ§λλ° μ κ²μ΄ λ°μμ§κ³ κ·Έ κ²°κ³Όκ° SUCCESS λ‘ λ¨λλ€.
μ€ν¨νμΌλ©΄ κ·Έ μ리μμ μμμ κ²μ΄λ€. μ±κ³΅νκΈ° λλ¬Έμ λ©°μΉ λμ μ무λ λͺ» μμμ±λ€.
μμΈ β μ격μ λ¨μ μ μ΄λ¦
μ΄λ¦μ λ°κΏ λ μ κ²μ λ§λ€κ³ μ κ²μ μ μ§μ λ€.
$ git ls-remote --heads origin
3c81f0a refs/heads/dev
8f2a1c3 refs/heads/develop
refs/heads/dev μ refs/heads/develop μ΄ λ λ€ μμΌλ μ κ²μ κ°λ¦¬ν€λ μ€μ μ΄ κ³μ λλ€.
$ git push origin --delete dev
--delete dev λ‘ μ§μ°κ³ λλ κ·Έ μ΄λ¦μ κ°λ¦¬ν€λ κ²μ μ€ν¨νλ€.
λ¨κ²¨ λλ κ²μ΄ μμ ν΄ λ³΄μλλ° μ€μ λ‘λ μλͺ»λ μνλ₯Ό μ‘°μ©ν μ μ§νκ² νλ€. λ¨κ²¨ λλ κ² λμ μ§μ°λ μͺ½μ 골λλ€. μ΄μ λ μμ΄μ ΈμΌ λλ¬λκ³ μ€ν¨λ‘ λλ¬λλ νΈμ΄ μ±κ³΅ν μ² μ§λκ°λ κ²λ³΄λ€ λμμλ€.
μ΄λ¦μ λ°κΎΈλ μμ μ μ μ΄λ¦μ μ§μ°λ κ²κΉμ§κ° ν λ¬Άμμ΄μλ€.
μ‘°μΉ β κ°λ¦¬ν€λ μ리 μ μ νμ
κ·Έ μ΄λ¦μ΄ μ΄λμ λ°ν μλμ§ νμΌμμ μ°Ύμλ€.
$ grep -rn '\bdev\b' --include=*.xml --include=*.groovy /var/lib/jenkins/jobs/
/var/lib/jenkins/jobs/api-deploy/config.xml: <name>*/dev</name>
/var/lib/jenkins/jobs/api-test/config.xml: <name>*/dev</name>
/var/lib/jenkins/jobs/batch-deploy/config.xml:<name>*/dev</name>
config.xml μ
μ μμκ³ pull.sh μλ μμλ€.
$ grep -rn 'dev' /srv/deploy/*.sh
/srv/deploy/pull.sh:12: git pull origin dev
κ΄λ¦¬ νλ©΄λ§ λ΄€μΌλ©΄ pull.sh μͺ½μ λμ³€μ κ²μ΄λ€.
νλ©΄μΌλ‘ μ°ΎμΌλ©΄ νλ©΄μ λμ€λ κ²λ§ μ°Ύκ² λλ€. κ°μ κ°μ΄ μ΄λμ λ°ν μλμ§λ νμΌμμ λ€μ ΈμΌ μ λΆ λμ¨λ€.
μ€μ β μ΄λ¦μ ν μ리μ
κ° μ€μ μ λ¬Έμμ΄λ‘ λ°ν μμΌλ©΄ λ€μμ λ λ°κΏ λ λ ν©μ΄μ§λ€. μ리λ§λ€ κ³ μΉλ κ²κ³Ό ν μλ¦¬λ‘ λͺ¨μΌλ κ² λ κ°μ§ λ°©λ² μ€ λ€μͺ½μ΄μλ€.
// Jenkinsfile
environment {
DEPLOY_BRANCH = 'develop'
}
# /etc/deploy.env
DEPLOY_BRANCH=develop
μ€ν¬λ¦½νΈλ DEPLOY_BRANCH λ₯Ό μ½μ΄ κ°λ€.
. /etc/deploy.env
git pull origin "$DEPLOY_BRANCH"
μ΄μ μ΄λ¦μ΄ λ°λλ©΄ deploy.env ν κ³³λ§ κ³ μΉλ€.
μ΄λ²μλ config.xml μ
μ€ νλλ§ κ³ μ³€μΌλ©΄ κ°μ μ¦μμ΄ λ€μ λ¬μ κ²μ΄λ€. κ°μ ν μλ¦¬λ‘ λͺ¨μΌλ κ²μ΄ μ΄ μ’
λ₯μ μ¬κ³ λ₯Ό μμ λ λ°©λ²μ΄μλ€.
κ²μ¦ β 무μμ λ°°ν¬νλμ§ λ¨κΈ΄λ€
μ±κ³΅μΈλ° μ λ°λλ μν©μ λ€μ λ§λκ³ μΆμ§ μμλ€.
REV=$(git rev-parse --short HEAD)
BR=$(git rev-parse --abbrev-ref HEAD)
echo "$BR@$REV $(date -Is) by ${BUILD_USER:-jenkins}" > /srv/app/REVISION
$ curl -s http://web01/health
{"rev":"develop@8f2a1c3","at":"2018-06-24T12:10:33+09:00"}
REVISION κ³Ό health μλ΅μΌλ‘ λλ κ²μμ λ³Έλ€.
κΈ°λν κ²κ³Ό λ€λ₯΄λ©΄ λ©μΆκ²λ νλ€.
EXPECT=$(git rev-parse "origin/$DEPLOY_BRANCH")
ACTUAL=$(git rev-parse HEAD)
if [ "$EXPECT" != "$ACTUAL" ]; then
echo "λ°μ κ²μ΄ κΈ°λμ λ€λ¦
λλ€: expect=$EXPECT actual=$ACTUAL"; exit 1
fi
μΌλΆλ¬ λ€λ₯Έ 컀λ°μΌλ‘ 체ν¬μμν΄ λκ³ expect μ actual λΉκ΅κ° λ©μΆλμ§ λ΄€κ³ λ©μ·λ€.
κ΅ν β μ’ λ£ μ½λλ κ²°κ³Όλ₯Ό λ§νμ§ μλλ€
μ΄ κ±΄μμ λ¨μ κ²μ μ’ λ£ μ½λμ λ»μ΄μλ€.
λ°λ κ²μ μ±κ³΅νλ€ β 무μμ λ°μλμ§λ μ λ§νλ€
μ€ν¬λ¦½νΈκ° λλ¬λ€ β λμμ΄ λ°λμλμ§λ μ λ§νλ€
μ±κ³΅μ λͺ λ Ήμ΄ λλ¬λ€λ λ»μ΄μ§ μλν μνκ° λλ€λ λ»μ΄ μλλ€.
BEFORE=$(curl -s http://web01/health | ...)
# λ°°ν¬
AFTER=$(curl -s http://web01/health | ...)
[ "$BEFORE" = "$AFTER" ] && { echo "λ°°ν¬λλλ° νμκ° κ·Έλλ‘μ
λλ€"; exit 1; }
λ°°ν¬ μ νμ rev λ₯Ό λΉκ΅νλ νμΈμ λ°λ‘ λΆμλ€.
λ°λ κ²μ 보λ νμΈμ΄ μμΌλ©΄ μ±κ³΅λ§ μμΈλ€. μ΄λ²μλ λ©°μΉ μΉ μ±κ³΅ μ΄λ ₯μ΄ μμμ§λ§ κ·Έμ€ λ¬΄μλ μ€μ λ‘λ μ무 μΌμ νμ§ μμλ€.
μ 리
- λ°°ν¬ μ€μ μ΄ μ μ΄λ¦μ κ°λ¦¬ν€λ©΄ μ±κ³΅ν μ±λ‘ μ무 μΌλ μ νλ€
- μ μ΄λ¦μ μ μ§μ°λ©΄ κ³μ λ°μμ§λ€
- μ§μμΌ μ€ν¨λ‘ λλ¬λλ€
- μ€ν¨λ‘ λλ¬λλ νΈμ΄ μ±κ³΅ν μ² μ§λκ°λ κ²λ³΄λ€ λ«λ€
- μ΄λ¦μ λ°κΎΈλ μμ μ μ μ΄λ¦μ μ§μ°λ κ²κΉμ§κ° ν λ¬Άμμ΄λ€
- κ°λ¦¬ν€λ μ리λ₯Ό νλ©΄μ΄ μλλΌ νμΌμμ μ λΆ μ°Ύλλ€
- μ€μ κ³Ό μ€ν¬λ¦½νΈ μμͺ½μ λ°ν μλ€
- μ΄λ¦μ ν μ리μ λκ³ λλ¨Έμ§λ μ½μ΄ κ°κ² νλ€
- 무μμ΄ λλμ§ νμλ₯Ό λ¨κΈ°κ³ λλ κ²μμ νμΈνλ€
- κΈ°λν 컀λ°κ³Ό λ°μ 컀λ°μ΄ λ€λ₯΄λ©΄ λ©μΆκ² νλ€
- μ’ λ£ μ½λλ κ²°κ³Όλ₯Ό λ§νμ§ μλλ€
- λ°λ κ²μ 보λ νμΈμ΄ μμΌλ©΄ μ±κ³΅λ§ μμΈλ€