GitHub Action で自動更新される Dockerfile をつくる

定期的に更新を見て自動的にイメージをアップデート


Posted on Tue, Mar 24, 2020
Tags docker, githubaction, ci

Dockerfile の中のパッケージのバージョン更新面倒くさて古くなる問題

Alice: はぁ…今日も Dockerfile の更新しなきゃ。他にもやらないといけないことあるのに…

Bob: そんなあなたに朗報です。GitHub Action と awk を使えば Dockerfile の中のパッケージバージョンを自動更新!

Alice: でもお高いんでしょう…?

Bob: それが、奥さん、GitHub Action なら 2000 minutes/month まで無料!

Alice: えぇ..!? (困惑)

Bob: さらにさらに、on schedule を使えば、毎朝、毎時でも自動更新チェックしてくれます!

Alice: うそぉー、今すぐ電話しなきゃ。Bob 電話番号を教えて!

Bob: ( ´・ω・)⊃旦 go-zen-chu/docker-plantuml

ということで、そんなレポジトリを作ってみた

原理:

  1. on schedule で毎朝 Dockerfile の中で 利用しているライブラリの更新がないかチェック
  2. 更新があった場合は、awk で Dockerfile の中のバージョン文字列 を更新して master へ push
  3. master にマージされたとき、[skip ci] が含まれていなければ、イメージビルドして、dockerhub へ push

master マージ時に、latest と コミットハッシュ の tag それぞれで push するのがポイント。

たったこれだけで自動更新してくれるなんてありがたや 🙏

GITHUB_TOKEN で push しても他の workflow は trigger されない

実装中に問題となったのが、GITHUB_TOKEN が設定された workflow から git push を行っても、on.push を設定している他の workflow は起動しない。

GITHUB_TOKENでの認証 - GitHub Docs によると、

リポジトリのGITHUB_TOKENを使ってGitHub Actions アプリケーションの代わりにタスクを実行した場合、そのGITHUB_TOKENによって生じたイベントは、新たなワークフローの実行を生じさせません。
これによって、予想外の再帰的なワークフローの実行が生じないようになります。 たとえば、ワークフローの実行によってリポジトリのGITHUB_TOKENを使ったコードのプッシュが行われた場合、そのリポジトリにpushイベントが生じた際に実行されるよう設定されたワークフローが含まれていても、新しいワークフローの実行は行われません。

そこで、Personal Access Token (PAT) を利用して push することにより、他の workflow を trigger させることができます。

Push from Action does not trigger subsequent action - GitHub Actions - GitHub Support Community

secrets.PAT を指定しても workflow が trigger されない

実はさらに actions/checkout の v2 を利用していると、GITHUB_TOKEN が自動的に設定されて、その workflow に残ってしまいます。

この設定のように することで、別の workflow を起動するようにできます。

- uses: actions/checkout@v2
    with:
      persist-credentials: false