JetBrains IDEのプラグインRailroadsにて、利用しているGitHub Actionsをpinactでコミットハッシュ固定してみた

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

 

参考

miseでツールのバージョン管理をすることを何度でも推したい(2026年版) | DevelopersIO