CI/CD를 해보자 (2) - Github Actions를 통한 도커 이미지 push

1 minute read


Github Actions를 통해 새로 추가될 코드의 테스트를 성공적으로 마쳤다. 이제 해당 어플리케이션을 도커 이미지로 빌드하고 이미지 저장소에 올리는 작업을 해야한다. 도커 허브(Docker Hub)를 사용하거나 클라우드 서비스에서 제공하는 이미지 저장소를 사용할 경우, Github Actions를 통해 workflow 내에서 도커 이미지를 빌드하고 이미지를 저장소에 push할 수 있다.

Dockerfile 작성

우리의 어플리케이션은 node로 만들어졌기 때문에 node를 베이스로 하는 Dockerfile을 작성해준다.

Dockerfile

FROM node:14

WORKDIR /usr/src/app

COPY . .

CMD ["node", "main.js"]

Workflow 업데이트

Dockerfile을 작성했으니 workflow를 업데이트해주어야한다. Github Actions에서 공개된 action들 중 도커를 빌드하고 push할 수 있는 공식 action들이 있다.

Docker Buildx

첫번째로 docker/setup-buildx-action을 이용해서 도커 빌드 툴인 docker buildx를 세팅해준다. buildx에 대한 자세한 정보는 여기에서 확인이 가능하다.

node.js.yml

- name: Set up Docker Buildx
  uses: docker/setup-buildx-action@v1

Docker Login

두번째로는 docker/login-action 을 이용해서 자신의 이미지 저장소 환경에 맞게 로그인 action을 설정해준다. 이때 workflow 진행 시에 사용할 비밀 정보가 필요하다. 이 비밀 항목은 저장소 로그인 비밀번호라던지 테스트 코드에 필요한 토큰 같은것이 있을텐데 이것들을 깃헙 저장소에 등록해 놓을 수 있다. 저장소의 Settings > Secrets 에 key/value 형태로 저장할 수 있다. 저장된 비밀정보는 workflow 내에서 $ 처럼 사용할 수 있다.

다음과 같이 비밀정보를 저장해 준다.

github-secrets

- name: Login to Docker Hub
  uses: docker/login-action@v1
  with:
    username: $
    password: $

도커 허브가 아닌 AWS의 도커 이미지 저장소를 사용한다면 with에 registry라는 키를 추가하고 저장소를 지정하는 식으로 해당 저장소에 로그인할 수 있다.

Docker Build & Push

마지막으로 docker/build-push-action을 사용해서 이미지를 빌드하고 저장소에 push 해준다.

- name: Build and push
  uses: docker/build-push-action@v2
  with:
    push: true
    tags: seungtaek/github-actions:latest


Workflow 확인

최종적인 node.js.yml 파일은 다음과 같다.

name: Node.js CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      # Setup
      - uses: actions/checkout@v2

      - uses: actions/setup-node@v1
        with:
          node-version: 14

      # Run test
      - name: Install packages
        run: npm ci

      - name: Run test
        run: npm test

      # Docker build & push
      - name: Setup Docker Buildx
        uses: docker/setup-buildx-action@v1

      - name: Login to Docker Hub
        uses: docker/login-action@v1
        with:
          username: $
          password: $

      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: seungtaek/github-actions:latest

이제 변경사항을 커밋하고 깃헙 저장소에 push를 하면 actions가 실행될 것이다. 결과를 확인해보자.

모든 step이 통과된 것을 확인할 수 있다.

actions-result

Docker Hub에도 이미지가 push된 것을 확인할 수 있다.

push-result

Categories:

Updated: