BioErrorLog Tech Blog

試行錯誤の記録

GitHub Actionsでcargo実行時のworking directoryが変更できない問題への対処法 | Rust

GitHub Actionsでactions-rs/cargoを使ってcargoを実行したときに、working-directoryの変更が反映されない問題の原因と対処法をまとめます。

はじめに

GitHub Actionsにてactions-rs/cargoを使ってcargoを実行したときに、working-directoryの変更が反映されない、という問題に遭遇しました。

例えばrootディレクトリでなくサブディレクトリでcargo initした場合(Cargo.tomlがrootではなくサブディレクトリにある場合)、GitHub Actionsでcargoコマンドを実行するときもそのサブディレクトリ内でcargoコマンドを実行したくなります:

# Actionsでcargo checkをサブディレクトリで実行させたい時のコード例
      - name: Run cargo check
        uses: actions-rs/cargo@v1
        with:
          command: check
          working-directory: <SUBDIRECTORY>

しかし、上記コードのようにworking-directoryを適用させても、actions-rs/cargoが実行するディレクトリの場所は変更が反映されず、下記のようなエラーが出ます:

/home/runner/.cargo/bin/cargo check
error: could not find `Cargo.toml` in `/home/runner/work/<ROOTDIRECTORY>/<SUBDIRECTORY>` or any parent directory
Error: The process '/home/runner/.cargo/bin/cargo' failed with exit code 101

この問題の原因と対処法を整理します。

actions-rs/cargo実行時のworking directoryが変更できない問題への対処法

原因

  • working-directoryrunに対して適用されるものであり、actionsに反映させるにはactions側での対応が必要。
  • actions-rs/cargoworking-directoryに対応していない。

まず、Actionsで定義できるworking-directoryは、runで実行されるコマンドに対して適用されるものであり、それぞれのactionsへの適用は自明ではありません。

そこで今回利用しているactions-rs/cargoですが、working-directoryは対応していません。

この問題を解決するプルリクは作成されていますが、メンテナーがコメントしている通り、mergeされることはなさそうです。

Add working-directory by MarcoPolo · Pull Request #59 · actions-rs/cargo · GitHub

よって現状、actions-rs/cargoを使った場合はworking-directoryが反映されない、ということになります。

対処法

以下の2つが思い浮かびます。

  • --manifest-pathを指定する
  • cargoを直接実行する (actions-rs/cargoを使わない)

--manifest-pathを指定する

cargoのオプション--manifest-pathを指定することで、working directoryを変更せずともCargo.tomlの位置を指定することができます。

# --manifest-path を指定してcargo checkを実行するコード例
      - name: Run cargo check
        uses: actions-rs/cargo@v1
        with:
          command: check
          args: --manifest-path <SUBDIRECTORY>/Cargo.toml

これで問題なく解決する場合は、一番シンプルな対処法と言えるでしょう。

しかし、例えば.cargo/configを指定している場合などは、ちゃんとcargo実行時のディレクトリを変更しないと設定が反映されないので注意が必要です。

cargoを直接実行する (actions-rs/cargoを使わない)

上記の--manifest-pathを指定するやり方が使えない場合は、actions-rs/cargoを使うことを諦めてcargoを直接実行してしまう手もあります。

# cargoを直接実行するコード例
      - name: Run cargo check
        working-directory: <SUBDIRECTORY>
        run: |
          cargo check

しかしこのやり方を採用すると、もちろん以下のようなactions-rs/cargoの恩恵は受けられなくなります。

  1. use-crossを利用したクロスインストール
  2. cargo自身が出力するWarningとErrorをGitHub UIに表示する

それを受け入れられない場合は、もう他のactionを使う(あるいは自分で作る)しかないように思います。 幸いactions-rs/cargoからForkされたものもプルリクの議論の中で話題に上がっているので、試されると良いかもしれません。

Add working-directory by MarcoPolo · Pull Request #59 · actions-rs/cargo · GitHub

おわりに

以上、GitHub Actionsでcargo実行時のworking directoryが変更できない問題への対処法を整理しました。

どれも歯切れの悪い打ち手しかなく、少しモヤモヤします。

他に良い対処があったらぜひご教示ください。

[関連記事]

www.bioerrorlog.work

参考

Support changing working directory · Issue #6 · actions-rs/cargo · GitHub

Add working-directory by MarcoPolo · Pull Request #59 · actions-rs/cargo · GitHub

GitHub - actions-rs/cargo: 📦 GitHub Action for Rust `cargo` command

Workflow syntax for GitHub Actions - GitHub Docs

rust - How to specify the path to a Cargo.toml - Stack Overflow