CICD GithubAction, CodeDeploy [ Node 백엔드 제작시 마주칠 것들 ]

“기초적인 CICD를 구축해보자.”

환경설정부터 하면 재미가 없다. 그러니 흐름 파악부터 하고 코드부터 봐보자.

전체 흐름

  1. Github Action에서 우리가 정해놓은 브렌치의 코드 변경을 감지한다.
  2. 변경된 코드를 가지고 CI를 한다. - 의존성 설치, 빌드, 테스트 등.
  3. 2번 작업이 완료 됐다면 AWS S3에 빌드 파일을 압축하여 업로드한다.
  4. CodeDeploy를 실행한다.
  5. CodeDeploy를 이용하여 AWS S3에 저장되어있는 빌드 파일을 가져온다.
  6. 가져온 파일을 실행시키기 위해 필요한 작업들을 한다.
  • 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 재시작 완료"



References