あずんひの日

あずんひの色々を書き留めるブログ

GitLabのWindows用SaaS RunnerでRustをビルドする

個人プロジェクトGitHubにもある)においてWindowsのネイティブ環境でRustをビルドしたかったのですが、 情報が少なくやたらと時間が掛かってしまったので備忘録を残しておきます。

前提知識としてGitLab CIの基礎的な知識が必要です。 またRunnerはgitlab.com公式のSaaS Runnerを使用しているため、独自インスタンス等では役に立たないかもしれないことにご留意ください。

今回使用したコードはaznhe21/test-gitlab-saas-runner-windows-rustにあるのでこちらも見てみてください。

GitLab CIをWindowsネイティブで動かす

GitLab CIを公式SaaS RunnerのWindows版で動かすにはジョブに2つのタグを指定します。

job:
  tags:
    - shared-windows
    - windows-1809
  script:
    # シェルはPowerShell
    - Write-Host "hoge"

2番目のwindows-1809Windowsのバージョンを表すのですが、 ドキュメントによると執筆時点(2023年8月)ではこれしか提供されていません。 既にサポートが切れているバージョンなのが気になりますがビルドするだけならいいんじゃないでしょうか(適当)。

この内容を.gitlab-ci.ymlに書き込むとWindowsVMが起動してログに「hoge」と書き込まれます。 なおVMの起動には2~3分程度掛かるようなので辛抱強く待ってください。

このVMにはいくらかのソフトウェアがインストールされています。 これはchefで管理されているようで、そのリストはレポジトリで公開されています。 Windowsであればパッケージのインストールにwingetを使いたいところですが、 今のところは残念ながら使えません。代わりにchocolateyを使うと良いでしょう。

試してみたものがこちらにあるので参考にしてみてください。
https://gitlab.com/aznhe21/test-gitlab-saas-runner-windows-rust/-/jobs/4823633499

Windows用RunnerでRustをビルドする

と言うわけでWindows用Runnerの実行方法が分かったところでRustのビルドに行きましょう。

WindowsVMにはcargoやrustcどころかrustupも入っていません。 自分でインストール用スクリプトを書く必要があります。 これを毎回書くのは面倒なので、extendsで使用できるようにまとめたものを用意しました。ぜひ使ってみてください。

extendsする側のvariablesで以下の値を指定することが出来ます。

  • SETUP_RUST_TOOLCHAIN:rustupでインストールするツールチェイン名。stable1.71.1のように指定します
  • CARGO_HOME:キャッシュ用にCARGO_HOMEを指定しても動くようにしています
.windows-runner-rust:
  tags:
    - shared-windows
    - windows-1809
  variables:
    SETUP_RUST_TOOLCHAIN: stable
  before_script:
    - |
      $ProgressPreference = "silentlyContinue"
      Invoke-WebRequest -Uri https://win.rustup.rs/x86_64 -OutFile rustup-init.exe
      .\rustup-init.exe -q -y --default-toolchain none
      Remove-Item .\rustup-init.exe
      if ($Env:CARGO_HOME) {
        $Env:Path += ";$Env:CARGO_HOME\bin"
      } else {
        $Env:Path += ";$Env:USERPROFILE\.cargo\bin"
      }

      rustup toolchain install $SETUP_RUST_TOOLCHAIN --profile minimal --no-self-update
      rustup default $SETUP_RUST_TOOLCHAIN

これはこのように使います。 CIでインクリメンタルコンパイルを使用するのは無駄なのでCARGO_INCREMENTAL=0を設定すると良いでしょう。

variables:
  CARGO_INCREMENTAL: "0"

windows:test:
  extends: [.windows-runner-rust]
  script:
    - cargo test

試してみたものがこちらにあります。
https://gitlab.com/aznhe21/test-gitlab-saas-runner-windows-rust/-/jobs/4823633501

最後に.gitlab-ci.ymlの全文を載せておきます。もちろんレポジトリでも確認できます。

今回使用した.gitlab-ci.ymlの全文

variables:
  RUSTFLAGS: -Dwarnings
  # https://github.com/dtolnay/rust-toolchain/issues/26
  CARGO_INCREMENTAL: "0"

windows:versions:
  tags:
    - shared-windows
    - windows-1809
  script:
    - try { choco --version } catch { Write-Host $_ }
    - try { winget --version } catch { Write-Host $_ }

windows:test:
  extends: [.windows-runner-rust]
  script:
    - cargo test

##############################

.windows-runner-rust:
  tags:
    - shared-windows
    - windows-1809
  variables:
    SETUP_RUST_TOOLCHAIN: stable
  before_script:
    - |
      $ProgressPreference = "silentlyContinue"
      Invoke-WebRequest -Uri https://win.rustup.rs/x86_64 -OutFile rustup-init.exe
      .\rustup-init.exe -q -y --default-toolchain none
      Remove-Item .\rustup-init.exe
      if ($Env:CARGO_HOME) {
        $Env:Path += ";$Env:CARGO_HOME\bin"
      } else {
        $Env:Path += ";$Env:USERPROFILE\.cargo\bin"
      }

      rustup toolchain install $SETUP_RUST_TOOLCHAIN --profile minimal --no-self-update
      rustup default $SETUP_RUST_TOOLCHAIN

WindowsSaaS Runnerはまだベータ版

ここまでサラッと書いてますが、実はWindowsを実行するSaaS Runnerはまだベータ版です。 Issueによると2024年度の第4四半期にはGAを迎えられるよう作業を進めているようです。 GAまでにはサポートの切れていないWindowsが使えるようになると良いですね。