Railroadsプラグインでは、複数のGitHub Actionsを利用しています。
GitHub Actionsは、ベースとなったJetBrainsのIntelliJ Platform Plugin Templateと同様に、バージョンで固定していました。
そんな中、最近の
- 本当ならバージョンではなく、コミットハッシュで固定したほうが良いこと
- IntelliJ Platform Plugin Templateとの差分はAIに検知してもらえそうなので、以前に比べるとコミットハッシュでの固定も容易であること
という状況より、GitHub Actionsはコミットハッシュで固定したくなりました。
ただ、バージョンからコミットハッシュへの変換を手動でやるのはさすがに手間です。ツールを探してみたところ、 pinact がありました。
https://github.com/suzuki-shunsuke/pinact
そこで、Railroadsで利用しているGitHub Actionsに対し、pinactでコミットハッシュ固定してみたことから、メモを残します。
目次
環境
- pinact 3.10.1
- mise 2026.5.10 macos-arm64 (2026-05-16)
- pinact action 2.0.0
pinactの使用
まずは pinact を使って、コミットハッシュで固定してみます。
pinactをインストール
pinact のドキュメントを読むといくつか方法があります。
https://github.com/suzuki-shunsuke/pinact/blob/main/INSTALL.md
Homebrewでのインストールがお手軽ですが、 aqua でもインストールできます。インストールするバージョンの固定やチェックサムの検証ができるのは良さそうです。
https://github.com/aquaproj/aqua
また、 mise でもインストールできます。miseの場合、aquaバックエンドでのインストールになるようです。ふだんmiseを使っていることもあり、自分の用途だとmiseでのインストールで十分そうです。
https://mise.jdx.dev/dev-tools/backends/aqua.html
そこで、miseのaquaバックエンドでpinactをインストールします。
なお、miseはデフォルトでaquaバックエンドを使っており、 pinact もaquaで管理されていることから、 aqua: はなくても良さそうです。
% mise use --pin aqua:suzuki-shunsuke/pinact@latest aqua:suzuki-shunsuke/pinact@3.10.1 extract pinact_darwin_arm64.tar.gz ✔ mise ~/project/railroads/mise.toml tools: aqua:suzuki-shunsuke/pinact@3.10.1
実行後、設定ファイル (mise.toml) に pinact の設定が追加されたことを確認します。
[tools] "aqua:suzuki-shunsuke/pinact" = "3.10.1"
minimum_release_age の設定を追加
最近の状況だと、リリースされたばかりのツールをインストールするのは危険なこともあります。そこで、miseの minimum_release_age を使ってリリース後7日経過してからインストールするようにします。
https://mise.jdx.dev/configuration/settings.html#minimum_release_age
具体的には、リポジトリの mise.toml に以下の記述を追加します。
[settings] minimum_release_age = "7d"
GitHub Actionsのバージョンを上げる
pinact の準備ができたので、次はGitHub Actionsのバージョンを上げます。
このタイミングでは actions/checkout@v6.0.2 のように、バージョンで指定します。
pinactでバージョンをコミットハッシュへと変換
pinact run すると、バージョンがコミットハッシュへと変換されます。
また、次のようにコミットハッシュのところにコメントでバージョンも記載されるため、このコミットハッシュはどのバージョンを指しているのかがわかりやすいです。
actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
pinact化を強制するワークフローを追加
pinact run の実行忘れがありそうだったため、pinact化を強制するワークフローを追加しました。
また、GitHub Actionsのrulesetへ追加し、このワークフローが失敗した場合はプルリクをマージできないようにします。
ワークフロー
pinact公式の pinact-action を使ったワークフローを用意します。
https://github.com/suzuki-shunsuke/pinact-action
今回はチェックだけにとどめたいため、 skip_push: true と verify: true を設定しています。
なお、このファイルも pinact run し、GitHub ActionsのSHAを固定しておきます。
name: Pin GitHub Actions on: pull_request: push: branches: [ main ] permissions: contents: read jobs: pinact: name: pinact runs-on: ubuntu-latest steps: - name: Fetch Sources uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 with: persist-credentials: false - name: Check pinned GitHub Actions uses: suzuki-shunsuke/pinact-action@cf51507d80d4d6522a07348e3d58790290eaf0b6 # v2.0.0 with: skip_push: "true" verify: "true"
GitHubのRulesetsへの追加
Settings > Rules > Rulesets より追加します。
Railroadsではすでに main branch protection ルールを設定していたため、それを更新することにします。
Require status checks to pass へ pinact ワークフローを追加します。
あとは、実際に動かしてみて、 pinact ワークフローが動作することを確認しました。
ソースコード
対応した時のプルリクはこちらです。
https://github.com/thinkAmi/railroads/pull/108