본문 바로가기
Git

[AWS EC2, Github Action, Docker, Node] CICD 구축하기(마지막) workflow 작성하기

by 상똥 2024. 8. 7.

 

차근차근 따라하면 할 수 있습니다 화이팅


● 단계 링크

CICD 구축하기(1) -  Dockerfile 만들기

CICD 구축하기(2) - EC2 인스턴스 생성하기, 세팅하기

CICD 구축하기(3) - github repository 세팅

 CICD 구축하기(4) - workflow 작성하기


목표

- workflow 이해하고 작성하기

- 배포 확인하기

 

목차

1. workflow를 위한 yml 파일 만들기

2. workflow 작성하기

- test 부분 작성하기

- docker 부분 작성하기

- deploy 부분 작성하기


[1. workflow를 위한 yml 파일 만들기]

1. yml 파일 만들기

- 리포지토리 → Actions에 들어간다

- 리포지토리에 따라 적절한 환경을 추천해주기도 하고 필요한 환경을 검색해서 갖다 쓸 수도 있다

- 하지만 set up a workflow yourself를 클릭해 직접 작성해보도록 한다

 

- 클릭하면 아래와 같은 화면으로 이동하게 된다

- 좌측은 workflow 작성창

- 우측은 marketplace로, 작성에 도움을 받을 수 있다

 

 

2. workflow 이해하기

- 기본 틀을 먼저 작성한 후, 간단히 설명해보겠다

name: my first cicd

# workflow를 재실행하는 트리거
on:
  push:
    branches:
      - main
      
# 재실행되면 수행할 작업들
jobs:

# 작업1: 테스트코드 검사
  test:
    runs-on: ubuntu-latest
    steps:

# 작업2: 빌드
  build:
    needs: test
    steps:

# 작업3: 배포
  deploy:
    needs: build
    runs-on: [self-hosted]
    steps:

 

1) workflow를 재실행하는 트리거

- [main]브랜치에 [push]가 발생하면 재실행된다

- 브랜치는 배포에 사용되는 브랜치를 기재하면 된다. 필자는 주로 main 브랜치를 배포에 사용하므로 main을 기재했다

 

2) 재실행되면 수행할 작업들

- jobs: 를 쓴 후 내용들을 들여쓰기로 작성한다

 

3) 작업1: 테스트코드 검사

- 테스트코드가 있을 경우 지속적인 통합을 위해 작성한다

- 테스트코드가 없다면 생략해도 된다. 생략 시 runs-on: ubuntu-latest는 다음단계에 작성한다

- 리눅스로 인스턴스를 생성했더라도 ubuntu-latest라고 작성해도 된다

 

4) 작업2: 빌드

- 이 단계에서 도커를 빌드할 것이다

- needs의 의미는 test 단계를 꼭 통과해야 수행된다는 의미이다.

 

5) deploy

- 이 단계에서 EC2에 배포할 것이다

- 리포지토리와 인스턴스를 runners에서 연결했으므로 runs-on에는 [self-hosted]를 쓰면 된다

 


[2. workflow 작성하기]

1. test 부분 작성하기

  test:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4.1.7
        
      - name: Setup Node.js environment
        uses: actions/setup-node@v4.0.3
        with:
          node-version: '20'

      - name: Install dependencies
        run: npm install
        
      - name: Run test
        run: npm test

1) 환경 세팅

- 첫 번째 단계이므로 test 단계지만 구동 환경 설정, 코드체킹, 노드 환경 설정이 필요하다 (테스트 생략할거면 다음 job에서 해주면 됨)

- runs-on: EC2 환경을 마련한다. linux든 ubuntu든 ubuntu-latest 사용하면 된다

- Checkout: 코드체킹

- Setup Node.js environment: 노드 환경 세팅하기

- Install dependencies: 필요한 라이브러리 설치

2) 테스트

- run: 수행할 명령어를 작성한다. 테스트를 수행해야 하므로 노드 테스트 실행 명령어인 npm test를 작성한다

 

2. docker 부분 작성하기

  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: Docker Setup Buildx
        id: buildx
        uses: docker/setup-buildx-action@v3.6.1
        with:
          path: /temp/.build-cache
          key: ${{runner.os}}-buildx-${{github.sha}}
          restore-keys: |
            ${{runner.os}}-buildx-
            
      - name: Login to Github container registry
        uses: docker/login-action@v3.3.0
        with:
          registry: ghcr.io
          username: ${{github.actor}}
          password: ${{secrets.GHCR_TOKEN}}
          
      - name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: ghcr.io/sangddong/my-image:latest

