안녕하세요
Rosa
입니다. 이번 주 주말에 진행했던 Github actions 와 codeDeploy 를 활용한 CI / CD 를 Poogle
에게 배웠을 때, 이 내용을 모두가 들으면 도움이 될만하다 생각해서 정리해 봤습니다.EC2와 S3 버킷 생성은 이미 알고있을 듯 하여 내용에서 뻈습니다.
과정을 다음과 같습니다.

Github actions
github actions 는 푸시등의 레포지토리를 변경하는 작업이 일어날 때, 깃허브에서 제공해주는 컴퓨터를 통해서 빌드 등의 작업을 하는 것을 말합니다.
github actions 를 사용하려면 아래 사진같이
Actions
에 들어가서 Set up a workflow yourself
버튼을 누른 뒤에 생기는 ./.github/workflows/main.yaml
파일을 수정해주시면 됩니다
# This is a basic workflow to help you get started with Actions name: CI # Controls when the workflow will run on: # Triggers the workflow on push or pull request events but only for the main branch push: branches: [ main ] pull_request: branches: [ main ] # A workflow run is made up of one or more jobs that can run sequentially or in parallel jobs: # This workflow contains a single job called "build" build: # The type of runner that the job will run on runs-on: ubuntu-latest # Steps represent a sequence of tasks that will be executed as part of the job steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it #- uses: actions/checkout@v2 # Runs a single command using the runners shell - name: Run pwd run: pwd # Runs a set of commands using the runners shell - name: Run ls -al run: ls -al
속성들은 아래와 같습니다.
- name : workflow의 이름을 지정합니다.
- on : 해당 workflow가 언제 실행될건지 트리거를 지정할 수 있습니다.
- job, steps : workflow는 하나 이상의 job을 가지게 되고, job은 여러 step에 따라 단계를 나눌 수 있습니다.
- run-on : 해당 workflow를 어떤 OS 환경에서 실행 할 것인지 지정할 수 있습니다.

이렇게
main.yaml
(다른 이름도 가능, 저희는 deploy.yaml
이라는 이름을 사용했습니다) 을 만들면 on에서 지정한 트리거가 일어날 경우 main.yaml
파일에 적어놓은 steps 가 실행되게 됩니다.저희의 yaml 파일은 아래 내용이 더 추가되었습니다.
steps: # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 // JDK set up - name: Set up JDK 1.11 uses: actions/setup-java@v1 with: java-version: 1.11 // gradlew 실행권한 추가 - name: Grant execute permission for gradlew run: chmod +x ./gradlew shell: bash // gradle 빌드 명령 - name: Build with Gradle run: ./gradlew build shell: bash - name: Make zip file run: zip -r ./$GITHUB_SHA.zip . shell: bash // AWS IAM credentials - 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 }} // s3에 업로드하는 aws cli 명령어 - name: Upload to S3 run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip // code deploy를 진행하는 aws cli 명령어 - name: Code Deploy run: aws deploy create-deployment --application-name modi-github-actions-deploy --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name modi-codeDeploy-s3-group --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip

codeDeploy
CodeDeploy는 아래와 같은 단계로 수행됩니다.
- 소스코드와
appspec.yaml
을 리포지토리에 push 한다.
- github actions를 이용하여 deployment를 트리거 한다.
- CodeDeploy를 polling 하고 있던 EC2 인스턴스는 트리거를 확인한다.
polling
폴링(polling)이란 하나의 장치(또는 프로그램)가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치(또는 프로그램)의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다.
- 리포지토리에서 소스코드와
appspec.yaml
파일을 받아와 deployment 명령을 수행한다.
deploy 명령을 수행하기 위해서는 EC2 내의 명령을 받아줄
CodeDeploy-agent
라는 프로그램이 필요합니다. 따라서 아래와 같은 명령어를 통해서 설치해줘야합니다.# 패키지 매니저 업데이트, ruby 설치 sudo yum update sudo yum install ruby sudo yum install wget # 서울 리전에 있는 CodeDeploy 리소스 키트 파일 다운로드 cd /home/ubuntu 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
그 다음, AWS CodeDeploy 어플리케이션을 생성해서 EC2 와 연결해줘야합니다.
세부 이미지
CodeDeploy -> 어플리케이션
에 들어가 생성을 해줍니다.

- 어플리케이션 생성 후
배포 그룹 생성
버튼을 눌러 배포그룹을 생성해줘야합니다.

서비스 역할은 IAM 계정을 통해서 codeDeploy access 를 얻은 사용자이 있어야합니다.

그 후, 만들었던 EC2 인스턴스와 연결해줘야합니다.

많은 요청이 들어오지 않기 때문에 로드 벨런서는 껐습니다.

위에서 말한 것 처럼,
appspec.yaml
파일을 통해서 배포 설정을 해줘야합니다. appspec.yaml
파일은 프로젝트 최상단에 생성시키면 됩니다.version: 0.0 os: linux files: - source: / destination: /home/ubuntu/action overwrite: yes permissions: - object: / pattern: "**" owner: ubuntu group: ubuntu
마지막으로 shell script를 작성하여, 구체적인 배포 스크립트를 만들면 되겠습니다. 이 부분은 아직 하지못했기 때문에 차후에 진행하여 업로드 하겠습니다.
이번 내용은 설명을 위해 몇가지 단계를 빠르게 이야기 했습니다. 좀 더 자세한 단계를 알고 싶다면 아래 블로그를 통해서 확인하면 될 것 같습니다!