-
[AWS] Spring + Github Actions + CodeDeploy로 CI/CD 하기 2편Cloud/AWS 2021. 7. 12. 17:23728x90반응형
Github Action, CodeDeploy로 CI/CD 하기 - 2편
저번 글 에서
Github Actions
로 프로젝트 빌드를 수행한 후에 jar 파일을 S3로 업로드 하는 것까지 알아보았습니다.이번 글에서는 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를 설치하겠습니다.위와 같이 설치한 후에 CodeDeploy-Agent가 잘 실행되고 있는지 확인할 수 있습니다.
CodeDeploy 생성하기
- 현재 위치 배포 방식으로 진행하겠습니다.
- 태그 그룹에 EC2에서 지정한 태그를 정확하게 설정해야 CodeDeploy를 통해서 해당 EC2에 배포를 진행할 수 있습니다.
스크립트 추가하기
위에서 CodeDeploy를 동작시키기 위해서는
appspec.yml
파일이 필요하다고 했습니다.위와 같이 프로젝트 최상단에
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 하겠습니다.그러면 위와 같이 Github Action은 잘 성공한 것을 볼 수 있습니다. 그리고 바로
CodeDeploy
로 가서 잘 실행되고 있는지 확인해보겠습니다.CodeDeploy도 모두 문제 없이 잘 성공한 것을 볼 수 있습니다. 이제 EC2로 접속해서 jar가 잘 실행되었는지, 프로젝트는 제대로 넘어왔는지를 확인해보겠습니다.
EC2에 접속해서
action
폴더 아래에 확인해보면 위와 같이 프로젝트가 제대로 EC2로 전달된 것도 확인할 수 있고 jar도 8081 포트로 잘 실행되고 있는 것을 볼 수 있습니다.(일부로 8081 포트로 실행시켰습니다.) 이렇게 이번 글에서Github actions
,CodeDeploy
로 CI/CD 하는 법에 대해서 알아보았습니다.반응형'Cloud > AWS' 카테고리의 다른 글
[AWS] RDS 스키마 마이그레이션 하는 법 (0) 2021.10.27 [AWS] Spring + Github Actions + CodeDeploy로 CI/CD 하는 법 (0) 2021.07.12 [AWS] Load-Balancer, CodeDeploy, Docker로 CI/CD 하기 (0) 2021.06.17 [AWS] API Gateway, Lambda로 S3 파일 업로드 API 만들기 (2) 2021.05.14 [AWS] NodeJS로 만든 Lambda 함수로 이미지 사이즈 줄이는 법 (0) 2021.05.13 - 개발하고 있는 프로젝트 최상단 경로에