Github Action(배포 자동화)

Viva의 놀이터·2021년 5월 14일
2
post-thumbnail

배포 자동화

필요한 것

  • S3 버켓
  • IAM 설정
  • CodeDeploy
  • action설정.yml
  • appspec.yml
  • deploy.sh

action 설정.yml

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를 포함되어야 된다.

S3 버킷

위에서 설정한 yml에서 압축된 파일이 S3 버켓으로 이동된다.

Codedeploy

S3 버킷에 들어있는 zip 파일을 연결된 ec2 인스턴스로 전달한다. 이때 인자를 전달하는 역할을 codedeploy-agent가 담당한다.

codedeploy-agent

codedeploy에 연결된 ec2 인스턴스에 설치되는 녀셕이다.

codedeploy-agent에서 codedeploy가 s3에서 받아온 zip 파일을 압축을 풀어서 인스턴스 안에 저장시킨다. 그리고 zip안에 들어있는 appspec.yml 파일을 찾아서 실행시킨다.

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를 호출한다.

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 action

github action 설정.yml

  • github action 설정 파일은 IntelliJ에서 수정 한 뒤에 push가 불가능하다.
    push를 하게되면 workflow는 push가 불가능하다고 error가 뜬다.

해결: github에서 직접 수정해주고 intelliy에서 pull 받아서 사용하였다.

  • pull 받은다음에 변경된 yml파일이 적용되기를 기다려야 되는데 끝나기도 전에 push를 해서 git action을 발생시키면 aws의 codedeploy에서 이미 실행중인 파일을 또 실행시켰다고 오류가 뜬다.

해결: yml파일을 수정하고 github action에서 테스트가 끝날 때 까지 기다리자

codedeploy

  • codedeploy의 오류가 발생하면 log를 찍어보면된다.

방법: ec2의 /var/log/aws/codedeploy-agent/codedeploy-agent.log에 로그가 있으니 에러를 찾아보자

  • The CodeDeploy agent did not find an AppSpec file within the unpacked revision directory at revision-relative path "appspec.yml".

해결: zip 파일 안에 appspec.yml이 들어있지 않아서 오류가 발생하는 것이다.

참고
https://isntyet.github.io/deploy/github-action%EA%B3%BC-aws-code-deploy%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%98%EC%97%AC-spring-boot-%EB%B0%B0%ED%8F%AC%ED%95%98%EA%B8%B0(1)/

profile
역사를 잊은 기술에겐 미래가 없다

0개의 댓글