Go製ツールをGitHub Container Registryに載せてGitHub Actionとして公開する
概要
Goで作ったツールをGitHub Actionsで利用したいとき、DockerコンテナActionとして公開、利用するまでの流れを整理しました。
ちなみに、GitHub ActionsのActionを自作したい、という動機づけなら、わざわざGoで書いてDockerコンテナ化するより、JavaScriptで直接Actionを作ったほうが早いし楽です。
既存のGo製自作ツールをActionで使うなら、という前提ですのであしからず。
流れ
基本的な流れは次のとおりです。
- Go製ツールをDocker化する
- DockerをGitHub Container Registryに載せる
- コンテナを公開する
- Action化する
Go製ツールをDocker化する
に解説済ですので詳細は割愛します。
FROM golang:alpine AS build-stage
ADD . /work
WORKDIR /work
RUN go build -o entrypoint .
FROM alpine:latest
COPY /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
一例にどうぞ。
-
ちなみに、GitHub Container Registryは普通のRepositoryとは切り離されているようなので、おそらく
${{ github.repository }}
とせず、適当な名前をつけても良いはず ↩︎
Discussion