Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
d9e3a64
test: bind release verifier to matrix artifact namespaces
seonghobae Aug 26, 2026
8511b52
fix: verify Windows release artifact namespace
seonghobae Aug 26, 2026
ca071cd
chore: converge release verifier onto current main
seonghobae Aug 26, 2026
7af3711
test: reject cross-platform release artifact placement
seonghobae Aug 26, 2026
ccd5e8d
fix: bind release artifacts to platform directories
seonghobae Aug 26, 2026
5637622
test: bind operational CLIs to release platform namespace
seonghobae Aug 26, 2026
db672bb
test: require exact tag release artifact verification
seonghobae Aug 26, 2026
5e7b33d
fix: verify tag artifacts before sbom
seonghobae Aug 26, 2026
f34ee44
docs: document release verifier test helpers
seonghobae Aug 27, 2026
ae79179
docs: document release workflow test helper
seonghobae Aug 27, 2026
4b96f17
docs: document release verifier shell helpers
seonghobae Aug 27, 2026
d932e32
chore(release): keep verifier shellcheck-clean
seonghobae Aug 28, 2026
b08c11c
fix: reconverge release artifact namespace verifier
seonghobae Aug 30, 2026
801cb20
chore(ci): re-run required review checks after contextual-orchestrato…
devin-ai-integration[bot] Aug 30, 2026
9303c75
test: require tag artifact namespace verification
seonghobae Aug 30, 2026
88820fa
fix: verify tag artifacts before provenance
seonghobae Aug 30, 2026
c095df7
test: bind tag verifier after artifact download
seonghobae Aug 30, 2026
42695f4
test: reject nested release bundle placement
seonghobae Aug 30, 2026
c81da76
fix: require exact release artifact depth
seonghobae Aug 30, 2026
64a30f9
docs: record Windows release artifact namespace RCA
seonghobae Sep 2, 2026
16a9936
docs: align release verifier RCA with current scope
seonghobae Sep 2, 2026
30e56fe
merge protected main into release verifier owner without losing contr…
seonghobae Sep 3, 2026
340fcfe
test: preserve tag release verifier contract
seonghobae Sep 3, 2026
8a99799
test(release): require one canonical artifact verifier
seonghobae Sep 3, 2026
10b2b83
fix(release): use one canonical artifact verifier
seonghobae Sep 3, 2026
ef8a518
test(release): inherit Cargo binary bundle contract
seonghobae Sep 3, 2026
76e2d59
test(release): inherit Tauri binary isolation contract
seonghobae Sep 3, 2026
dc3be87
test: align attestation contract with shared artifact verifier
seonghobae Sep 4, 2026
0e9db4b
fix(release): keep artifact identity stable across reruns
seonghobae Sep 4, 2026
a37a55e
docs(release): record failed-job rerun identity RCA
seonghobae Sep 4, 2026
84e44e0
refactor(release): name stable workflow-run identity precisely
seonghobae Sep 4, 2026
747e499
ci(test): bound Vitest workers on hosted runners
seonghobae Sep 4, 2026
e73c549
test(ci): guard Vitest worker budget
seonghobae Sep 4, 2026
b890fb1
chore(stack): adopt bounded Vitest worker prerequisite
seonghobae Sep 4, 2026
e26d8e3
ci(actions): bound superseded pull request runs
seonghobae Sep 4, 2026
23bb1b6
fix(ci): keep explicit reruns from cancelling newer PR validation
seonghobae Sep 4, 2026
58b1812
test(ci): cover rerun-safe workflow concurrency
seonghobae Sep 4, 2026
c197362
test(ci): run workflow concurrency contract in npm test
seonghobae Sep 4, 2026
04339f9
test(ci): pin Vitest production test scope
seonghobae Sep 4, 2026
756de7b
test(release): align retry contract with non-cancelling builds
seonghobae Sep 4, 2026
96ecdbe
docs(release): document non-cancelling release concurrency
seonghobae Sep 4, 2026
188d7b9
chore(stack): adopt rerun-safe CI prerequisite
seonghobae Sep 4, 2026
022887a
test(release): bind attestation contracts to run identity
seonghobae Sep 4, 2026
6afcf78
merge: adopt protected main #343 ancestry
seonghobae Sep 4, 2026
b8d2123
test(release): capture protected PR lifecycle contract
seonghobae Sep 4, 2026
66dd6a7
fix(release): reconcile protected PR lifecycle
seonghobae Sep 4, 2026
999d3a9
test(release): reconcile retry contract with protected lifecycle
seonghobae Sep 4, 2026
5c4eede
docs(release): describe trigger-aware PR cancellation
seonghobae Sep 4, 2026
674b545
test(ci): align release concurrency contract
seonghobae Sep 5, 2026
3e33229
test(release): align SBOM artifact identity
seonghobae Sep 5, 2026
06b33ac
test(release): reject empty bundle and checksum-valid empty CLI
seonghobae Sep 6, 2026
fea9144
fix(release): reject zero-byte artifacts before attestation
seonghobae Sep 6, 2026
a0668aa
test(ci): require exact-head test checkout
seonghobae Sep 7, 2026
50ad308
fix(ci): pin test checkouts to exact head
seonghobae Sep 7, 2026
90ca448
test(ci): bound exact-head checkout parser to one step
seonghobae Sep 7, 2026
235780c
chore(deps-dev): bump vitest from 4.1.11 to 5.0.0 (#349)
dependabot[bot] Sep 9, 2026
e6de6fd
feat: runtime-agnostic container orphan reclamation (docker/podman/co…
seonghobae Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
72 changes: 44 additions & 28 deletions .github/scripts/verify-release-artifacts.sh
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,47 @@
set -euo pipefail

artifact_root="${1:-release-artifacts}"
run_attempt="${2:-}"
run_identity="${2:-}"

if [[ -z "$run_attempt" || ! "$run_attempt" =~ ^[1-9][0-9]*$ ]]; then
printf 'run attempt must be a positive integer.\n' >&2
if [[ -z "$run_identity" || ! "$run_identity" =~ ^[1-9][0-9]*$ ]]; then
printf 'run identity must be a positive integer.\n' >&2
exit 1
fi
if [[ ! -d "$artifact_root" ]]; then
printf 'release artifact root is missing: %s\n' "$artifact_root" >&2
exit 1
fi

# Require exactly one regular bundle file directly inside its matrix-defined bundle directory.
require_exactly_one_path() {
local path_pattern="$1" label="$2" count=0 matched_path=""
while IFS= read -r -d '' matched_path; do count=$((count + 1)); done < <(find "$artifact_root" -type f -path "$path_pattern" -print0)
local directory="$1" file_pattern="$2" label="$3" count=0
if [[ -d "$artifact_root/$directory" ]]; then
while IFS= read -r -d '' _; do count=$((count + 1)); done < <(
find "$artifact_root/$directory" -mindepth 1 -maxdepth 1 -type f -name "$file_pattern" -print0
)
fi
if [[ $count -ne 1 ]]; then
printf 'Expected exactly one %s, found %s.\n' "$label" "$count" >&2
exit 1
fi
}

# Require exactly one named operational artifact directly inside its platform-scoped directory.
require_exactly_one_file() {
local file_name="$1" count=0 matched_path=""
while IFS= read -r -d '' matched_path; do count=$((count + 1)); done < <(find "$artifact_root" -type f -name "$file_name" -print0)
local directory="$1" file_name="$2" count=0
while IFS= read -r -d '' _; do count=$((count + 1)); done < <(
find "$artifact_root/$directory" -mindepth 1 -maxdepth 1 -type f -name "$file_name" -print0
)
if [[ $count -ne 1 ]]; then
printf 'Expected exactly one release artifact named %s, found %s.\n' "$file_name" "$count" >&2
printf 'Expected exactly one release artifact named %s in %s, found %s.\n' "$file_name" "$directory" "$count" >&2
exit 1
fi
}

expected_dirs=(
"release-disksage-ubuntu-22.04-${run_attempt}"
"release-disksage-windows-latest-${run_attempt}"
"release-disksage-macos-latest-${run_attempt}"
"release-disksage-ubuntu-22.04-${run_identity}"
"release-disksage-windows-2022-${run_identity}"
"release-disksage-macos-latest-${run_identity}"
)

mapfile -d '' top_level_entries < <(find "$artifact_root" -mindepth 1 -maxdepth 1 -print0 | sort -z)
Expand All @@ -55,22 +63,24 @@ if [[ -n "$unexpected_entry" ]]; then
exit 1
fi

require_exactly_one_path '*/bundle/deb/*.deb' 'Debian bundle'
require_exactly_one_path '*/bundle/appimage/*.AppImage' 'AppImage bundle'
require_exactly_one_path '*/bundle/msi/*.msi' 'Windows MSI bundle'
require_exactly_one_path '*/bundle/nsis/*.exe' 'Windows NSIS bundle'
require_exactly_one_path '*/bundle/dmg/*.dmg' 'macOS DMG bundle'
require_exactly_one_path "${expected_dirs[0]}/bundle/deb" '*.deb' 'Debian bundle'
require_exactly_one_path "${expected_dirs[0]}/bundle/appimage" '*.AppImage' 'AppImage bundle'
require_exactly_one_path "${expected_dirs[1]}/bundle/msi" '*.msi' 'Windows MSI bundle'
require_exactly_one_path "${expected_dirs[1]}/bundle/nsis" '*.exe' 'Windows NSIS bundle'
require_exactly_one_path "${expected_dirs[2]}/bundle/dmg" '*.dmg' 'macOS DMG bundle'

for required_name in \
disksage-cloud-plan-linux-x86_64 \
disksage-duplicate-audit-linux-x86_64 \
disksage-cloud-plan-windows-x86_64.exe \
disksage-duplicate-audit-windows-x86_64.exe \
disksage-cloud-plan-macos-arm64 \
disksage-duplicate-audit-macos-arm64; do
require_exactly_one_file "$required_name"
require_exactly_one_file "$required_name.sha256"
done
require_exactly_one_file "${expected_dirs[0]}" disksage-cloud-plan-linux-x86_64
require_exactly_one_file "${expected_dirs[0]}" disksage-cloud-plan-linux-x86_64.sha256
require_exactly_one_file "${expected_dirs[0]}" disksage-duplicate-audit-linux-x86_64
require_exactly_one_file "${expected_dirs[0]}" disksage-duplicate-audit-linux-x86_64.sha256
require_exactly_one_file "${expected_dirs[1]}" disksage-cloud-plan-windows-x86_64.exe
require_exactly_one_file "${expected_dirs[1]}" disksage-cloud-plan-windows-x86_64.exe.sha256
require_exactly_one_file "${expected_dirs[1]}" disksage-duplicate-audit-windows-x86_64.exe
require_exactly_one_file "${expected_dirs[1]}" disksage-duplicate-audit-windows-x86_64.exe.sha256
require_exactly_one_file "${expected_dirs[2]}" disksage-cloud-plan-macos-arm64
require_exactly_one_file "${expected_dirs[2]}" disksage-cloud-plan-macos-arm64.sha256
require_exactly_one_file "${expected_dirs[2]}" disksage-duplicate-audit-macos-arm64
require_exactly_one_file "${expected_dirs[2]}" disksage-duplicate-audit-macos-arm64.sha256

checksum_files=()
checksum_file=""
Expand Down Expand Up @@ -113,9 +123,15 @@ for checksum_file in "${checksum_files[@]}"; do
done

regular_file_count=0
matched_path=""
while IFS= read -r -d '' matched_path; do regular_file_count=$((regular_file_count + 1)); done < <(find "$artifact_root" -type f -print0)
while IFS= read -r -d '' _; do regular_file_count=$((regular_file_count + 1)); done < <(find "$artifact_root" -type f -print0)
if [[ $regular_file_count -ne 17 ]]; then
printf 'Unexpected release artifact entries: expected exactly 17 regular files, found %s.\n' "$regular_file_count" >&2
exit 1
fi

# Nonempty content is necessary for publication, but does not establish binary validity.
empty_artifact="$(find "$artifact_root" -type f -size 0 -print -quit)"
if [[ -n "$empty_artifact" ]]; then
printf 'Empty release artifact is not publishable: %s\n' "$empty_artifact" >&2
exit 1
fi
116 changes: 19 additions & 97 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ jobs:

- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 20
node-version: 22.12.0
- run: npm ci
- uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 # stable
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
Expand All @@ -117,7 +117,7 @@ jobs:
cache-targets: false

- name: Tauri build (with embedded LLM)
run: npm run tauri -- build --features llm-engine
run: node node_modules/@tauri-apps/cli/tauri.js build --features llm-engine

- name: Diagnose WiX MSI linker failure
if: failure() && matrix.os == 'windows-2022'
Expand Down Expand Up @@ -211,9 +211,10 @@ jobs:
- name: Upload release artifact set
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: release-disksage-${{ matrix.os }}-${{ github.run_attempt }}
name: release-disksage-${{ matrix.os }}-${{ github.run_id }}
path: ${{ matrix.bundles }}
if-no-files-found: error
overwrite: true

download-artifact-pr-compat:
if: github.event_name == 'pull_request'
Expand All @@ -229,12 +230,12 @@ jobs:
- name: Download exact release artifact set with v8
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: release-disksage-*-${{ github.run_attempt }}
pattern: release-disksage-*-${{ github.run_id }}
path: release-artifacts
merge-multiple: false
- name: Verify downloaded release artifact contract
shell: bash
run: bash .github/scripts/verify-release-artifacts.sh release-artifacts "${{ github.run_attempt }}"
run: bash .github/scripts/verify-release-artifacts.sh release-artifacts "${{ github.run_id }}"

attest-release:
if: startsWith(github.ref, 'refs/tags/')
Expand All @@ -251,16 +252,20 @@ jobs:
persist-credentials: false
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 20
node-version: 22.12.0
- uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 # stable

- name: Download exact release artifact set
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: release-disksage-*-${{ github.run_attempt }}
pattern: release-disksage-*-${{ github.run_id }}
path: release-artifacts
merge-multiple: false

- name: Verify downloaded release artifact contract
shell: bash
run: bash .github/scripts/verify-release-artifacts.sh release-artifacts "${{ github.run_id }}"

- name: Generate and validate source-bound SBOM
shell: bash
run: |
Expand All @@ -277,90 +282,6 @@ jobs:
node scripts/ci/generate-release-sbom.mjs \
--validate release-artifacts/sbom/disksage.spdx.json

- name: Verify release artifact checksums
shell: bash
run: |
set -euo pipefail
require_exactly_one_path() {
local path_pattern="$1" label="$2" count=0
while IFS= read -r -d ''; do count=$((count + 1)); done < <(find release-artifacts -type f -path "$path_pattern" -print0)
if [[ $count -ne 1 ]]; then
printf 'Expected exactly one %s, found %s.\n' "$label" "$count" >&2
exit 1
fi
}
require_exactly_one_file() {
local file_name="$1" count=0
while IFS= read -r -d ''; do count=$((count + 1)); done < <(find release-artifacts -type f -name "$file_name" -print0)
if [[ $count -ne 1 ]]; then
printf 'Expected exactly one release artifact named %s, found %s.\n' "$file_name" "$count" >&2
exit 1
fi
}
require_exactly_one_path '*/bundle/deb/*.deb' 'Debian bundle'
require_exactly_one_path '*/bundle/appimage/*.AppImage' 'AppImage bundle'
require_exactly_one_path '*/bundle/msi/*.msi' 'Windows MSI bundle'
require_exactly_one_path '*/bundle/nsis/*.exe' 'Windows NSIS bundle'
require_exactly_one_path '*/bundle/dmg/*.dmg' 'macOS DMG bundle'
for required_name in \
disksage-cloud-plan-linux-x86_64 \
disksage-duplicate-audit-linux-x86_64 \
disksage-cloud-plan-windows-x86_64.exe \
disksage-duplicate-audit-windows-x86_64.exe \
disksage-cloud-plan-macos-arm64 \
disksage-duplicate-audit-macos-arm64; do
require_exactly_one_file "$required_name"
require_exactly_one_file "$required_name.sha256"
done
checksum_files=()
checksum_file=""
while IFS= read -r -d '' checksum_file; do checksum_files+=("$checksum_file"); done < <(find release-artifacts -type f -name '*.sha256' -print0)
if [[ ${#checksum_files[@]} -ne 6 ]]; then
printf 'Expected six operational CLI checksum files, found %s.\n' "${#checksum_files[@]}" >&2
exit 1
fi
for checksum_file in "${checksum_files[@]}"; do
checksum_dir="$(dirname "$checksum_file")"
checksum_name="$(basename "$checksum_file")"
expected_asset_name="${checksum_name%.sha256}"
checksum_line="" line="" line_count=0
while IFS= read -r line || [[ -n "$line" ]]; do
line_count=$((line_count + 1))
checksum_line="$line"
done <"$checksum_file"
if [[ $line_count -ne 1 ]]; then
printf 'Checksum file %s must contain exactly one record.\n' "$checksum_name" >&2
exit 1
fi
recorded_digest="" recorded_name="" extra_field=""
read -r recorded_digest recorded_name extra_field <<<"$checksum_line"
if [[ ! "$recorded_digest" =~ ^[0-9a-fA-F]{64}$ ]] || [[ "$recorded_name" != "$expected_asset_name" ]] || [[ -n "$extra_field" ]]; then
printf 'Checksum file %s must reference its adjacent operational CLI %s exactly once.\n' "$checksum_name" "$expected_asset_name" >&2
exit 1
fi
if command -v sha256sum >/dev/null 2>&1; then
(cd "$checksum_dir" && sha256sum --check "$checksum_name")
elif command -v shasum >/dev/null 2>&1; then
(cd "$checksum_dir" && shasum -a 256 --check "$checksum_name")
else
printf 'No SHA-256 checksum verifier is available.\n' >&2
exit 1
fi
done
require_exactly_one_file disksage.spdx.json
node "$GITHUB_WORKSPACE/scripts/ci/generate-release-sbom.mjs" --validate "$(find release-artifacts -type f -name 'disksage.spdx.json' -print -quit)"
unexpected_entry="$(find release-artifacts -mindepth 1 ! -type d ! -type f -print -quit)"
if [[ -n "$unexpected_entry" ]]; then
printf 'Unexpected release artifact entries: non-regular path %s is not publishable.\n' "$unexpected_entry" >&2
exit 1
fi
regular_file_count=0
while IFS= read -r -d ''; do regular_file_count=$((regular_file_count + 1)); done < <(find release-artifacts -type f -print0)
if [[ $regular_file_count -ne 18 ]]; then
printf 'Unexpected release artifact entries: expected exactly 18 regular files, found %s.\n' "$regular_file_count" >&2
exit 1
fi

- name: Generate GitHub build provenance
uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 # v4.2.2
with:
Expand All @@ -369,10 +290,11 @@ jobs:
- name: Upload attested release SBOM
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: release-sbom-${{ github.run_attempt }}
name: release-sbom-${{ github.run_id }}
Comment thread
seonghobae marked this conversation as resolved.
path: release-artifacts/sbom/disksage.spdx.json
if-no-files-found: error
retention-days: 7
overwrite: true

publish-release:
if: startsWith(github.ref, 'refs/tags/')
Expand All @@ -384,14 +306,14 @@ jobs:
- name: Download attested release artifact set
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
pattern: release-disksage-*-${{ github.run_attempt }}
pattern: release-disksage-*-${{ github.run_id }}
path: release-artifacts
merge-multiple: false

- name: Download attested release SBOM
uses: actions/download-artifact@37930b1c2abaa49bbe596cd826c3c89aef350131 # v7.0.0
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: release-sbom-${{ github.run_attempt }}
name: release-sbom-${{ github.run_id }}
path: release-artifacts/sbom
- name: Publish attested artifacts to GitHub Release
uses: softprops/action-gh-release@3d0d9888cb7fd7b750713d6e236d1fcb99157228 # v3.0.2
Expand Down Expand Up @@ -440,7 +362,7 @@ jobs:
cache: true
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 20
node-version: 22.12.0
- run: npm ci
- uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 # stable
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
Expand All @@ -456,7 +378,7 @@ jobs:
shell: bash
run: echo "CMAKE_GENERATOR=Ninja" >> "$GITHUB_ENV"
- name: "Tauri build (GPU: CUDA [+ Vulkan on Linux] + dynamic backends)"
run: npm run tauri -- build --no-bundle --features "${{ matrix.features }}"
run: node node_modules/@tauri-apps/cli/tauri.js build --no-bundle --features "${{ matrix.features }}"
- name: Build engine smoke-test binary
run: cargo test --manifest-path src-tauri/Cargo.toml --release --no-run --features "${{ matrix.features }}" --lib
- name: List built shared libs (diagnostic)
Expand Down
19 changes: 17 additions & 2 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -30,23 +30,36 @@ on:
permissions:
contents: read

concurrency:
group: ${{ github.workflow }}-${{ github.repository }}-${{ github.event.pull_request.number || github.run_id }}
cancel-in-progress: ${{ github.event_name == 'pull_request' && github.run_attempt == 1 }}

jobs:
test:
runs-on: ubuntu-latest
timeout-minutes: 30
env:
CARGO_BUILD_JOBS: 2
CARGO_INCREMENTAL: 0
CARGO_PROFILE_TEST_DEBUG: 0
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Install Tauri system deps
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev
sudo apt-get install -y libwebkit2gtk-4.1-dev libgtk-3-dev libayatana-appindicator3-dev librsvg2-dev lsof
- uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 # stable
- uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2
with:
workspaces: src-tauri
cache-targets: false
- name: Configure private test temp
run: |
mkdir -p "$RUNNER_TEMP/disksage"
echo "TMPDIR=$RUNNER_TEMP/disksage" >> "$GITHUB_ENV"
- name: Rust tests (includes unix symlink test)
run: cargo test --manifest-path src-tauri/Cargo.toml
- name: Headless cloud planner tests
Expand All @@ -62,7 +75,7 @@ jobs:
cargo test --manifest-path src-tauri/Cargo.toml --features archive-cli --test archive_tree_help_exit
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
with:
node-version: 20.19.0
node-version: 22.12.0
- run: npm ci
- run: npm test
- run: npm run build
Expand All @@ -73,6 +86,7 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- uses: dtolnay/rust-toolchain@4be7066ada62dd38de10e7b70166bc74ed198c30 # stable
- name: Windows absolute-home regression
Expand All @@ -88,6 +102,7 @@ jobs:
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ github.event.pull_request.head.sha || github.sha }}
persist-credentials: false
- name: Install build deps (llama.cpp native + tauri)
run: |
Expand Down
Loading
Loading