😀

Golang - Github ActionsでDocker ImageをBuild & Push

2024/03/09に公開

内容

Golangで作ったアプリのDockerイメージを作成し、Dockerレジストリにpushする。
Golangアプリ用のDockerfileはこちら

Github Actionsのyaml構文のドキュメント

目次

  • ワークフローファイル
  • 内容の捕捉

ワークフローファイル

ci.yaml
name: CI
on:
  push:
    tags:
      - "v*.*.*"

jobs:
  test:
    runs-on: ubuntu-18.04
    strategy:
      matrix:
        go: ["1.15"]
    steps:
      - name: Check out source code
        uses: actions/checkout@v1
        
      - name: Set up Go v${{matrix.go}}
        uses: actions/setup-go@v2
        with:
          go-version: ${{matrix.go}}

      - name: Install dependent packages
        run: go mod download

      - name: Run all test
        run: go test -v ./...

  docker-build:
    needs: ["test"]
    runs-on: ubuntu-18.04
    env:
      DOCKER_IMAGE_NAME: docker-app
    steps:
      - name: Check out source code
        uses: actions/checkout@v1

      - name: Build and push docker image
        run: |
          TAG=$(echo $GITHUB_REF | grep -o "[0-9][\.].*")
          DOCKER_IMAGE=${{ secrets.DOCKER_REGISTRY }}/${DOCKER_IMAGE_NAME}:$TAG
          echo "Docker image: ${DOCKER_IMAGE}"
          docker login --username ${{ secrets.DOCKER_USERNAME }} --password ${{ secrets.DOCKER_PASSWORD }}
          docker build -t $DOCKER_IMAGE .
          docker push $DOCKER_IMAGE

内容の捕捉

ワークフローのトリガー - on.push.tags

Github Actionsのトリガーはonの後に書くことでトリガーとして登録されます

今回は、タグ v1.0.0 のような形式のタグがpushされた時にCIパイプラインが実行されるようにしています。

push以外にもPRのオープンなどの多くのGithub Actionsのトリガーがあります。

テスト - jobs.test

jobsという単位でジョブを作成していきます。
ここではテストのジョブを実行しています。

  1. ソースコードのチェックアウト
  2. Golangのバージョンを指定 (今回は1.15を指定)
  3. go modulesに従って依存パッケージをインストール (go mod download)
  4. ワーキングディレクトリ内のすべてのテストを実行 (go test -v ./...)

イメージのビルドとプッシュ - jobs.docker-build

jobsという単位でジョブを作成していきます。
ここではビルドとプッシュのジョブを実行しています。

認証情報はsecretを使っています。
secretに関しては、下のドキュメントが参考になります。
https://docs.github.com/ja/free-pro-team@latest/actions/reference/encrypted-secrets

  1. イメージtagをgit refから作成している (例 v1.0.0 -> 1.0.0)
  2. Dockerイメージ名を作成 (レジストリ名はsecret,イメージ名はenv,タグ名は1で作成したもの)
  3. dockerにログイン (usernameとpasswordはsecret)
  4. docker build (Dockerイメージ名は2で作成したもの)
  5. docker push

Discussion