[CI/CD] GitHub Actions

hjin·2023년 7월 24일
0

핵심은 Github 프로젝트 코드를 S3에 업로드한 후 EC2에서 끌어다 쓰는 것.
CodeDeploy는 그걸 보조해주는 역할을 담당.
Github에서 CodeDeploy와 S3에 접근이 가능해야 하고 EC2에서 S3에 접근이 가능해야함.




1. [Github] Secrets 설정

workflow.yml에 설정할 AWS-ACCESS-KEY와 SECRET-KEY를 Github에 설정해야함.
github repository > Settings > Secrets > Actions 화면에서 변수명으로 각각 생성.

2. [AWS] S3 Bucket 생성

배포될 소스 압축파일이 저장되고 AWS-Codedeploy에서 사용할 S3 Bucket을 생성.
AWS > S3 > 배포될 버킷 생성 > 폴더 만들기

3. [AWS] 역할 생성

배포될 인스턴스와 codedeploy에서 사용할 role을 각각 생성

  • IAM > 역할 > 역할 만들기 > 사용사례 EC2 선택 > AWSCodeDeployFullAccess , AmazonS3FullAccess 권한 추가 > 역할 이름 입력 후 생성
  • 역할 만들기 > 다른 AWS 서비스의 사용 사례 CodeDeploy 선택 > 역할 이름 입력 후 생성

4. [AWS] EC2 역할 설정

작업 > 보안 > IAM 역할 수정 > 3번에서 만든 EC2 역할 지정

5. [AWS] CodeDeploy 설정

  • CodeDeploy > 배포 > 시작하기 > 애플리케이션 생성 > EC2/On-premises 선택 후 생성
  • CodeDeploy Group 생성 > 이름 입력 후 3번에서 만든 CodeDeploy 역할 지정 > Amazon EC2 instances 체크 후 배포될 인스턴스를 Tag에 등록 > CodeDeployDefault.AllAtOnce 선택, Enable load balancing 체크 해제

6. [AWS] CodeDeploy Agent 설치

$ sudo apt update
$ sudo apt install ruby-full
$ sudo apt install wget
$ cd /home/ubuntu
$ wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
$ chmod +x ./install
$ sudo ./install auto > /tmp/logfile
$ sudo service codedeploy-agent status

실행 에러가 나면 인스턴스 재부팅

7. [Github] workflow 설정

리포지토리 > Actions > set up a workflow yourself 선택 > 아래와 같이 aws.yml 작성

name: CI-CD

# 어떤 브랜치에 push시 github action CI를 동작시킬지
on:
  push:
    branches:
#      - dev
      - release/1.0.0
# 환경 변수 설정
# 생성한 Code Deploy와 S3의 이름을 설정한다.
env:
	CONTEXT: dev
  S3_BUCKET_NAME: s3-42partner-dev
  RESOURCE_PATH: ./module-api/src/main/resources/application.yml
  CODE_DEPLOY_APPLICATION_NAME: 42partner-CODE-DEPLOY
  CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: 42partner-CODE-DEPLOY-GROUP
# push 시 수행할 일들 정의
jobs:
  build:
# 실행 환경 이미지
    runs-on: ubuntu-latest
# 각 실행 스텝을 정의해준다.
# name은 실행 스텝의 이름으로 출력된다.
# uses는 github action의 특정한 action을 실행시키는 것이다.
# run은 커맨드를 실행시킨다.
# with는 uses에서 사용할 변수를 지정해준다.
# GitHub Actions 입장에서 바라보면 GitHub의 코드 저장소에 올려둔 코드를 
# CI 서버로 내려받은 후에 특정 브랜치로 전환하는 행위
    steps:
      - name: Checkout
        uses: actions/checkout@v2
      
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with: 
          java-version: 11

# github action에 secret으로 application.yml을 올려두고 빌드시 활용할 수 있도록 복사해준다.
      - run: mkdir ./module-api/src/main/resources
      - run: touch ./module-api/src/main/resources/application.yml
      - run: echo "${{ secrets.APPLICATION_DEV }}" > ./module-api/src/main/resources/application.yml
      - run: cat ./module-api/src/main/resources/application.yml

      - name: Grant execute permission for gradlew
        run: chmod +x ./module-api/gradlew
        shell: bash
# jar파일을 빌드한다.
      - name: Build with Gradle
        run: ./module-api/gradlew build -x test -Pprofile=${{ env.CONTEXT }}
        shell: bash
        
      - name: Make zip file
        run: zip -r ./$GITHUB_SHA .
        shell: bash

# AWS 계정의 key값을 입력하여 aws 커맨드를 사용할 수 있게 설정한다.
      - 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에 빌드된 파일을 전송해준다.
      - name: Upload to S3
        run: aws s3 cp --region ${{ secrets.AWS_REGION }} ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip
# Code deploy에게 S3에 저장된 빌드파일을 배포하도록 명령 내린다.
      - name: Code Deploy
        run: |
          aws deploy create-deployment \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --application-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

8. [Github] appspec.yaml 설정

appsepc.yml : 인스턴스에 application이 배포된 다음 무엇을 할것인지를 정하는 파일 (repository 최상위에 위치하도록 함)

version: 0.0
os: linux

files:
  - source: / # 인스턴스에 복사할 디렉터리 경로
    destination: /home/ec2-user/leafy-back # 인스턴스에서 파일이 복사되는 위치
    overwrite: yes # 복사할 위치에 파일이 있는 경우 대체

permissions:
  - object: / # 권한이 지정되는 파일 or 디렉터리
    pattern: "**" # 매칭되는 패턴에만 권한 부여
    owner: ec2-user # object의 소유자
    group: ec2-user # object의 그룹 이름

hooks:
  AfterInstall: # CodeDeploy의 AfterInstall 단계에서 실행
    - location: scripts/stop.sh # hooks에서 실행할 스크립트의 위치
      timeout: 60 # 스크립트 실행에 허용되는 최대 시간, 넘으면 배포 실패
      runas: ec2-user # 스크립트를 실행하는 사용자
  ApplicationStart: # CodeDeploy의 ApplicationStart 단계에서 실행
    - location: scripts/start.sh
      timeout: 60
      runas: ec2-user

9. [Github] workflow 실행

Run workflow 버튼이 활성화 > 클릭 > 인스턴스 내에서 배포 되었는지 확인

2개의 댓글

comment-user-thumbnail
2023년 7월 24일

잘 읽었습니다. 좋은 정보 감사드립니다.

답글 달기
comment-user-thumbnail
2023년 7월 26일

좋은 글이네요

답글 달기

관련 채용 정보