새소식

기술/Application

Github Actions를 이용한 Docker Image Build 및 Push

  • -

안녕하세요. 오늘은 Github의 Github Actions를 이용하여 Docker Image Build 및 Push 하는 방법에 대해 소개해보고자 합니다.

 

준비물

Github 계정과 Repository

Docker Hub 계정과 Repository

 

 

저는 아래와 같이 Dockerfile을 작성했습니다.

 

FROM node:erbium-buster-slim

LABEL "repository"="https://github.com/teichae/github-action"
LABEL "maintainer"="tei.chae <tei.chae@kakao.com>"

RUN set -eux ; \
    apt-get update -y; \
    apt-get install --no-install-recommends -y \
    tzdata; \
    ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime; \
    mkdir /html; \
    npm install -g http-server

ADD ./index.html /html

WORKDIR /html
EXPOSE 80

CMD ["http-server", "-p80", "./"]

 

NPM 설치된 이미지를 불러와서, 간단하게 http 서버를 띄우고 컨테이너 내의 시간을 KST로 변경한 이미지입니다.

 

그리고 html 폴더 내에 작성한 index.html은 welcome to my github 란 내용이 전부입니다. :)

 

 

이제 Github에 index.html과 Dockerfile을 업로드하겠습니다.

 

 

새로 생성한 Githbub에 위 파일들을 업로드 완료했습니다.

 

이제 Actions 탭으로 들어가서 아래와 같이 진행합니다.

 

①으로 Actions 메뉴로 진입 후 ②의 set up a workflow yourself를 클릭합니다.

 

이유는 스크립트를 커스텀하게 사용하기 위해서입니다.

 

아래와 같이 작성해주세요.

 

name: Github Actions

on:
  push:
    branches:
      - '**'
    tags:
      - '**'

name은 Workflow의 이름입니다.

 

on: 은 동작 조건을 이야기하며, 위에 작성된 내용은 branch나 tags가 push 되면 동작을 하도록 조건식을 잡았습니다.

 

예를 들어 마스터 branch만 사용하고 싶으시면, - master로 사용하시면 됩니다.

 

 

이제 jobs을 지정합니다.

 

아래와 같이 작성해주세요.

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2
      -
        name: Docker meta
        id: docker_meta
        uses: crazy-max/ghaction-docker-meta@v1
        with:
          images: teichae/node
          tag-semver: |
            {{version}}
            {{major}}.{{minor}}
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      -
        name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      -
        name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          platforms: linux/amd64
          push: true
          tags: ${{ steps.docker_meta.outputs.tags }}
          labels: ${{ steps.docker_meta.outputs.labels }}

 

Build라는 Workflow의 단계를 지정합니다.

 

runs-on을 이용하여 빌드에 사용할 최신 버전의 ubuntu 머신을 시작합니다.

 

steps를 이용하여 각 단계 별로 사용할 동작들을 지정합니다.

 

 

구조적으로 다음과 같습니다.

 

1. 빌드 머신 준비

2. 빌드 머신에 Repository Check out

3. Docker Meta를 이용하여 생성할 이미지의 이름과 버전 정보 태깅

4. 빌드 머신에 Docker 빌드에 필요한 사항 준비

5. 이미지를 업로드할 Docker Hub 로그인

6. 이미지 빌드 및 Docker Hub로 배포

 

 

생소하실 수 있는 steps에 대해 간략하게 소개합니다.

 

        name: Docker meta                       #스텝의 이름
        id: docker_meta                         #변수의 일부이며 나중에 output값으로 활용 가능
        uses: crazy-max/ghaction-docker-meta@v1 #사용할 동작
        with:                                   #동작에 대한 input값 사용 선언
          images: teichae/node                  #이미지 이름 지정
          tag-semver: |                         #이미지 이름 뒤에 들어갈 버전 정보
            {{version}}
            {{major}}.{{minor}}

빌드할 때마다 Actions의 내용을 수정하기엔 번거로운 점이 많아서 찾은 동작으로 저는 위와 같이 활용할 예정입니다.

 

 

        name: Login to DockerHub                       #스텝의 이름
        uses: docker/login-action@v1                   #사용할 동작
        with:                                          #동작에 대한 input값 사용 선언
          username: ${{ secrets.DOCKERHUB_USERNAME }}  #Docker Hub의 사용자 ID
          password: ${{ secrets.DOCKERHUB_TOKEN }}     #Docker Hub에서 발급 받은 사용자 Token

Docker Hub에 빌드된 내용은 배포하기 위해 사용한 동작입니다.

 

Docker Hub에서 Token 발행하는 방법은 다음 포스팅에 짧게 설명하도록 하고 아래 링크 남기도록 하겠습니다.

<Docker Hub에서의 Token 발급 방법>

 

        name: Build and push                     #스텝의 이름
        uses: docker/build-push-action@v2        #사용할 동작
        with:                                    #동작에 대한 input값 사용 선언
          context: .                             #context
          file: ./Dockerfile                     #빌드 시 사용할 Dockerfile의 위치 지정
          platforms: linux/amd64                 #이미지 등록 시 Platform 이름 지정
          push: true                             #빌드 후 배포 여부 체크 
          tags: ${{ steps.docker_meta.outputs.tags }}       #빌드 시 위에서 지정한 태그를 사용하도록 지정
          labels: ${{ steps.docker_meta.outputs.labels }}   #빌드 시 위에서 지정한 태그를 사용하도록 지정

Build 및 Push에 대한 내용입니다.

 

 

아래는 완성된 Full Code입니다.

 

name: Github Actions

on:
  push:
    branches:
      - '**'
    tags:
      - '**'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      -
        name: Checkout
        uses: actions/checkout@v2
      -
        name: Docker meta
        id: docker_meta
        uses: crazy-max/ghaction-docker-meta@v1
        with:
          images: teichae/node
          tag-semver: |
            {{version}}
            {{major}}.{{minor}}
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      -
        name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      -
        name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          file: ./Dockerfile
          platforms: linux/amd64
          push: true
          tags: ${{ steps.docker_meta.outputs.tags }}
          labels: ${{ steps.docker_meta.outputs.labels }}

 

해당 내용을 입력 후 Commit을 합니다.

 

Commit 후 Actions가 동작하게 되며, 동작하는 과정을 확인할 수 있습니다.

 

정상적으로 빌드가 완료되었다면 아래와 같은 화면을 볼 수 있습니다.

 

이제 Docker Hub에서도 확인해보겠습니다.

 

 

현재 branch 이름이 main이기 때문에 main이라는 태그로 push 된 것을 확인할 수 있습니다.

 

 

 

이제 tag를 입력하여도 배포되는지 마지막으로 테스트해보겠습니다.

 

tag 쪽으로 이동하여 아래와 같이 릴리즈를 실행합니다.

 

릴리즈 후 Actions가 조건 값에 의해 실행되는 것을 확인할 수 있습니다.

 

배포된 이미지를 확인했을 때 tag에 메이저.마이저 버전을 명시했기 때문에 같이 배포된 것을 확인할 수 있습니다.

 

 

이상으로 Github Actions에 대한 가이드를 마칩니다.

 

감사합니다.

 

해당 글에 사용한 코드는 아래에서 확인하실 수 있습니다.

 

https://github.com/teichae/github-action

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.