App-Ariza.git | resources/templates/ci/ | lane-windows-x86_64.yml.j2
bundle-windows-x86_64:
name: bundle windows-x86_64
runs-on: windows-latest
# No `defaults: run: shell: bash` here, on purpose: zef -- both the one
# installing ariza below and the one ariza's own site-install runs
# inside `ariza bundle` -- resolves `tar` off whatever shell launched
# it. Under bash that is Git Bash's MSYS tar, which treats a leading
# `C:` in a path as a remote hostname and aborts extracting into any
# mixed-separator temp path zef hands it. The runner's default pwsh
# instead finds Windows' own bsdtar, which has no such reading of `C:`.
# zef's child processes inherit whatever shell ran the step, so pwsh
# has to be load-bearing for every step that might invoke it, not just
# the ones below that already needed PowerShell for path handling.
steps:
- uses: actions/checkout@v6
with:
ref: {% raw %}${{ inputs.ref || github.ref }}{% endraw %}
# This Raku runs ariza. It is NOT the runtime that ends up in the
# bundle -- ariza downloads the pinned one ({{ rakudo_tag }}) from
# rakudo.org itself.
- uses: Raku/setup-raku@v1
with:
raku-version: 'latest'
- name: Install ariza
run: {{ ariza_install }}
{%- for line in ariza_install_note %}
# {{ line }}
{%- endfor %}
# Windows has no package manager ariza drives, so it is told where
# the library is: SQLCIPHER_LIB_DIR names the directory holding the
# SQLCipher DLL and beats every other source. (ariza probes MSYS2's
# prefixes and a VCPKG_ROOT tree by itself, but naming the directory
# outright is one less thing to be wrong about.)
#
# MSYS2's UCRT package rather than vcpkg's, and the difference is
# not a preference:
#
# * vcpkg builds with MSVC, so its sqlcipher.dll imports
# vcruntime140.dll -- the Visual C++ Redistributable, which is
# NOT part of Windows. Every CI runner has it installed, so a
# bundle built that way passes every check here and fails to
# load on a clean machine, which is the machine a bundle is for.
# (ariza's PE audit now refuses that bundle outright.) MSYS2's
# mingw-w64-ucrt-x86_64-* packages import ucrtbase.dll instead,
# which Windows has shipped in System32 since Windows 10.
# * The MSYS2 package is prebuilt. The vcpkg port was a fifteen-
# minute source build, which is why this lane used to carry a
# restore/save cache pair around it; both are gone.
# * Its whole runtime closure -- OpenSSL, the mingw runtime --
# lands in ucrt64\bin beside the DLL, which is the search space
# contract App::Ariza::Native relies on to copy dependencies in.
#
# MSYS2 is preinstalled at C:\msys64 on windows runners, so this is
# a package install and nothing else. `-Sy` refreshes the package
# databases first: the image's copy is as old as the image, and
# MSYS2's mirrors keep only current versions, so a stale database
# sends pacman after a file that is no longer there.
- name: Install SQLCipher
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
& C:\msys64\usr\bin\pacman.exe -Sy --noconfirm --needed mingw-w64-ucrt-x86_64-sqlcipher
if ($LASTEXITCODE -ne 0) { throw "pacman failed (exit $LASTEXITCODE)" }
# The name is a wildcard because MSYS2's is libsqlcipher-0.dll,
# where vcpkg's was sqlcipher.dll: ariza accepts either and stages
# whichever it finds under the canonical name. Asserted rather than
# assumed -- a pacman that exits 0 having installed nothing would
# otherwise surface as a confusing failure inside `ariza bundle`.
- name: Locate SQLCipher
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$lib = 'C:\msys64\ucrt64\bin'
if (-not (Test-Path (Join-Path $lib 'libsqlcipher*.dll'))) {
throw "pacman installed no libsqlcipher*.dll in $lib"
}
"SQLCIPHER_LIB_DIR=$lib" | Out-File -FilePath $env:GITHUB_ENV -Append -Encoding utf8
- name: Build the bundle
run: |
$ErrorActionPreference = 'Stop'
ariza bundle --app=. --platform=windows-x86_64 --out-dir=dist-out
if ($LASTEXITCODE -ne 0) { throw "ariza bundle failed (exit $LASTEXITCODE)" }
# Unpacks the archive somewhere new, with a replaced environment,
# and runs {{ app_name }}'s own bundle.smoke commands against it.
- name: Smoke the bundle
run: |
$ErrorActionPreference = 'Stop'
$archive = (Get-ChildItem dist-out\*.tar.gz | Select-Object -First 1).FullName
ariza smoke --archive="$archive"
if ($LASTEXITCODE -ne 0) { throw "ariza smoke failed (exit $LASTEXITCODE)" }
- name: Upload
uses: actions/upload-artifact@v6
with:
name: windows-x86_64
path: |
dist-out/*.tar.gz
dist-out/*.tar.gz.sha256
if-no-files-found: error