🐳

Go製ツールをGitHub Container Registryに載せてGitHub Actionとして公開する

4 min read

概要

Goで作ったツールをGitHub Actionsで利用したいとき、DockerコンテナActionとして公開、利用するまでの流れを整理しました。

ちなみに、GitHub ActionsのActionを自作したい、という動機づけなら、わざわざGoで書いてDockerコンテナ化するより、JavaScriptで直接Actionを作ったほうが早いし楽です。
既存のGo製自作ツールをActionで使うなら、という前提ですのであしからず。

流れ

基本的な流れは次のとおりです。

  • Go製ツールをDocker化する
  • DockerをGitHub Container Registryに載せる
  • コンテナを公開する
  • Action化する

Go製ツールをDocker化する

https://zenn.dev/kyoh86/articles/0561dd14d9dc1e572427
に解説済ですので詳細は割愛します。
FROM golang:alpine AS build-stage
ADD . /work
WORKDIR /work
RUN go build -o entrypoint .

FROM alpine:latest
COPY --from=build-stage /work/entrypoint /usr/local/bin/entrypoint
ENTRYPOINT ["/usr/local/bin/entrypoint"]

こんなDockerを置けば、docker build -t hoge docker run hogeとして呼び出せるDockerイメージが作れます。

DockerをGitHub Container Registryに載せる

Docker Hubに載せても良いのですが、Docker Hubは流量の制限がかかるようになってしまったので、どうせなら最近公開されたGitHub Container RegistryにGitHub Actions経由で載せましょう。

次のようなActionを書けばよいです。

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      - name: Login to GitHub Container Registry
        uses: docker/login-action@v1
        with:
          registry: ghcr.io
          username: ${{ github.repository_owner }}
          password: ${{ secrets.CR_PAT }}
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          push: true
          tags: |
            ghcr.io/${{ github.repository }}:latest
            ghcr.io/${{ github.repository }}:${{ steps.get_tag.outputs.TAG }}

Docker Buildのための準備(Set up Docker Buildx)と、GitHub Container Registryへのログイン(Login to GitHub Docker Container Registry)をし、Build&Pushしているだけです。[1]

現在はGitHub Container Registryへのログインには特別なPrivate Access Tokenが必要なので、 https://github.com/settings/tokens でTokenを用意して、このリポジトリのSecretsに「CR_PAT」という名前で登録しています。

権限は

  • write:packages Upload packages to github package registry
  • read:packages Download packages from github package registry
  • delete:packages Delete packages from github package registry
    の3つが必要でした。

最後のdelete:packagesは要らないはずだと思うんですが、何故かPush時に権限不足でコケた(11月8日時点)ので、今はつけています。

コンテナを公開する

(このステップは場合に依っては要らないかもしれません)

次に、Action側から利用するために、このコンテナを公開します。
ただ、GitHub Container Registryが未だPublic Betaなせいもあって、この方法がちょっと安定していません。
マニュアル「コンテナイメージのアクセス制御と可視性を設定する - GitHub Docs」も画像が欠落していたり、間違っていたりとまだまだ怪しいです。
メニューのどこをクリックして、というような導線がよく変わります。
なので今は下のようにURL直接指定で行くのが手っ取り早いです。

https://github.com/users/<OWNER>/packages/container/package/<REPO-NAME>/settings

ここでMake Publicとすれば、公開できます。

Action化する

これでContainer自体はできたのですが、Actionに載せるにはもうひと手間あります。
Actionとして公開する場合は、それようのRepositoryを切ったほうが良さそうです。
必要なものはそう多くありません。

詳細は公式マニュアルを見ればいいですね。
Docker コンテナのアクションを作成する - GitHub Docs

そしてこのDockerfileで先に公開したGitHub Container Registryのイメージを参照すればよいのです。

FROM ghcr.io/<OWNER>/<REPO-NAME>:v*.*.*
ADD ./entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]

最後に

この形で拙作 git-vertag をAction化しています。
git-vertag-action
一例にどうぞ。

脚注
  1. ちなみに、GitHub Container Registryは普通のRepositoryとは切り離されているようなので、おそらく${{ github.repository }}とせず、適当な名前をつけても良いはず ↩︎