おそらくはそれさえも平凡な日々

タグが打たれたら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の最小構成でのわかりやすさも考えて省きました。

ということで非常にお手軽で簡単だったので、今後も活用していきたい。パブリックイメージであれば特に制限もないようなので嬉しい。

created at
last modified at
comments powered by Disqus