1) Docker Setup Buildx: 이미지 빌드를 위한 단계

- id를 작성해 다음 단계에서 참조할 수 있도록 한다

- path를 만들어 Buildx 캐시가 저장될 곳을 만들어준다

- key: Buildx 캐시의 고유 키를 설정해준다. os와 커밋 sha를 포함시켜 구별시켜준다

- restore-keys: 캐시를 복원할 때 사용할 기본 키

 

2) Login to Github container registry: GitHub Container Registry (ghcr.io)에 로그인하기 위한 단계

- registry: 로그인할 레지스트리의 URL, GitHub Container Registry를 사용

- username: GitHub 사용자 이름을 설정, ${{ github.actor }}는 GitHub 사용자 이름

- password: 인증에 사용되는 비밀번호로, GitHub Secrets에서 가져오는 GHCR_TOKEN을 사용

- 이때 로그인에 계속 실패한다면, GHCR_TOKEN에 문제가 있을 가능성이 크다. 토큰은 GitHub Personal Access Token(PAT)으로 생성되어야 하며, 필요한 권한(예: read:packages, write:packages, delete:packages)을 포함해야 한다.

 

3) Build and push: Docker 이미지를 빌드하고 GitHub Container Registry에 푸시하는 단계

- id를 작성해 다음 단계에서 참조할 수 있도록 한다

- push: true: 빌드한 이미지를 레지스트리에 푸시

- tags: Docker 이미지에 태그를 지정합니다. ghcr.io/sangddong/my-image:latest는 GitHub Container Registry에 푸시될 이미지의 태그 (* ghcr.io를 사용하는 경우, tags 설정을 ghcr.io/${{ github.repository_owner }}/temp-image-name:latest와 같은 형식으로 지정해야 함)

 

3. deploy 부분 작성하기

- 혹시나 이 부분이 시작되지 않고 계속 대기상태라면, 인스턴스의  actions-runner를 작동시켰는지 확인해야 한다. 아래 명령어를 통해 작동시킬 수 있다

  deploy:
    needs: build
    name: Deploy
    runs-on: [self-hosted, sangddong]
    steps:
      - name: Login to Github container registry
        uses: docker/login-action@v3.3.0
        with: 
          registry: ghcr.io
          username: ${{github.actor}}
          password: ${{secrets.GHCR_TOKEN}}

      - name: Verify Docker Login
        run: |
          echo ${{secrets.GHCR_TOKEN}} | sudo docker login ghcr.io -u ${{github.actor}} --password-stdin
          
      - name: Docker run
        run: |
          sudo docker stop temp-container-name || true
          sudo docker rm temp-container-name || true
          sudo docker rmi ghcr.io/sangddong/my-image:latest || true
          sudo docker run -d -p 80:3001 \
          --name temp-container-name \
          --restart always \
          -e PORT=${{ secrets.PORT }} \
          -e DATABASE_URL=${{ secrets.DATABASE_URL }} \
          ghcr.io/sangddong/my-image:latest

1) Login to Github container registry

- 깃허브 사용자 이름과 GHCR_TOKEN으로 로그인한다

 

2) Verify Docker Login

- 사실 이 단계는 Login to Github container registry 단계에서 로그인이 자꾸 실패하면 추가해주는 단계이다. 생략해도 된다

- 앞선 단계에서 로그인이 실패하는 경우, 그 원인은 Docker 데몬에게 있을 가능성이 크다. Docker 데몬이 이전에 캐시된 로그인 정보를 사용하기 때문에, 로그인 상태가 제대로 반영되지 않을 수 있으므로 직접 로그인 명령어를 실행하여 명시적으로 인증 정보를 설정하면 이런 문제가 해결될 수 있다

 

3) Docker run

- 컨테이너를 생성해 작동시키는 단계이다

- 컨테이너를 생성하기 전, 컨테이너가 이미 존재하는 경우 제거하는 과정을 거친다

 


이로써 깃허브 cicd 구축이 완료되었다!!!!!!!!!!

고생하셨습니다 ^-^