本来コレはこうするべき、という部分をすっ飛ばしてとにかく動けばいいというアクションを作る方法です。
on.workflow_dispatchとon.workflow_callon.workflow_callはjobs.*.uses限定- 真の決定論的ビルドの有効化方法
gitおまじない- リモートリポジトリがあればプルして無ければ新しく作る
- 変更があればプッシュしてプルリクエストを作る
- ジョブ間/アクション間のデータのやり取り
on.workflow_dispatch と on.workflow_call
dispatch はウェブの Actions ページから起動するためのモノで、call は再利用可能なアクションとして利用するためのモノ。
inputs の内容はコピペで共用可能。dispatch に inputs があるとウェブページから値の設定が可能になる。
GitHub でリリースを作ったら、、、まで踏み込まないがカスタマイズはしたい、出力先のブランチ名を設定したい等の時に使える。
on.workflow_call は jobs.*.uses 限定
workflow_call は チェックアウト後に jobs.*.uses からのみ利用可能。jobs.*.steps.uses では使えない。
(ジョブの steps から uses するとエラー。ジョブ直下の uses でのみ使える。紛らわしいので注意)
真の決定論的ビルドの有効化方法
C# プロジェクトの設定で決定論的ビルドを有効化していても実際には同一バイナリが出力されない。
同一バイナリを出力するにはビルド時に -p:ContinuousIntegrationBuild=true を設定する必要がある。
dotnet build -c Release --no-restore -p:ContinuousIntegrationBuild=true
設定すると git リポジトリ全体に変更が無ければ同一バイナリが出力される。これは、.cs ファイルに変更が無くても .github/workflows/* に変更があれば出力されるバイナリが変わるということ。
(おそらく .nupkg のコンパイル元の同一性を保証したいとかそういう理由で、ドキュメント含めリポジトリの内容が完全に一致しないと同一バイナリを生成できない)
git おまじない
ボットに作業させる手続き。
git config --global user.name "github-actions[bot]"
git config --global user.email "github-actions[bot]@users.noreply.github.com"
プッシュしたら自動的にリモートリポジトリを追跡するように設定する方法。
git config --global --add --bool push.autoSetupRemote true
リモートリポジトリがあればプルして無ければ新しく作る
ネットを探すとこうすれば出来ます! こういう場合はこうです! 適切にやるには! が見つかるが git checkout 時代や git switch 時代など情報の鮮度がまちまち。とりあえず以下で良い。
git fetch
# リポジトリのスイッチに失敗したら新しく作る(-c)
git switch release/${{ inputs.release_ver }} || git switch -c release/${{ inputs.release_ver }}
# リモートからプル(新しく作った場合は失敗するので || true する)
git pull || true
変更があればプッシュしてプルリクエストを作る
まずは GitHub CLI の有効化を行う。
env:
GH_TOKEN: ${{ github.token }} # for github CLI
続いてコミットしてプッシュして PR を作る。
変更がない場合はコミットが失敗しプッシュも失敗するので || true し、プルリクエストが既に存在する場合も失敗するのでコチラも || true する。
# リポジトリの操作...
# ...
git commit -m "Precompiled Assembly for Unity" || true
git push || true
gh pr create -B main -t 'release/${{ inputs.release_ver }}' -b '' || true
ジョブ間/アクション間のデータのやり取り
GitHub Actions では同一アクション(.yml)内でもジョブが違うとデータの共有が出来ない。なので、
してから
する。または、
を使う。
--
リモートにリポジトリがあるか確認する方法はありますが、とりあえずで良い状況ならエラー時に別コマンドを実行する || で繋げてしまうのも一つの手です。
以上です。お疲れ様でした。