핵심은 Github 프로젝트 코드를 S3에 업로드한 후 EC2에서 끌어다 쓰는 것.
CodeDeploy는 그걸 보조해주는 역할을 담당.
Github에서 CodeDeploy와 S3에 접근이 가능해야 하고 EC2에서 S3에 접근이 가능해야함.
workflow.yml에 설정할 AWS-ACCESS-KEY와 SECRET-KEY를 Github에 설정해야함.
github repository > Settings > Secrets > Actions 화면에서 변수명으로 각각 생성.
배포될 소스 압축파일이 저장되고 AWS-Codedeploy에서 사용할 S3 Bucket을 생성.
AWS > S3 > 배포될 버킷 생성 > 폴더 만들기
배포될 인스턴스와 codedeploy에서 사용할 role을 각각 생성
작업 > 보안 > IAM 역할 수정 > 3번에서 만든 EC2 역할 지정
$ 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
실행 에러가 나면 인스턴스 재부팅
리포지토리 > 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
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
Run workflow 버튼이 활성화 > 클릭 > 인스턴스 내에서 배포 되었는지 확인
잘 읽었습니다. 좋은 정보 감사드립니다.