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」
ということで、そんなリポジトリを作ってみた
原理:
- on schedule で毎朝 Dockerfile の中で 利用しているライブラリの更新がないかチェック
- 更新があった場合は、awk で Dockerfile の中のバージョン文字列 を更新して master へ push
- master にマージされたとき、
[skip ci]
がコミットメッセージに含まれていなければ、イメージビルドして、dockerhub へ push- 注:最近の GitHub Actions では
[skip ci]
などの文字がコミットメッセージに含まれていれば job 実行は skip されるようになった
- 注:最近の GitHub Actions では
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