github action의 동작을 정의하는 파일
on:
push:
branches:
- main
name: Deploy String boot to Amazon EC2
env:
PROJECT_NAME: WeatherLevel
jobs:
deploy:
name: DEPLOY
runs-on: ubuntu-18.04
env:
working-directory: ./weather-data-api
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v1
with:
java-version: 1.8
#리눅스 해당 파일에 대한 실행 권한 획득
- name: Grant execute permission for gradlew
run: chmod +x gradlew
working-directory: ./weather-data-api
shell: bash
#build 실행
- name: Build with Gradle
run: ./gradlew build
working-directory: ./weather-data-api
shell: bash
#codedeploy를 하기 위해서는 S3를 거쳐야하는데 옮겨주기 위해서 압축 파일을 만들어주고 옮긴다.
- name: make zip file
run: zip -qq -r ./$GITHUB_SHA.zip .
shell: bash
working-directory: ./weather-data-api
# AWS 서비스를 사용하기 위한 인증 과정 setting 안에 secrets값 등록
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ secrets.AWS_REGION }}
# 배포할 zip 파일을 s3에 업로드
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://weather-level-deploy/$PROJECT_NAME/$GITHUB_SHA.zip
working-directory: ./weather-data-api
# 코드 배포 시작
- name: Code Deploy
run: aws deploy create-deployment --application-name WeatherLevel --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name dev --s3-location bucket=weather-level-deploy,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip
build를 하고 압축을 해서 S3로 전달 해주기 여기서 S3로 전달하는 zip 안에 build된 jar 파일과 appspec.yml, deploy.sh를 포함되어야 된다.
위에서 설정한 yml에서 압축된 파일이 S3 버켓으로 이동된다.
S3 버킷에 들어있는 zip 파일을 연결된 ec2 인스턴스로 전달한다. 이때 인자를 전달하는 역할을 codedeploy-agent가 담당한다.
codedeploy에 연결된 ec2 인스턴스에 설치되는 녀셕이다.
codedeploy-agent에서 codedeploy가 s3에서 받아온 zip 파일을 압축을 풀어서 인스턴스 안에 저장시킨다. 그리고 zip안에 들어있는 appspec.yml 파일을 찾아서 실행시킨다.
version: 0.0
os: linux
files:
- source: /
destination: /deploy
permissions:
- object: /deploy
owner: ubuntu
group: ubuntu
mode: 755
hooks:
AfterInstall:
- location: deploy.sh
timeout: 60
runas: root
위 파일에서는 ec2에 받아온 jar 파일을 실행시킬 권한을 받아온다.
그리고 AfterInstall에서 jar을 실행시키는 코드가 들어있는 deploy.sh를 호출한다.
#!/usr/bin/env bash
REPOSITORY=/deploy
cd $REPOSITORY
APP_NAME=java
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep '.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME
CURRENT_PID=$(pgrep -f $APP_NAME)
if [ -z $CURRENT_PID ]
then
echo "> 종료할것 없음."
else
echo "> kill -9 $CURRENT_PID"
sudo kill -15 $CURRENT_PID
sleep 5
fi
echo "> $JAR_PATH 배포"
sudo nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &
위 코드에서 실질적으로 ec2에서 jar파일을 실행시킨다.
해결: github에서 직접 수정해주고 intelliy에서 pull 받아서 사용하였다.
해결: yml파일을 수정하고 github action에서 테스트가 끝날 때 까지 기다리자
방법: ec2의 /var/log/aws/codedeploy-agent/codedeploy-agent.log에 로그가 있으니 에러를 찾아보자
해결: zip 파일 안에 appspec.yml이 들어있지 않아서 오류가 발생하는 것이다.