とんちゃんといっしょ

Cloudに関する技術とか日常とかについて書いたり書かなかったり

GitHub Actionsでtagを使ってdocker buildからDocker HubにPushするまで

GitHubにバージョンをつけたTagをPushしたらContainer Imageをビルドして、GitHub側と同じTagをつけたContainer ImageをDocker HubにPushするGitHub Actionsを作ろうとして、今日やったらハマったので書いておく。

そのへんの情報を見てやったらできるだろうと思ったら思ったよりうまくいかなかった。。。

TL;DR

1つ目のリンクのHandle tags and labelsの項読め & 2つ目のリンクDocker Meta使え

github.com

github.com

失敗のながれ

最初にこのサイトのUsageだけをみて真似しようとしたところから始まる

github.com

name: ci

on:
  push:
    branches: master

jobs:
  main:
    runs-on: ubuntu-latest
    steps:
      -
        name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      -
        name: Login to DockerHub
        uses: docker/login-action@v1 
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      -
        name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: user/app:latest
          build-args: |
            arg1=value1
            arg2=value2
      -
        name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}

これを見たときに docker/build-push-action@v2 のtagsにどうやってGitHub側のTagをつけるかというふうに考えた。

失敗1: GitHub Actionsの環境変数をいい感じに利用

GitHub Actionsの変数に ${GITHUB_REF} があるが、そのままでは refs/tags/v1.0.0 のような形になるので、${GITHUB_REF#refs/tags/} として最後のバージョンだけをもってきたかった。

が、そのまま下記のようにすると失敗する

      -
        name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          push: true
          tags: user/app:${GITHUB_REF#refs/tags/}
          build-args: |
            arg1=value1
            arg2=value2
buildx call failed with: invalid tag "***/app:${GITHUB_REF#refs/tags/}": invalid reference format

どうやらこの tags のところではBashの変数としてはできないらしい。

失敗2: set-envを使う

調べてるとこんなのを見つけたので環境変数に入れればいけるのかーと思い試す

stackoverflow.com

しかし、set-envはどうも使えなくなったらしい・・・

The `set-env` command is disabled. Please upgrade to using Environment Files or opt into unsecure command execution by setting the `ACTIONS_ALLOW_UNSECURE_COMMANDS` environment variable to `true`. For more information see: https://github.blog/changelog/2020-10-01-github-actions-deprecating-set-env-and-add-path-commands/

あるいみ失敗3: set-output

build-push-actionのページに行ってみるとやり方書いてるじゃんということでなぜかv1 -> v2のUPGRADEの資料を引っ掛けて対応

github.com

たしかにこれで動いたのだが、実はこの記事を書くのに追加で調べてたら、もっと簡単そうなDocker Metaを見つけたのであった・・・

github.com

そんなわけで、次からはDocker Meta使います。。。