-
CICD (GitHubActions + EC2 + RDS + S3 + Code Deploy) - Github Ation - deploy.yml 파일 작성 요령 및 appspec.yml 설정AWS 2023. 7. 30. 21:18728x90
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
'AWS' 카테고리의 다른 글
CICD (GitHubActions + EC2 + RDS + S3 + Code Deploy) - Code Deploy 설정 (0) 2023.07.30 CICD (GitHubActions + EC2 + RDS + S3 + Code Deploy) - S3 설정 (0) 2023.07.30 CICD (GitHubActions + EC2 + RDS + S3 + Code Deploy) - RDS 설정 (0) 2023.07.30 CICD (GitHubActions + EC2 + RDS + S3 + Code Deploy) - EC2 설정 정리 (0) 2023.07.30