個人プロジェクト(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-1809
はWindowsのバージョンを表すのですが、
ドキュメントによると執筆時点(2023年8月)ではこれしか提供されていません。
既にサポートが切れているバージョンなのが気になりますがビルドするだけならいいんじゃないでしょうか(適当)。
この内容を.gitlab-ci.yml
に書き込むとWindowsのVMが起動してログに「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のビルドに行きましょう。
WindowsのVMにはcargoやrustcどころかrustupも入っていません。
自分でインストール用スクリプトを書く必要があります。
これを毎回書くのは面倒なので、extends
で使用できるようにまとめたものを用意しました。ぜひ使ってみてください。
extends
する側のvariables
で以下の値を指定することが出来ます。
SETUP_RUST_TOOLCHAIN
:rustupでインストールするツールチェイン名。stable
や1.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
の全文を載せておきます。もちろんレポジトリでも確認できます。
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
Windows用SaaS Runnerはまだベータ版
ここまでサラッと書いてますが、実はWindowsを実行するSaaS Runnerはまだベータ版です。 Issueによると2024年度の第4四半期にはGAを迎えられるよう作業を進めているようです。 GAまでにはサポートの切れていないWindowsが使えるようになると良いですね。