μ ν¨μ€ κ·Έλ¦¬κ³ S3μ ν¨κ»νλ λ°°ν¬ μλν
νμ¬ λ΄ QA μμ§λμ΄ ν΄μ¬λ‘ μΈν΄ μλ λ°°ν¬λ₯Ό μνν΄μλ ν μ€νΈ νκ²½μ λν΄ μλν λ°°ν¬λ‘ λ³κ²½νκ³ μ νμ΅ν λ΄μ©μ΄λ€. μ루μ ννλ‘ μ λ¬λμ΄ κ³ κ°μ΄ μ§μ λ°°ν¬λ₯Ό μννλ νλ‘μ νΈλ‘ λ°°ν¬μ λν κ³Όμ λ λ³κ²½μ¬νμ ν¬ν¨λ μ μμΌλ―λ‘ QA μμ§λμ΄κ° ν μ€νΈ νλͺ©μΌλ‘ μλ λ°°ν¬λ₯Ό μννλ€.
S3λ₯Ό ν΅ν λ°°ν¬ νμΌ λ€μ΄λ‘λ μ€ν¬λ¦½νΈ
μ ν리μΌμ΄μ μ λν λ¦΄λ¦¬μ¦ λΉλλ μ ν¨μ€ λκ΅¬λ‘ μννλ©° μ ν¨μ€ μλ²μμ μ‘°μ§ λ΄ AWS λ¦΄λ¦¬μ¦ λ²ν·μ μλΉμ€ νκ²½ ν΄λμ λ°°ν¬ νμΌμ΄ μ μ₯λλλ‘ κ΅¬μ±λμ΄ μλ€. S3 μ λ‘λνλ κ²μ S3 publisher νλ¬κ·ΈμΈμ μ΄μ©ν μ μλ€.
auto_deployment.sh#!/bin/sh FILE_KEY=`aws s3 ls --recursive s3://app-release/japan/module/ | grep module-jp-bundle | sort | tail -n 1 | awk '{print $4}'` FILE_NAME=`echo $FILE_KEY | sed -e "s/japan\/module\///"` aws s3 sync s3://app-release/$FILE_KEY /home/ec2-user/prepare/ sleep 1 echo "[`date --rfc-3339=seconds`] [INFO] current zip file : $FILE_NAME" cp -p /home/ec2-user/prepare/$FILE_NAME /home/ec2-user/prepare/backup/$FILE_NAME unzip -o /home/ec2-user/prepare/$FILE_NAME -d /home/ec2-user/prepare/ > /dev/null
μ ν¨μ€ μλ²μ μν΄ λΉλ μ AWS Elastic Beanstalk μλΉμ€μ μν΄ λ°°ν¬λλ λ²λ€κ³Ό κ°μ΄ μ€νκ°λ₯ν war νμΌμ ν¬ν¨νμ¬ μμΆ νμΌλ‘ S3 λ²ν·μ μ λ‘λ λμ΄μλ€. λ³Έ ν μ€νΈ νκ²½μμλ μ ν리μΌμ΄μ μ€ν μ μ°Έμ‘°λ νλ‘νΌν° νμΌμ λ³λλ‘ κ΄λ¦¬νκ³ μλ€.
μλ μ€νμ μν ν¬λ‘ ν λΉβ’νμ±ν μ€ν¬λ¦½νΈ
μλ λ°°ν¬λ₯Ό μννλ νλ‘μΈμ€μλ μκΈ°μΉ μμ μν©μ μν΄ μ ν리μΌμ΄μ μ’ λ£ μ μλμΌλ‘ μ€νλλλ‘ μ€ν¬λ¦½νΈν λμ΄ νμ±νλμ΄μλ ν¬λ‘ νμ λΉνμ±ννκ³ λ°°ν¬ μλ£ μ ν¬λ‘ νμ μν΄ λμνλλ‘ νμ±ννλ λ°©μμ΄ νμνλ€. μλμ μ€ν¬λ¦½νΈλ μ€νμ€λ²νλ‘μ° λ΅λ³μ μ°Έκ³ νλ€.
disable_cron.sh#!/bin/sh # crontab -l | sed '/^[^#].*check.sh/s/^/#/' crontab -l | sed '/^[^#].*check.sh/s/^/#/' | crontab - echo "[`date --rfc-3339=seconds`] [INFO] Disable cron of check.sh"
enable_cron.sh#!/bin/sh #crontab -l | sed '/^#.*check.sh/s/^#//' crontab -l | sed '/^#.*check.sh/s/^#//' | crontab - echo "[`date --rfc-3339=seconds`] [INFO] Enable cron of check.sh"
λ°°ν¬ μλν μ€ν¬λ¦½νΈ
auto_deployment.shcd /home/ec2-user/ OLD_FILENAME=$(ls /home/ec2-user/ | grep .war | grep -v .old) FILENAME=$(ls /home/ec2-user/prepare/ | grep .war) UPD_OLD=$(stat -c %Y $OLD_FILENAME) UPD_NEW=$(stat -c %Y /home/ec2-user/prepare/$FILENAME) echo "[`date --rfc-3339=seconds`] [INFO] old file : $OLD_FILENAME($UPD_OLD)" echo "[`date --rfc-3339=seconds`] [INFO] new file : $FILENAME($UPD_NEW)" if [ $UPD_NEW -gt $UPD_OLD ]; then echo "[`date --rfc-3339=seconds`] [INFO] Start deployment using the $FILENAME" # μλ μ€ν μ€ν¬λ¦½νΈ λΉνμ±ν /bin/sh /home/ec2-user/disable_cron.sh # κΈ°μ‘΄ λ°°ν¬ νμΌ λ°±μ if [ -f /home/ec2-user/$OLD_FILENAME ]; then mv /home/ec2-user/$OLD_FILENAME /home/ec2-user/$OLD_FILENAME.old fi # μ κ· λ°°ν¬ νμΌ λ³΅μ¬ cp /home/ec2-user/prepare/$FILENAME /home/ec2-user/ # μ ν리μΌμ΄μ μ’ λ£ λ° μ€ν sh /home/ec2-user/stop.sh sleep 10 sh /home/ec2-user/start.sh # μλ μ€ν μ€ν¬λ¦½νΈ νμ±ν /bin/sh /home/ec2-user/disable_cron.sh echo "[`date --rfc-3339=seconds`] [INFO] Deployment completed" else echo "[`date --rfc-3339=seconds`] [WARN] There are no new deployment file" fi
μ ν¨μ€ μλ²μμ λ°°ν¬ μλν μ€ν¬λ¦½νΈ μν
νλ¨κ³ λ λμκ°μλ EC2 μλ²μμ μ μν΄μ λ°°ν¬ μ€ν¬λ¦½νΈλ₯Ό μ€ννλ κ²λ μ ν¨μ€ μλ²μμ μνν μ μλλ‘ κ΅¬μ±ν μ μλ€. Publish over SSH νλ¬κ·ΈμΈμ ν΅ν΄ EC2 μλ² μ μμ μν λ°°μ€μ² νΈμ€νΈμ SSH μ°κ²°μ μννκ³ λ°°μ€μ² νΈμ€νΈμ μ‘΄μ¬νλ EC2 ν€ νμ΄ νμΌμ ν΅ν΄ SSH λͺ λ Ήκ³Ό ν¨κ» λ°°ν¬ μλν μ€ν¬λ¦½νΈλ₯Ό μ€ννλ λͺ λ Ήμ΄λ₯Ό μ λ¬νλ©΄ λλ€.
ssh -i a.pem ec2-user@{ec2-ip} 'sh /home/ec2-user/auto_deployment.sh'
ν μ€νΈ νκ²½μ΄λΌ ν μ§λΌλ 보μ μ κ΄μ μΌλ‘ EC2 μλ²μ μ§μ μ κ·Όνλλ‘ ν¬νΈλ₯Ό μ€ννλ κ²μ κΆμ₯νμ§ μλλ€.