ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CICD (GitHubActions + EC2 + RDS + S3 + Code Deploy) - Github Ation - deploy.yml 파일 작성 요령 및 appspec.yml 설정
    AWS 2023. 7. 30. 21:18
    728x90

    Github Actions를 사용하면 CICD를 구현함에 있어서 많은 편리한 기능이 제공된다.

    먼저 우리가 코드를 수정하고 생성한 뒤, 해당 프로잭트를 github에 올리면, 우리가 만들어놓은 deploy.yml 파일의 설정에 따라 최신코드가 반영되고 이를 배포할 수 있게 된다.

     

    Github Actions을 사용하기 위해선, deploy.yml파일을 작성을 해야하는데 해당 경로를 .github/workflows 하위에 작성하여야 한다. 

     

    참고 링크

    https://docs.github.com/ko/actions/learn-github-actions/understanding-github-actions

     

    GitHub Actions 이해 - GitHub Docs

    GitHub Actions is a continuous integration and continuous delivery (CI/CD) platform that allows you to automate your build, test, and deployment pipeline. You can create workflows that build and test every pull request to your repository, or deploy merged

    docs.github.com

     

    deploy.yml 파일 생성

     

    스크립트 작성

    name: CICD
    
    # 해당 스크립트가 실행되는 시기 설정
    on:
      push:
        branches:
          - main
    
    # 필요한 환경변수를 설정
    env:
      S3_BUCKET_NAME: s3-webproject
      CODE_DEPLOY_APPLICATION_NAME: CODE-DEPLOY
      CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: CODE-DEPLOY-GROUP
    
    # 수행할 JOB을 설정
    jobs:
      build:
        # 실제 ubuntu20.04로 맞추는것이 좋다.
        runs-on: ubuntu-latest
        
        # job 안의 step 설정
        steps:
          - name: checkout
            uses: actions/checkout@v2
            
          - name: Set up JDK XX
            uses: actions/setup-java@v1
            with:
              java-version: 17
    
          - name: Grant execute permission for gradlew
            run: chmod +x ./gradlew
            # 돌아가는 환경은 bash.sh에서 동작
            shell: bash
            
          - name: Build with Gradle
            # jar 파일 생성을 위한 명령. 추가적으로 build 과정에서의 설정이 더 있으면 여기 작성
            run: ./gradlew clean build
            shell: bash
            
          # 빌드 결과를 zip파일로 결과를 올리는 작업
          - name: Make zip file
            # 공식문서의 GITHUB_SHA를 확인. commit의 결과를 고유한 값으로 만들어주기 위함.
            run: zip -r ./$GITHUB_SHA .
            shell: bash
            
          # S3에 파일을 저장하기 위한 권한 설정
          - name: Configure AWS credientials
            uses: aws-actions/configure-aws-credentials@v1
            with:
            # 아래의 값은 git > setting > secrete > actions 에 올려둔 설정 정보를 읽어와서 사
              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
            
           # s3에 저장된 zip파일을 이용해서 배포를 하는 과정을 정의
          - name: Code Deploy
            # | : enter 표현 방식
            run: |
              aws deploy create-deployment \
              --deployment-config-name CodeeployDefault.AllAtOnce \
              --aplication-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
              --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
              --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip

    ==================

    appspec.yml 파일 작성

     

    공식문서 참고

    https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file.html

     

    CodeDeploy AppSpec 파일 참조 - AWS CodeDeploy

    tar 및 압축된 tar 아카이브 파일 형식(.tar 및 .tar.gz)은 Windows Server 인스턴스에서 지원되지 않습니다.

    docs.aws.amazon.com

    기본적으로 appspec.yml 파일은 Code Deploy에서 배포를 관리하는데 사용하는 yml 형식, json 형식의 파일을 말한다.

     

    프로잭트 경로 최상단에 appspec.yml 파일 생성 후 작성

    version: 0.0
    os: linux
    
    files:
      - source: /
        # 해당 위치에 우리의 github에 올린 프로잭트 repository가 생성이된다.
        destination: /home/ubuntu/{github의 repository 명}
        overwrite: yes
    file_exists_behavior: OVERWRITE
    permissions:
      - object: /
        owner: ubuntu
        group: ubuntu
    hooks:
      AfterInstall:
        - location: scripts/deploy.sh
          timeout: 60
          runas: ubuntu

     

    일단 우리의 EC2 서버에서 Code deploy agent를 세팅을 해주어야 한다.

    EC2 접속 후,

    sudo service codedeploy-agent restart 명령어 입력

     

    >> 위의 설정을 하는 이유는 최신의 code deploy 설정을 읽어들이기 위해서이다.

     

    code deploy agent가 어떻게 동작하고 있는지 로그파일을 확인하면 좋기 때문에,

    tell -F /var/log/aws/codedeploy-agent/codedeploy-agent.log 명령어로 로그 확인

     

     

    다음은 appspec.yml 파일에 작성한 scripts/deploy.sh 파일을 작성해야 한다.

    #!/bin/bash
    PROJECT_NAME="{프로잭트 이름}"
    
    # -plain.jar 파일이 읽히지 않도록 설정을 해주어야 한다.
    # JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep 'SNAPSHOT.jar' | tail -n 1) << 예시
    
    JAR_PATH="/home/ubuntu/{프로잭트 이름}/build/libs/*.jar"
    DEPLOY_PATH=/home/ubuntu/$PROJECT_NAME/
    
    # 배포 log 파일 설정
    DEPLOY_LOG_PATH="/home/ubuntu/$PROJECT_NAME/deploy.log"
    
    # 배포가 실패한 이유를 보여주는 log 파일 설정
    DEPLOY_ERR_LOG_PATH="/home/ubuntu/$PROJECT_NAME/deploy_err.log"
    
    # application에서 발생한 로그를 쌓는 파일 설정
    APPLICATION_LOG_PATH="/home/ubuntu/$PROJECT_NAME/application.log"
    BUILD_JAR=$(ls $JAR_PATH)
    JAR_NAME=$(basename $BUILD_JAR)
    
    # >> : $DEPLOY_LOG_PATH 에 echo 명령어를 통해 로그를 찍어준다.
    echo "===== 배포 시작 : $(date +%c) =====" >> $DEPLOY_LOG_PATH
    
    echo "> build 파일명: $JAR_NAME" >> $DEPLOY_LOG_PATH
    echo "> build 파일 복사" >> $DEPLOY_LOG_PATH
    cp $BUILD_JAR $DEPLOY_PATH
    
    echo "> 현재 동작중인 어플리케이션 pid 체크" >> $DEPLOY_LOG_PATH
    CURRENT_PID=$(pgrep -f $JAR_NAME)
    
    if [ -z $CURRENT_PID ]
    then
      echo "> 현재 동작중인 어플리케이션 존재 X" >> $DEPLOY_LOG_PATH
    else
      echo "> 현재 동작중인 어플리케이션 존재 O" >> $DEPLOY_LOG_PATH
      echo "> 현재 동작중인 어플리케이션 강제 종료 진행" >> $DEPLOY_LOG_PATH
      echo "> kill -9 $CURRENT_PID" >> $DEPLOY_LOG_PATH
      kill -9 $CURRENT_PID
    fi
    
    
    DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
    echo "> DEPLOY_JAR 배포" >> $DEPLOY_LOG_PATH
    
    # 아래 1. 2. 중 선택하여 작성
    
    # 1. background에서 app이 돌 수 있게끔
    nohup java -jar $DEPLOY_JAR >> $APPLICATION_LOG_PATH 2> $DEPLOY_ERR_LOG_PATH &
    
    # 2. multi module 구조라면, profiles.active=설정 적용
    nohup java -jar -Dspring.profiles.active=prod $DEPLOY_JAR >> $APPLICATION_LOG_PATH 2> $DEPLOY_ERR_LOG_PATH &
    								# 발생한 로그를 저장
    
    sleep 3
    
    echo "> 배포 종료 : $(date +%c)" >> $DEPLOY_LOG_PATH

     

    EC2 서버에서 로그 확인하기(위의 deploy.sh 파일 기준)

    CASE> 배포과정의 로그 확인 : cat deploy.log

    CASE> 배포과정의 에러로그 확인 : cat deploy_err.log

    CASE> APP 실행과정의 로그 확인 : cat application.log

     

     

    **참고**

    - plain.jar 파일 생성 하지 않도록 하는 방법

    build.gradle 하단에 추가

    /*
    '-plain.jar' 파일 없애기
     */
    jar {
        enabled = false
    }

     

    사용포트 확인

    ec2 서버에서

    >> isof -i:8080

     

Designed by Tistory.