이제는 github action을 작성할 차례이다.
github action에서는 다음과 같은 동작을 작성할 것이다.
Nextjs App 빌드하기
Nextjs App 파일들을 압축해서 S3에 저장하기
- node_modules는 제외S3에 파일이 올라가면 CodeDeploy 트리거하기
- 동작을 정의한 것이 아님.Github action은 프로젝트 root폴더에 .github/workflows
폴더 안에서 작성해준다. 이때 파일 확장자는 yml이다.
어떤 동작을 하는지는 주석으로 작성했으니 vscode에 복붙해서 확인해보자.
name: deploy to S3
on:
push:
branches:
- main
env:
S3_BUCKET_NAME: chagok-bucket
CODE_DEPLOY_APPLICATION_NAME: chagok-code-deploy
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: chagok
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x]
steps:
- name: Checkout
uses: actions/checkout@v3
- uses: actions/setup-node@v3
with:
node-version: ${{ matrix.node-version }}
cache: "npm"
- name: Install dependencies
run: npm ci
# 프로젝트 빌드
- name: Build next app
run: npm run build
# 프로젝트 압축
- name: Make zip file
run: zip -qq -r ./chagok.zip . -x "node_modules/*"
# -qq: quit 모드로 실행 (에러나 경고메세지만 출력하도록 함)
# -r: 지정된 디렉토리를 재귀적으로 압축 (하위 디렉토리와 파일들 모두 압축)
# -x "node_modules/*": node_modules 폴더 제외
# Github Action에서 AWS의 권한 자격을 얻어오는 단계
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
# 압축된 파일을 S3에 업로드
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./chagok.zip s3://$S3_BUCKET_NAME/chagok.zip
# S3에 업로드 된 빌드 파일을 이용해 CodeDeploy가 정의된 동작을 하도록 트리거
- name: Code Deploy
run: |
aws deploy create-deployment \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
--s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=chagok.zip
이렇게 하면 github action은 작성이 완료되었다.
레포지토리의 action탭에서 결과를 확인해보자 초록색 바탕의 체크 표시가 있다면 성공적으로 작동한 것이다. S3에서도 압축된 파일이 올라간 것을 확인 할 수 있다.
하지만 위에서 말했듯이 github action은 S3에 업로드하고 CodeDeploy를 트리거
하는 역할이지 CodeDeploy의 동작을 정의
하진 않았다. 다음 글에서 CodeDeploy의 동작을 정의할 것이다.
혹시 깃헙 액션에서 프로젝트 빌드는 왜 하는 걸까요?
어차피, S3 에 코드들이랑 package.json 압축해놨다가
ec2 에서 NPM INSTALL 할거면 빌드하는 의미가 없는 것 같은데...