본문 바로가기

개발

[CI/CD] (5) CD 구축하기 - GitHub Actions

앞서 AWS EC2, S3, CodeAgent까지는 설정을 완료했고, 마지막으로 github workflow와 appspec.yml 그리고 실행한 script 파일을 완성하여 CICD 파이프라인 구축을 마쳐보겠습니다. 

 

1. appspec.yml 

version: 0.0
os: linux

files:
  - source: /         # Repository(S3)
    destination: /home/ubuntu/app   # EC2 instance

permission:
  - object: /home/ubuntu/app/
    owner: ubuntu
    group: ubuntu
    mode: 755

hooks:
  ApplicationStart:
    - location: deploy.sh
      timeout: 60
      runas: root

appspec.yml은 위와 같이 작성해줍니다.

(appspec.yml과 script 파일은 프로젝트 루트 경로에 작성해두면 됩니다.)

 

자세히 살펴보면,

 

version/os

0.0, linux로 고정해도 됩니다.

 

files

파일을 불러올 위치와 저장할 위치를 명시하면 됩니다.

 

source: Repository(S3)에 저장된 위치

destination: EC2 instance에서 저장할 위치 

 

permission

권한 설정

 

hooks:

배포 프로세스의 각 단계에서 수행할 스크립트 파일을 명시해줍니다. 

프로젝트를 빌드하고 실행하는 것을 목표로 하므로, ApplicationStart 시점에 deploy.sh를 수행하는 것만 명시해줍니다.

 

복잡한 프로세스에서는 단계별로 수행할 과정이 조금 더 세분화될 것입니다.

 

2. deploy.sh

실제 빌드 시 수행할 명령어를 작성한 스크립트입니다. 

(스크립트는 github action과 aws code deploy를 이용하여 spring boot 배포하기(4) - 해보고나면 별거아니다 (isntyet.github.io를 참고했습니다!) 

REPOSITORY=/home/ubuntu/app
cd $REPOSITORY

JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep '.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME

CURRENT_PID=$(pgrep java)

if [ -z $CURRENT_PID ]
then
  echo ">Nothing working."
else
  sudo kill -9 $CURRENT_PID
fi

sudo nohup java -jar $JAR_PATH &

(1) .jar 파일 위치 확인

(2) 기존 프로세스가 있다면 종료

(3) .jar 파일 실행

 

크게 위와 같은 3부분으로 나눠져 있습니다.

 

쉘 스크립트 문법이 까다로우니 익숙하지 않다면 오류가 나지 않게 주의하셔야 합니다!

커맨드로 할때는 당연한데 파일로 작성하다보니 할당 시 띄어쓰기 하면 안되는걸 생각못해서 헤맸었네요😂 ( a = 100 (x) a=100 (o))

 

 3. GitHub Actions(Workflow)

이제 마지막입니다!

name: deploy

on:
  push:
    branches: ["master"]
    
jobs:
  deploy:
    runs-on: ubuntu-20.04
    environment: CICD
    env:
      APPLICATION: ${{secrets.APPLICATION}}
      APPLICATION_TEST: ${{secrets.APPLICATION_TEST}}
      
    steps:
      - name: Checkout
        uses: actions/checkout@v3
  
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'temurin'
          
      - name: Create 'resoureces' dir for test
        run : mkdir ./src/test/resources
        
      - name: Create application.yml(test)
        run : touch ./src/test/resources/application.yml
        
      - name: Copy secretes to application.yml(test)
        run : echo "$APPLICATION_TEST" > ./src/test/resources/application.yml
        
      - name: Copy secrets to application.yml(build)
        run:  echo "$APPLICATION" > ./src/main/resources/application.yml
        
      - name : Grand permission
        run : chmod +x gradlew
        
      - name : Build
        run:  ./gradlew clean build
        
      - name  : Make zip
        run : zip -qq -r ./$GITHUB_SHA.zip .
        
      - name: Configure AWS crendentials
        uses: aws-actions/configure-aws-credentials@v2
        with:
          aws-access-key-id: ${{secrets.AWS_ACCESS_KEY_ID}}
          aws-secret-access-key: ${{secrets.AWS_SECRET_ACCESS_KEY}}
          aws-region: ${{secrets.AWS_REGION}}
          
      - name: Upload to S3
        run : aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://${{secrets.S3_BUCKET_NAME}}/$GITHUB_SHA.zip
        
      - name: Deploy with application
        run : aws deploy create-deployment --application-name cicd-application --deployment-group cicd-group --s3-location bucket=${{secrets.S3_BUCKET_NAME}},key=$GITHUB_SHA.zip,bundleType=zip

조금 길어졌는데, CI 때 확인했던 내용은 제쳐두고 중요한 내용만 확인하겠습니다.

https://lback.tistory.com/19 -> GitHub Actions에 관한 내용은 이 글을 참고하시면 됩니다.

 

Make zip 부터가 CD를 위한 steps 입니다.

 

Make zip :

S3에 업로드 하기 위해 프로젝트를 압축합니다.

$GITHUB_SHA는 각각의 커밋마다 할당되는 값으로 생각하시면 됩니다.

 

Configure AWS credentials :

S3와 CodeDeploy에 접근하기 위한 IAM 사용자를 미리 만들어두었습니다.

그때 발급했던 액세스 키를 통해 접근 권한을 얻습니다.

 

노출되면 안되니, application.yml을 관리했던 것처럼 secrets로 접근하면 됩니다!

(※이 부분이 이해가 안가실때도 https://lback.tistory.com/19 참고하시면 됩니다)

 

Upload to S3

S3에 앞서 압축한 zip 파일을 업로드 해줍니다.

aws s3 cp --region [region] [이동할 파일] [s3://버킷 이름/저장할 이름]

 

Deploy with application

마지막으로, CodeDeploy Application 배포 커맨드를 호출해줍니다.

 

aws deploy create-deployment
--application-name [deploy application name]
--deployment-group [배포 그룹 명] 
--s3-location bucket=[프로젝트가 업로드 된 s3 버킷 이름], key=[프로젝트 파일 이름], bundleType=[압축 형태]

더 자세한 옵션은 

https://docs.aws.amazon.com/cli/latest/reference/deploy/create-deployment.html 를 참고하시면 됩니다.

 

4. 결과확인

현재 서버에 접속하면 나오는 화면입니다. 여기서 인사문구를 바꾸도록 수정해보겠습니다.

nice to meet you를 hello로 바꾸니, master로 push 이벤트가 발생하면 수행되는 workflow가 실행됩니다.

 

직접 실행파일을 변경하지 않았는데, 잘 변경된 것을 확인할 수 있습니다!

 

 

 

이상으로 GitHub Actions와 AWS Code Deploy를 활용한 CI/CD 파이프라인 구축을 마치겠습니다.