GitHub Actions ワークフローをフォーク対応に修正し、Aruba 2.4.0 / Cucumber 11 のテスト破損を解消
3.13.x ブランチのCIビルドが、Aruba 2.4.0 の依存関係変化によって壊れていた問題を修正したバックポートPRです。GHA ワークフローのリポジトリ参照方式の変更と、依存ライブラリの調整を合わせて行っています。
背景
Aruba 2.4.0 が irb への依存を追加したことで、Rubyバージョン間で読み込まれるライブラリが変化し、テストが不安定になりました。irb はgemified版のライブラリ群を引き込むため、従来はdefault gemsやRubyバージョン固有の経路で読み込まれていたものが、異なるパスから読み込まれるようになります。この影響はバックトレースのフィルタリング結果や、読み込み済みfeatureの検証など複数のテストに及んでいます。
#326 で main ブランチ向けに修正が行われ、本PR (#327) はその関連部分を 3.13.x ブランチへチェリーピックしたものです。なお、GHA ワークフローのフォーク対応修正は main ブランチ側では既にコミット 743e849 で対処されており、本PRはそれを 3.13.x へも適用しています。
技術的な変更
変更は大きく「GHA ワークフロー修正」「依存ライブラリ調整」「テストコード修正」の3つに分類されます。
GHA ワークフローのリポジトリ参照方式
CIがフォークリポジトリやプルリクエストから実行できなかった原因は、再利用可能ワークフロー(Reusable Workflow) の参照に絶対的なリポジトリ名が使われていたことです。.github/workflows/ci.yml 内の uses 指定が、ハードコードされたリポジトリ参照から相対パス参照に変更されました。
変更前:
uses: rspec/rspec/.github/workflows/rspec.yml@3-13-maintenance
変更後:
uses: ./.github/workflows/rspec.yml
同様の変更が documentation_coverage.yml の参照を含む計5箇所に適用されています。フォークからのPRでは rspec/rspec リポジトリへのアクセス権がないため、絶対参照では実行に失敗します。相対パス参照(./)に切り替えることで、フォークのコンテキストでも自身のワークフローファイルを参照できるようになります。
また .github/workflows/rspec.yml では、git remote add origin のURLも変更されています。
変更前:
run: git remote add origin https://github.com/rspec/rspec
変更後:
run: git remote add origin https://github.com/$GITHUB_REPOSITORY
$GITHUB_REPOSITORY は GitHub Actions が自動的に設定する環境変数で、実行コンテキストのリポジトリ(フォークを含む)を指します。ハードコードされたURLからこの変数への切り替えにより、フォーク上でも正しいリモートが設定されます。
依存ライブラリの調整(Gemfile)
Aruba 2.4.0 が引き込む irb の依存解決を安定させるため、Gemfile のいくつかの指定が変更されています。
-
minitest:~> 5.12.0から~> 5.15へ緩和。Aruba/Cucumber 11 の要求するバージョン範囲に合わせた更新です。 -
tsort: Ruby 3.0.x 向けに'0.1.0'を明示追加。tsortは Ruby 3.1 以降 bundled gem 化されており、3.0.x ではirbが引き込む依存の解決に使われる場合がある gem を明示固定することで、バージョン混在を防いでいます。 -
mutex_m: Ruby 3.3 超での~> 0.1.0指定を削除。この制約が不要になったと判断されています。
テストコードの修正
Aruba 2.4.0 による依存変化の影響で壊れていたテストが2箇所修正されています。
rspec-core/spec/support/formatter_support.rb では、backtrace_formatter の除外パターンに /erb\.rb/ が追加されました。
configuration.backtrace_formatter.exclusion_patterns << /erb\.rb/ # remove differences/churn between use of stdlib and bundled erb
irb が bundled 版の erb を読み込む場合と stdlib の erb が使われる場合でバックトレースの内容が変わるため、フォーマッタのテストで差異が生じていました。このパターンを除外することでRubyバージョン・gem構成間の差異を吸収しています。
rspec-support/spec/rspec/support_spec.rb では、allowed_loaded_feature_regexps に /set\.rb/ が追加され、正規表現のエスケープも修正されました。
/prettyprint\.rb/, /pp\.rb/, /set\.rb/, /diff\/lcs/
irb の依存チェーンが set を読み込むようになったため、テスト環境での許容ファイルリストへの追加が必要になっています。あわせて .rb の . がメタ文字のままになっていた既存の正規表現も \. に修正されています。
設計判断
GHA ワークフローの参照方式として 相対パス参照 が採用された点が重要です。絶対参照(owner/repo/.github/workflows/file.yml@ref)はGitHub Actionsがリポジトリ間の再利用を意図した構文であり、同一リポジトリ内の参照には相対パスが適切です。フォーク対応を意識した設計としては、$GITHUB_REPOSITORY の活用も同じ方針に基づいています。
依存ライブラリ側では、バージョン制約を最小限の変更に留める方針が取られています。minitest のバージョン範囲を ~> 5.15 へ拡張する一方、tsort の明示的なピン留めは Ruby 3.0.x という限定的な条件下のみに適用しています。これは 3.13.x ブランチの安定性を優先しつつ、破綻した依存解決を局所的に修正するアプローチです。
まとめ
Aruba 2.4.0 が irb を引き込んだことで生じたRubyバージョン間のライブラリ読み込み差異を、テスト側のフィルタリング拡張と依存ライブラリのピン留めによって吸収した修正です。あわせてGHA ワークフローのリポジトリ参照をハードコードから動的参照へ切り替えたことで、フォーク上でのCIも正常に機能するようになりました。