AWS, SpringBoot, Nginx, Docker로 무중단 배포하기(2)
Git Action
CI/CD로는 Git Action을 사용했습니다. 원래 Travis CI를 사용하려 했으나(어느정도 구축은 해놓았으나), 일부유료(배포건수 제한)로 전환되어, Git Action을 사용하였습니다.
위 흐름을 잘 이해해야 합니다.
배포를 위한 설정은 .github/workflows에 yml 파일을 작성하면 됩니다. 다음은 프로젝트의 yml파일입니다. 이 설정에는 Git 저장소에 있는 소스를 빌드하여 S3에 로드하고, CodeDeploy는 EC2에 있는 CodeDeploy Agent에 배포요청을 하면, CodeDeploy Agent가 S3에서 빌드된 jar를 가져오는 처리가 포함되어 있습니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 | # This is a basic workflow to help you get started with Actions name: trvapp on: workflow_dispatch: env: S3_BUCKET_NAME: trvapp-deploy PROJECT_NAME: trvapp 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: $ aws-secret-access-key: $ aws-region: $ - name: Upload to S3 run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip - name: Code Deploy run: aws deploy create-deployment --application-name trvapp-deploy --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name deploy-group_trvapp --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip | cs |
-
on
해당 배포(workflow)가 언제 실행될지 지정합니다. push나 pull했을 때 실행되도록 지정할 수도 있지만, 수동으로 실행되도록 했습니다.(workflow_dispatch) -
jobs
(1) runs-on에는 어떤 OS 환경에서 실행될지를 기재하며, steps에는 실행될 job들을 순차적으로 기재합니다.
(2) Checkout : git에 업로드된 소스를 가져옵니다.
(3) Set up JDK, Grant execute permission for gradlew, Build with Gradle : JAVA를 설치하고, Gradle build를 위한 권한을 설정하며, build합니다.
(4) Make zip file : 업로드된 파일을 zip으로 압축합니다. $GITHUB_SHA는 현재 실행 workflow의 해시값입니다.(환경변수)
(5) Upload to S3 : 위에서 압축한 zip 파일을 설정한 S3 계정으로 upload 합니다.
(6) Code Deploy : CodeDeploy, Agent를 통해 S3에 업로드된 파일을 가져오기 위한 명령어 입니다.- application-name : CodeDeploy 어플리케이션의 이름 지정
- deployment-config-name : 배포그룹설정에서 선택했던 배포방식 지정
- deployment-group-name : 배포그룹의 이름
- s3-location : S3에서 jar를 가져오기 위한 S3의 bucket 이름, 파일타입, 파일경로 지정
다음은 EC2에 배포된 프로젝트 빌드 파일이 구동되기까지 과정을 처리하는 appspec.yml 파일입니다.
이 yml설정은 다음장에서 설명할 CodeDeploy 애플리케이션 구성 - 컴퓨팅 플랫폼이 EC2/온프레미스로 선택했을 때, 동작합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | version: 0.0 os: linux files: - source: / destination: /home/ubuntu/app/trvapp/trvapp overwrite: yes file_exists_behavior: OVERWRITE permissions: - object: / pattern: "**" owner: ubuntu group: ubuntu hooks: ApplicationStart: - location: scripts/run_new_was.sh timeout: 200 runas: ubuntu - location: scripts/health_check.sh timeout: 200 runas: ubuntu | cs |
- files
(1) source : destination으로 복사할 파일의 경로 지정
(2) destination : EC2 인스턴스에 복사될 경로 지정 -
file_exists_behavior: 파일이 이미 경로에 있어도, OVERWRITE 합니다.
- hooks
ApplicationStart : 어플리케이션 구동을 위한 명령어 (셸 스크립트 경로 지정)
댓글남기기