From: Justin Tobler <jltobler@gmail.com>
To: Patrick Steinhardt <ps@pks.im>
Cc: git@vger.kernel.org
Subject: Re: [PATCH] gitlab-ci: migrate Windows builds away from Chocolatey
Date: Wed, 17 Jun 2026 15:03:39 -0500 [thread overview]
Message-ID: <ajL1677NQShTO6tD@denethor> (raw)
In-Reply-To: <20260615-b4-pks-gitlab-ci-drop-chocolatey-v1-1-51a6e7d5e388@pks.im>
On 26/06/15 02:21PM, Patrick Steinhardt wrote:
> The Windows builds in GitLab CI use Chocolatey to install dependencies.
> Unfortunately, Chocolatey seems to be very unreliable, which causes the
> jobs to fail very regularly. This is a limitation that seems to be
> somewhat known [1]:
>
> As an organization, you want 100% reliability (or at least that
> potential), and you may want full trust and control as well. This is
> something you can get with internally hosted packages, and you are
> unlikely to achieve from use of the Community Package Repository.
>
> So using the Community Package Repository is kind of discouraged in case
> one wants reliability. We _do_ want reliability though, and we cannot
> easily switch to an enterprise license to fix this issue.
Make sense.
> Introduce a new script that downloads and installs dependencies
> directly. This has a couple of benefits:
>
> - We can drop our dependency on Chocolatey completely, thus improving
> reliability.
>
> - We can easily cache the installers.
>
> - We get direct control over the exact versions we install.
Naive question: Do we expect to have to update the pinned versions
often?
> - Installing dependencies is sped up from roundabout 3 minutes to 1
> minute.
Is fetching the dependencides directly just plain faster? Or is this due
to the caching?
> [1]: https://docs.chocolatey.org/en-us/community-repository/community-packages-disclaimer/#summary
>
> Signed-off-by: Patrick Steinhardt <ps@pks.im>
> ---
> Hi
>
> I've been quite annoyed recently because our Windows builds in GitLab CI
> are extremely flakey. All of those flakes come from Chocolatey, which is
> why this patch moves away from it.
>
> Thanks!
>
> Patrick
> ---
> .gitlab-ci.yml | 11 ++++++---
> ci/install-dependencies.ps1 | 55 +++++++++++++++++++++++++++++++++++++++++++++
> 2 files changed, 63 insertions(+), 3 deletions(-)
>
> diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
> index e0b9a0d82b..87a5343a94 100644
> --- a/.gitlab-ci.yml
> +++ b/.gitlab-ci.yml
> @@ -161,11 +161,16 @@ test:mingw64:
> TEST_OUTPUT_DIRECTORY: "C:/Git-Test"
> tags:
> - saas-windows-medium-amd64
> + cache:
> + key:
> + files:
> + - ci/install-dependencies.ps1
> + paths:
> + - .dependencies
Nice that we can cache the installers now.
> before_script:
> - *windows_before_script
> - - choco install -y git meson ninja rust-ms
> - - Import-Module $env:ChocolateyInstall\helpers\chocolateyProfile.psm1
> - - refreshenv
> + - ./ci/install-dependencies.ps1
> + - $env:Path = "C:\Meson;C:\Rust\bin;$env:Path"
I assume Git is already discoverable on the path?
> - New-Item -Path $env:TEST_OUTPUT_DIRECTORY -ItemType Directory
>
> build:msvc-meson:
> diff --git a/ci/install-dependencies.ps1 b/ci/install-dependencies.ps1
> new file mode 100755
> index 0000000000..e3b367fa54
> --- /dev/null
> +++ b/ci/install-dependencies.ps1
> @@ -0,0 +1,55 @@
> +param(
> + [string]$DownloadDirectory = '.dependencies'
> +)
> +
> +$ErrorActionPreference = 'Stop'
> +$ProgressPreference = 'SilentlyContinue'
> +
> +$GitVersion = '2.54.0.windows.1'
> +$MesonVersion = '1.11.0'
> +$RustVersion = '1.96.0'
> +
> +New-Item -Path $DownloadDirectory -ItemType Directory -Force | Out-Null
> +New-Item -Path .git/info -ItemType Directory -Force | Out-Null
> +New-Item -Path .git/info/exclude -ItemType File -Force | Out-Null
> +Add-Content -Path .git/info/exclude -Value "/$DownloadDirectory"
Here we create the ".dependencies" directory and add it to
".git/info/exclude" to be ignored.
> +function Get-Installer {
> + param(
> + [Parameter(Mandatory = $true)][string]$Name,
> + [Parameter(Mandatory = $true)][string]$Url
> + )
> +
> + $path = Join-Path $DownloadDirectory $Name
> + if (-not (Test-Path $path)) {
> + Write-Host "Downloading $Url"
> + Invoke-WebRequest $Url -OutFile $path -TimeoutSec 300
We only download the installer if it is not already cached. Makes sense.
> + }
> + return $path
> +}
> +
> +function Invoke-Installer {
> + param(
> + [Parameter(Mandatory = $true)][string]$FilePath,
> + [Parameter(Mandatory = $true)][string[]]$ArgumentList
> + )
> +
> + Write-Host "Running $FilePath $($ArgumentList -join ' ')"
> + $process = Start-Process -Wait -PassThru -FilePath $FilePath -ArgumentList $ArgumentList
> + if ($process.ExitCode -ne 0) {
> + throw "$FilePath failed with exit code $($process.ExitCode)"
> + }
> +}
> +
> +$gitAssetVersion = $GitVersion -replace '\.windows\.\d+$', ''
> +$gitInstaller = Get-Installer "Git-Installer.exe" `
> + "https://github.com/git-for-windows/git/releases/download/v$GitVersion/PortableGit-$gitAssetVersion-64-bit.7z.exe"
> +Invoke-Installer $gitInstaller @('-y', '-o"C:\Program Files\Git"')
> +
> +$mesonMsi = Get-Installer "meson.msi" `
> + "https://github.com/mesonbuild/meson/releases/download/$MesonVersion/meson-$MesonVersion-64.msi"
> +Invoke-Installer msiexec.exe @('/i', $mesonMsi, 'INSTALLDIR=C:\Meson', '/quiet', '/norestart')
> +
> +$rustMsi = Get-Installer "rust.msi" `
> + "https://static.rust-lang.org/dist/rust-$RustVersion-x86_64-pc-windows-msvc.msi"
> +Invoke-Installer msiexec.exe @('/i', $rustMsi, 'INSTALLDIR=C:\Rust', 'ADDLOCAL=Rustc,Cargo,Std', '/quiet', '/norestart')
Here is actually invoke the helpers to fetch and install the
dependencies. Looks good. I also validated that this job is working on
GitLab CI.
-Justin
prev parent reply other threads:[~2026-06-17 20:03 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-06-15 12:21 [PATCH] gitlab-ci: migrate Windows builds away from Chocolatey Patrick Steinhardt
2026-06-17 20:03 ` Justin Tobler [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ajL1677NQShTO6tD@denethor \
--to=jltobler@gmail.com \
--cc=git@vger.kernel.org \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.