前提
- Runner Version: 2.304.0
まとめ
- Docker container actionを実行する際は毎回BuildステップでDockerイメージをビルドし、そのイメージを実行している
- ビルドされるイメージ名・タグに意味はほとんどない
- どの時点のソースが実行されているか確認したい場合はSet up jobステップの「Download action repository」に表示されるコミットハッシュを見るのが確実
経緯
私はGitHub Actionsでgha-usageという自作のDocker container actionを公開し自分のリポジトリで使っているのですが、そのアクションは慣習(?)に則りタグを打つ毎にv1というタグの内容を差し替え、使う側でバージョン指定を書き換えなくても1.x系のの最新バージョンを使えるようにしています。
(タグの差し替えはaction-update-semverを使用)
そしてgha-usageのバグを修正したにも関わらず実行ログを見ると修正が当たっていないように見え、もしかしてタグの差し替え失敗しているのでは?と思いタグが何を表しているのか調べてみました。
詳細
GitHub Actionsのランナーはソースが公開されています。
そして、GitHub Actionsの実行時に出力されるログで全文検索を掛けてみるとDocker container action実行時は
src/Runner.Worker/ActionManager.cs#L572
が実行されているようです。
まず、584行目の
var imageName = $"{dockerManager.DockerInstanceLabel}:{Guid.NewGuid().ToString("N")}";
からDockerイメージのタグにはGUIDが使われていることが分かります。
そしてイメージ名に使われているdockerManager.DockerInstanceLabel
は
src/Runner.Worker/Container/DockerCommandManager.cs#L49
で値が初期化され、他に代入している箇所はありませんでした。
DockerInstanceLabel = IOUtil.GetSha256Hash(hostContext.GetDirectory(WellKnownDirectory.Root)).Substring(0, 6);
どうやら何かのディレクトリからSHA-256のハッシュを生成していそうです。
と辿り、Runnerの実行ファイルが設置されているディレクトリの親ディレクトリ絶対パスからハッシュを生成していることが分かります。
という訳で、Docker container actionのイメージをビルドする際のイメージ名・タグはどちらも該当アクションに関係無い値が使われていました。
と、ここまでソースを読んだ後に実行ログをよく見たら「Set up job」ステップの方にGitのコミットハッシュが記載されている事に気づきました・・・
(そして修正が当たっていないように見えたのは単に修正前に実行されていたからだった・・・)
ログはちゃんと見ようね・・・!
参考
- https://learn.microsoft.com/ja-jp/dotnet/api/system.guid.tostring?view=net-8.0#system-guid-tostring(system-string)
- https://learn.microsoft.com/ja-jp/dotnet/api/system.reflection.assembly.getentryassembly?view=net-7.0
- https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/016exepath/exepath.html
- https://learn.microsoft.com/ja-jp/dotnet/api/system.io.directoryinfo.parent?view=net-7.0