タグが打たれたらGitHub Container Registryにイメージをpushする
リリース作業をしてタグが打たれたのを契機にGitHub Actionsを起動してGitHub Container Registryにイメージをpushしたい。試行錯誤した結果以下のようになった。
on:
push:
branches-ignore:
- '**'
tags:
- 'v*'
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: docker/metadata-action@v3
id: meta
with:
images: ghcr.io/songmu/riji
tags: |
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
- uses: docker/login-action@v1
with:
registry: ghcr.io
username: songmu
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@v2
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
repository rootにDockefileがある前提です。"songmu"や"riji"の部分は適宜書き換えてください。注意点としては、imagesやログインのユーザー名は小文字オンリーである必要があること。つまりSongmu → songmuの変換が必要だった。
ghcr.ioへのログインにGITHUB_TOKEN
をそのまま使えるためDocker Hub等を使う場合と違ってsecret設定が不要なのが強い。こういうYAMLのひな形をrepo作成時にpushすれば設定を弄らずとも直ちに使える。
ちょっと複雑なのは、docker/build-push-action単体だと動的なタグ生成が難しいので、docker/metadata-actionというやつを併用する必要があるところ。
上のような指定をすることで、例えば、v1.2.3
というタグが打たれたときに、ビルドされたimageが :1.2.3
と :1.2
と :latest
というタグでpushされる。latestはデフォルトで勝手につけてくれる。flavorというattribute設定でこの辺は細かく制御できる。
詳しくは docker/metadata-actionのrepository参照のこと。
docker/build-push-actionを見ると、users: docker/setup-buildx-action@v1
も書いてbuildxを使うのが推奨ぽいので、特にマルチプラットフォームで動作するコンテナイメージを作りたい方などは指定したほうが良いでしょう。この記事ではYAMLの最小構成でのわかりやすさも考えて省きました。
ということで非常にお手軽で簡単だったので、今後も活用していきたい。パブリックイメージであれば特に制限もないようなので嬉しい。