feat: add windows runner CI and release jobs
This commit is contained in:
parent
e2795cfef9
commit
4360e45233
4 changed files with 131 additions and 26 deletions
|
|
@ -66,3 +66,30 @@ jobs:
|
||||||
working-directory: carrier
|
working-directory: carrier
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ""
|
GITHUB_TOKEN: ""
|
||||||
|
|
||||||
|
windows:
|
||||||
|
runs-on: windows-x86_64
|
||||||
|
steps:
|
||||||
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: carrier
|
||||||
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: randogoth/fumi
|
||||||
|
ref: main
|
||||||
|
path: fumi
|
||||||
|
- uses: https://code.forgejo.org/actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cargo/registry
|
||||||
|
carrier/target
|
||||||
|
fumi/target
|
||||||
|
key: cargo-windows-${{ hashFiles('carrier/Cargo.lock') }}
|
||||||
|
restore-keys: cargo-windows-
|
||||||
|
# No devbox on Windows: the runner host itself is the MSYS2 MINGW64
|
||||||
|
# toolchain that windows/setup.sh installs, so this runs the same
|
||||||
|
# commands devbox's `check` script runs on the other two platforms
|
||||||
|
# straight from cargo.
|
||||||
|
- run: cargo fmt --check && cargo build && cargo test
|
||||||
|
working-directory: carrier
|
||||||
|
shell: bash
|
||||||
|
|
|
||||||
|
|
@ -73,6 +73,69 @@ jobs:
|
||||||
"$FORGEJO/api/v1/repos/$REPO/releases/$release_id/assets?name=$NAME"
|
"$FORGEJO/api/v1/repos/$REPO/releases/$release_id/assets?name=$NAME"
|
||||||
working-directory: carrier
|
working-directory: carrier
|
||||||
|
|
||||||
|
# Same non-gating strategy as the macos job above: this runner is a
|
||||||
|
# desktop machine that isn't guaranteed to be on when a tag is pushed,
|
||||||
|
# so it must never gate the release (and must not be gated by it
|
||||||
|
# either). It builds and bundles via windows/bundle.sh - the same
|
||||||
|
# script windows/setup.sh runs for local one-command builds - then
|
||||||
|
# appends the zip to the release the linux+flatpak jobs create, with
|
||||||
|
# the same poll-for-the-release the macos job does.
|
||||||
|
windows:
|
||||||
|
runs-on: windows-x86_64
|
||||||
|
steps:
|
||||||
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: carrier
|
||||||
|
- uses: https://code.forgejo.org/actions/checkout@v4
|
||||||
|
with:
|
||||||
|
repository: randogoth/fumi
|
||||||
|
ref: main
|
||||||
|
path: fumi
|
||||||
|
- uses: https://code.forgejo.org/actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
~/.cargo/registry
|
||||||
|
carrier/target
|
||||||
|
fumi/target
|
||||||
|
key: cargo-windows-${{ hashFiles('carrier/Cargo.lock') }}
|
||||||
|
restore-keys: cargo-windows-
|
||||||
|
- run: bash windows/bundle.sh
|
||||||
|
working-directory: carrier
|
||||||
|
shell: bash
|
||||||
|
- run: |
|
||||||
|
REPO="${{ forge.repository }}"
|
||||||
|
TAG="${{ forge.ref_name }}"
|
||||||
|
FORGEJO="${{ env.FORGEJO_SERVER_URL }}"
|
||||||
|
FORGEJO="${FORGEJO%%/}"
|
||||||
|
TOKEN="${{ forge.token }}"
|
||||||
|
VERSION=$(sed -n 's/^version = "\(.*\)"$/\1/p' Cargo.toml | head -1)
|
||||||
|
FILE="carrier-windows-$VERSION.zip"
|
||||||
|
NAME="carrier-windows-$VERSION.zip"
|
||||||
|
|
||||||
|
release_id=""
|
||||||
|
for i in $(seq 1 40); do
|
||||||
|
body=$(curl --retry 5 -sS -H "Authorization: token $TOKEN" "$FORGEJO/api/v1/repos/$REPO/releases/tags/$TAG")
|
||||||
|
release_id=$(echo "$body" | grep -o '"id":[0-9]*' | head -1 | grep -o '[0-9]*')
|
||||||
|
if [ -n "$release_id" ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo "release for $TAG not ready yet, waiting 15s ($i/40)"
|
||||||
|
sleep 15
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ -z "$release_id" ]; then
|
||||||
|
echo "release for $TAG never appeared after 10 minutes" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
curl --retry 5 --fail -sS -X POST \
|
||||||
|
-H "Authorization: token $TOKEN" \
|
||||||
|
-H "Content-Type: multipart/form-data" \
|
||||||
|
-F "attachment=@$FILE" \
|
||||||
|
"$FORGEJO/api/v1/repos/$REPO/releases/$release_id/assets?name=$NAME"
|
||||||
|
working-directory: carrier
|
||||||
|
shell: bash
|
||||||
|
|
||||||
linux:
|
linux:
|
||||||
runs-on: linux-x86_64
|
runs-on: linux-x86_64
|
||||||
steps:
|
steps:
|
||||||
|
|
|
||||||
38
windows/bundle.sh
Normal file
38
windows/bundle.sh
Normal file
|
|
@ -0,0 +1,38 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
# Build carrier and bundle the result: carrier.exe plus the GTK runtime
|
||||||
|
# into dist/, then dist/ into carrier-windows-<version>.zip.
|
||||||
|
#
|
||||||
|
# Run from the carrier checkout inside the MSYS2 MINGW64 shell (or with
|
||||||
|
# the MINGW64 toolchain on PATH — windows/setup.sh installs the deps,
|
||||||
|
# and the forgejo Windows runner host already carries them).
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
say() { printf '\n==> %s\n' "$*"; }
|
||||||
|
die() { printf '\n!! %s\n' "$*" >&2; exit 1; }
|
||||||
|
|
||||||
|
say "building carrier (release; the first build takes a while)"
|
||||||
|
cargo build --release --locked || die "cargo build failed"
|
||||||
|
|
||||||
|
say "bundling the runtime"
|
||||||
|
rm -rf dist
|
||||||
|
mkdir -p dist/share/glib-2.0/schemas \
|
||||||
|
dist/share/icons/hicolor/512x512/apps \
|
||||||
|
dist/share/icons/hicolor/256x256/apps \
|
||||||
|
dist/share/icons/hicolor/128x128/apps
|
||||||
|
cp target/release/carrier.exe dist/
|
||||||
|
for dll in $(ldd target/release/carrier.exe | awk '/mingw64/ {print $3}'); do
|
||||||
|
cp "$dll" dist/ || die "copying $dll failed"
|
||||||
|
done
|
||||||
|
[ "$(ls dist/*.dll | wc -l)" -gt 0 ] || die "no DLLs collected — ldd found none under /mingw64"
|
||||||
|
cp /mingw64/share/glib-2.0/schemas/* dist/share/glib-2.0/schemas/
|
||||||
|
glib-compile-schemas dist/share/glib-2.0/schemas/
|
||||||
|
cp -r /mingw64/share/icons/Adwaita dist/share/icons/
|
||||||
|
cp -r /mingw64/share/icons/hicolor dist/share/icons/
|
||||||
|
cp data/icons/com.randogoth.carrier.png dist/share/icons/hicolor/512x512/apps/
|
||||||
|
cp data/icons/com.randogoth.carrier-256.png dist/share/icons/hicolor/256x256/apps/
|
||||||
|
cp data/icons/com.randogoth.carrier-128.png dist/share/icons/hicolor/128x128/apps/
|
||||||
|
|
||||||
|
say "zipping"
|
||||||
|
version=$(sed -n 's/^version = "\(.*\)"$/\1/p' Cargo.toml | head -1)
|
||||||
|
rm -f "carrier-windows-$version.zip"
|
||||||
|
(cd dist && zip -qr "../carrier-windows-$version.zip" .)
|
||||||
|
|
@ -5,6 +5,8 @@
|
||||||
# GTK runtime into dist/ and carrier-windows.zip.
|
# GTK runtime into dist/ and carrier-windows.zip.
|
||||||
#
|
#
|
||||||
# If MSYS2 updates its own core mid-run the shell may die — just rerun.
|
# If MSYS2 updates its own core mid-run the shell may die — just rerun.
|
||||||
|
# Building and bundling live in windows/bundle.sh, shared with the
|
||||||
|
# forgejo Windows release job.
|
||||||
set -euo pipefail
|
set -euo pipefail
|
||||||
|
|
||||||
say() { printf '\n==> %s\n' "$*"; }
|
say() { printf '\n==> %s\n' "$*"; }
|
||||||
|
|
@ -31,31 +33,6 @@ pacman -S --noconfirm --needed \
|
||||||
pkg-config --exists gtk4 libadwaita-1 \
|
pkg-config --exists gtk4 libadwaita-1 \
|
||||||
|| die "gtk4/libadwaita invisible to pkg-config — are you in the MINGW64 shell?"
|
|| die "gtk4/libadwaita invisible to pkg-config — are you in the MINGW64 shell?"
|
||||||
|
|
||||||
say "building carrier (release; the first build takes a while)"
|
bash windows/bundle.sh
|
||||||
cargo build --release --locked || die "cargo build failed"
|
|
||||||
|
|
||||||
say "bundling the runtime"
|
|
||||||
rm -rf dist
|
|
||||||
mkdir -p dist/share/glib-2.0/schemas \
|
|
||||||
dist/share/icons/hicolor/512x512/apps \
|
|
||||||
dist/share/icons/hicolor/256x256/apps \
|
|
||||||
dist/share/icons/hicolor/128x128/apps
|
|
||||||
cp target/release/carrier.exe dist/
|
|
||||||
for dll in $(ldd target/release/carrier.exe | awk '/mingw64/ {print $3}'); do
|
|
||||||
cp "$dll" dist/ || die "copying $dll failed"
|
|
||||||
done
|
|
||||||
[ "$(ls dist/*.dll | wc -l)" -gt 0 ] || die "no DLLs collected — ldd found none under /mingw64"
|
|
||||||
cp /mingw64/share/glib-2.0/schemas/* dist/share/glib-2.0/schemas/
|
|
||||||
glib-compile-schemas dist/share/glib-2.0/schemas/
|
|
||||||
cp -r /mingw64/share/icons/Adwaita dist/share/icons/
|
|
||||||
cp -r /mingw64/share/icons/hicolor dist/share/icons/
|
|
||||||
cp data/icons/com.randogoth.carrier.png dist/share/icons/hicolor/512x512/apps/
|
|
||||||
cp data/icons/com.randogoth.carrier-256.png dist/share/icons/hicolor/256x256/apps/
|
|
||||||
cp data/icons/com.randogoth.carrier-128.png dist/share/icons/hicolor/128x128/apps/
|
|
||||||
|
|
||||||
say "zipping"
|
|
||||||
version=$(sed -n 's/^version = "\(.*\)"$/\1/p' Cargo.toml | head -1)
|
|
||||||
rm -f "carrier-windows-$version.zip"
|
|
||||||
(cd dist && zip -qr "../carrier-windows-$version.zip" .)
|
|
||||||
|
|
||||||
say "done — test with ./dist/carrier.exe (SmartScreen may ask once)"
|
say "done — test with ./dist/carrier.exe (SmartScreen may ask once)"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue