νšŒμ‚¬ λ‚΄ 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.sh
cd /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 μ„œλ²„μ— 직접 μ ‘κ·Όν•˜λ„λ‘ 포트λ₯Ό μ˜€ν”ˆν•˜λŠ” 것은 ꢌμž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.