AWS, SpringBoot, Nginx, Docker로 무중단 배포하기(2)

1 분 소요


Git Action

CI/CD로는 Git Action을 사용했습니다. 원래 Travis CI를 사용하려 했으나(어느정도 구축은 해놓았으나), 일부유료(배포건수 제한)로 전환되어, Git Action을 사용하였습니다.

Deploy

위 흐름을 잘 이해해야 합니다.

배포를 위한 설정은 .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


  1. on
    해당 배포(workflow)가 언제 실행될지 지정합니다. push나 pull했을 때 실행되도록 지정할 수도 있지만, 수동으로 실행되도록 했습니다.(workflow_dispatch)

  2. 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
  1. files
    (1) source : destination으로 복사할 파일의 경로 지정
    (2) destination : EC2 인스턴스에 복사될 경로 지정
  2. file_exists_behavior: 파일이 이미 경로에 있어도, OVERWRITE 합니다.

  3. hooks
    ApplicationStart : 어플리케이션 구동을 위한 명령어 (셸 스크립트 경로 지정)

카테고리:

업데이트:

댓글남기기