“기초적인 CICD를 구축해보자.”
환경설정부터 하면 재미가 없다. 그러니 흐름 파악부터 하고 코드부터 봐보자.
전체 흐름
- Github Action에서 우리가 정해놓은 브렌치의 코드 변경을 감지한다.
- 변경된 코드를 가지고 CI를 한다. - 의존성 설치, 빌드, 테스트 등.
- 2번 작업이 완료 됐다면 AWS S3에 빌드 파일을 압축하여 업로드한다.
- CodeDeploy를 실행한다.
- CodeDeploy를 이용하여 AWS S3에 저장되어있는 빌드 파일을 가져온다.
- 가져온 파일을 실행시키기 위해 필요한 작업들을 한다.
- ex. 빌드 파일이 있는 곳으로 이동, pm2 명령어 실행 등.
아주 간단한 node서버는 이정도로 기초적인 CICD가 완료된다.
코드를 보자.
Github Action 코드 [주석을 주의깊게 !]
# /.github/workflows/github-actions-practice.yml
name: Node.js CI
on: # "어떤 상황에 Github Action이 실행될 것이냐."
push: #push할때 실행한다.
branches: [main] #main 브렌치에 push할 때.
pull_request: #pull_request 할때 실행한다.
branches: [main] #main 브렌치에 pull_request 할 때.
jobs: # 실행할 것들을 jobs안에 순서대로 적는다.
build: # build를 한다.
runs-on: ubuntu-latest # 최신버전 우분투에서.
strategy: # job은 여러개 생길수 있는데 개별 job들의 환경설정이라고 보면 된다.
matrix:
node-version: [10.x]
# uses / run 둘다 뭔가를 실행한다고 보면 된다. 다만 uses는 이미 모듈화되어있는 것을 가져와쓰는 거고,
# runs는 명령어를 실행하는 것이다.
steps:
- uses: actions/checkout@v2 # 소스 코드를 가져온다.
- name: Use Node.js $
uses: actions/setup-node@v1 # 노드로 환경을 셋팅한다.
with:
node-version: $
- run: npm ci # npm install 과 같지만 다르다. 나중에 더 깊히 찾아보자.
- run: npm run build --if-present # 소스 코드를 빌드한다.
- run: npm test # 테스트를 진행한다.
# 여기까지 진행된거면 아주 기초적인 CI 는 된것이다.
# CI가 완료된 빌드 파일을 CodeDeploy가 이용할수 있는 장소로 보내자. AWS S3로.
# 먼저 AWS 계정 세팅부터해야 AWS S3를 쓸수 있으니 셋팅부터.
- name: AWS Setting
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: $ # secrets는 github 레포에서 설정할 수 있다.
aws-secret-access-key: $
aws-region: ap-northeast-2
# AWS S3 버킷에 업로드한다
- name: Upload to S3 Bucket
run: aws deploy push --application-name jojoldu-deploy-app --description "CICD practice" --s3-location s3://<버켓 이름 ex. bucketForCICD>/<위치 ex. server/build.zip> --source .
- name: Code Deploy
run: aws deploy create-deployment --application-name <앱 이름> --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name <그룹 네임> --s3-location bucket=<버켓 이름>,bundleType=<저장 형태 ex. zip>,key=<S3에 저장될 위치와 이름 ex. server/build.zip>
CodeDeploy 코드
1. appspec.yml 파일을 보자
# /appspec.yml
version: 0.0
os: linux
files:
- source: / # 가져오는 파일들중에 선택할 때 쓴다. "/"는 모두 가져오는 것을 의미함.
destination: /home/ubuntu/build/ # 받아온 파일들을 EC2 instance에 저장하는 곳을 설정한다.
hooks:
AfterInstall: # 파일을 받아온 후에 할일을 명시해 놓은 파일에 대한 셋팅이다.
- location: scripts/afterInstall.sh # 이 파일을 가져와서 실행할 것이고.
timeout: 60 # 60초 이내에 모두 실행못하면 실패.
runas: root
2. afterInstall.sh
# `/scripts/afterInstall.sh`
echo "현재 위치"
echo $PWD
cd /home/ubuntu/build # 빌드 파일이 저장된 곳으로 이동.
pm2 restart dist/main.js # 업데이트되었으니 pm2 다시 실행.
echo "pm2 재시작 완료"