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

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


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

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

下記は茶番劇です。

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

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

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

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

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

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

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

( ´・ω・)⊃旦 「これが参考に作ったリポジトリじゃ go-zen-chu/docker-plantuml

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

原理:

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

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

Share with


See Also