ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [AWS] Spring + Github Actions + CodeDeploy로 CI/CD 하기 2편
    Cloud/AWS 2021. 7. 12. 17:23
    728x90
    반응형

    Github Action, CodeDeploy로 CI/CD 하기 - 2편

    저번 글 에서 Github Actions로 프로젝트 빌드를 수행한 후에 jar 파일을 S3로 업로드 하는 것까지 알아보았습니다.

     

    스크린샷 2021-07-12 오후 1 44 58

    이번 글에서는 S3에 업로드 된 zip 파일을 CodeDeploy-Agent를 통해서 EC2에 자동으로 배포를 하는 CD를 하는 법에 대해서 알아보겠습니다.

     

    CodeDeploy 배포 과정

    • 개발하고 있는 프로젝트 최상단 경로에 appspec.yml 이라는 파일을 작성합니다. (이 파일에서 각 배포 단계에서 어떤 스크립트 파일을 실행할 것인지 명시할 수 있습니다.)
    • Agent는 S3에서 zip 파일을 내려 바고, appspec.yml 파일을 읽어 해당 파일에 적힌 배포 단계에 맞게 스크립트 파일을 실행시키면서 진행합니다.
    • Agent는 배포를 진행한 후 CodeDeploy에게 성공/실패 등의 결과를 알려줍니다.

     

    그리고 EC2 Linux2 버전으로 생성하고 IAM 역할 설정을 해주어야 하는데요. 그 설정하는 것은 이 글에서는 생략하겠습니다. 설정하고 생성하는 방법이 궁금하다면 여기 를 참고해주세요.

     

     

     

    CodeDeploy Agent 설치하기

    # 패키지 매니저 업데이트, ruby 설치 
    sudo yum update 
    sudo yum install ruby 
    sudo yum install wget 
    
    # 서울 리전에 있는 CodeDeploy 리소스 키트 파일 다운로드 
    cd /home/ec2-user wget 
    
    https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install 
    
    # 설치 파일에 실행 권한 부여 
    chmod +x ./install 
    
    # 설치 진행 및 Agent 상태 확인 
    sudo ./install auto 
    sudo service codedeploy-agent status

    위의 명령어를 통해서 EC2 Linux2에서 CodeDeploy-Agent를 설치하겠습니다.

     

    스크린샷 2021-07-12 오후 4 09 19

     

    위와 같이 설치한 후에 CodeDeploy-Agent가 잘 실행되고 있는지 확인할 수 있습니다.



     

    CodeDeploy 생성하기

    스크린샷 2021-07-12 오후 4 11 38

     

    스크린샷 2021-07-12 오후 4 14 25

     

    스크린샷 2021-07-12 오후 4 16 37

    • 현재 위치 배포 방식으로 진행하겠습니다.
    • 태그 그룹에 EC2에서 지정한 태그를 정확하게 설정해야 CodeDeploy를 통해서 해당 EC2에 배포를 진행할 수 있습니다.

     

     

    스크린샷 2021-07-12 오후 4 19 24

     

    스크린샷 2021-07-12 오후 4 26 15



     

     

    스크립트 추가하기

    위에서 CodeDeploy를 동작시키기 위해서는 appspec.yml 파일이 필요하다고 했습니다.

     

    스크린샷 2021-07-12 오후 4 21 54

    위와 같이 프로젝트 최상단에 appspec.yml을 작성하겠습니다.

     

     

     

    appspec.yml

    version: 0.0
    os: linux
    files:
      - source:  /
        destination: /home/ec2-user/action
        overwrite: yes
    
    permissions:
      - object: /
        pattern: "**"
        owner: ec2-user
        group: ec2-user
    
    hooks:
      ApplicationStart:
        - location: scripts/deploy.sh
          timeout: 60
          runas: ec2-user
    • files.destination
      • S3에 있는 zip 파일이 EC2에 배포될 위치를 지정합니다.
    • ApplicationStart
      • ApplicationStart 단계에서 deploy.sh를 실행시키도록 합니다.



     

    Shell Script 파일 작성하기

    #!/bin/bash
    BUILD_JAR=$(ls /home/ec2-user/action/build/libs/*.jar)
    JAR_NAME=$(basename $BUILD_JAR)
    echo "> build 파일명: $JAR_NAME" >> /home/ec2-user/action/deploy.log
    
    echo "> build 파일 복사" >> /home/ec2-user/action/deploy.log
    DEPLOY_PATH=/home/ec2-user/action/
    cp $BUILD_JAR $DEPLOY_PATH
    
    echo "> 현재 실행중인 애플리케이션 pid 확인" >> /home/ec2-user/action/deploy.log
    CURRENT_PID=$(pgrep -f $JAR_NAME)
    
    if [ -z $CURRENT_PID ]
    then
      echo "> 현재 구동중인 애플리케이션이 없으므로 종료하지 않습니다." >> /home/ec2-user/action/deploy.log
    else
      echo "> kill -15 $CURRENT_PID"
      kill -15 $CURRENT_PID
      sleep 5
    fi
    
    DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
    echo "> DEPLOY_JAR 배포"    >> /home/ec2-user/action/deploy.log
    nohup java -jar $DEPLOY_JAR >> /home/ec2-user/deploy.log 2>/home/ec2-user/action/deploy_err.log &

    위의 스크립트 파일은 현재 jar가 실행 중이라면 kill 한 후에 jar를 다시 실행하는 간단한 스크립트 파일입니다. 하나씩 의미를 파악해보면 그리 어렵지 않게 이해하실 수 있습니다.



    Github Actions yml 작성

    name: gyunny-action
    
    on:
      push:
        branches:
          - master
      workflow_dispatch:
    
    env:
      S3_BUCKET_NAME: aws-gyun-s3
    
    jobs:
      build:
        runs-on: ubuntu-latest
    
        steps:
          - name: Checkout
            uses: actions/checkout@v2
    
          - name: Set up JDK 11
            uses: actions/setup-java@v1
            with:
              java-version: 11
    
          - name: Grant execute permission for gradlew
            run: chmod +x ./gradlew
            shell: bash
    
          - name: Build with Gradle
            run: ./gradlew build
            shell: bash
    
          - name: Make zip file
            run: zip -r ./$GITHUB_SHA.zip .
            shell: bash
    
          - 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 }}
    
          - name: Upload to S3
            run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip
    
          # 새로 추가 된 부분
          - name: Code Deploy
            run: aws deploy create-deployment --application-name Github-Actions-Deploy --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name Github-Actions-Group --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip
    • application-name
      • CodeDeploy 애플리케이션의 이름을 지정합니다.
    • deployment-config-name
      • 배포 그룹 설정에서 선택했던 배포 방식을 지정합니다.
    • deployment-group-name
      • 배포 그룹의 이름입니다.
    • s3-location
      • jar를 S3에서 가지고 오기 위해 차례로 S3 Bucket 이름, 파일 타입(ex: zip), 파일 경로를 입력합니다.

     

     

     

    위와 같이 shell script, yml 파일을 수정 한 후에 Github으로 push 하겠습니다.

     

    스크린샷 2021-07-12 오후 5 13 03

    그러면 위와 같이 Github Action은 잘 성공한 것을 볼 수 있습니다. 그리고 바로 CodeDeploy로 가서 잘 실행되고 있는지 확인해보겠습니다.

     

     

    스크린샷 2021-07-12 오후 5 14 30

    CodeDeploy도 모두 문제 없이 잘 성공한 것을 볼 수 있습니다. 이제 EC2로 접속해서 jar가 잘 실행되었는지, 프로젝트는 제대로 넘어왔는지를 확인해보겠습니다.

     

    스크린샷 2021-07-12 오후 5 18 07

    EC2에 접속해서 action 폴더 아래에 확인해보면 위와 같이 프로젝트가 제대로 EC2로 전달된 것도 확인할 수 있고 jar도 8081 포트로 잘 실행되고 있는 것을 볼 수 있습니다.(일부로 8081 포트로 실행시켰습니다.) 이렇게 이번 글에서 Github actions, CodeDeploy로 CI/CD 하는 법에 대해서 알아보았습니다.

    반응형

    댓글

Designed by Tistory.