ci / gate (push) Canceled after 5m25s
Releases are batched, so a change on main could wait days for a package (#87). The gate now ends by building the bare release binary as the release workflow does, with the webview it already built embedded, and uploading it named for the commit, kept seven days. It is the last step so a red gate uploads nothing that could be mistaken for tested. Closes #87 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NUx7SPonBnB3ofU4mH41WT
121 lines
4.5 KiB
YAML
121 lines
4.5 KiB
YAML
name: ci
|
|
|
|
# The quality gate (architecture/generic.md §12): format, lint as error, tests,
|
|
# and a frontend that typechecks and builds. Packaging and release live in
|
|
# their own workflow once the packaging epic lands.
|
|
|
|
on:
|
|
push:
|
|
branches: [main]
|
|
pull_request:
|
|
|
|
concurrency:
|
|
group: ci-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
gate:
|
|
# `rust-gtk3`, not `rust`: tauri-build links against GTK and WebKitGTK dev
|
|
# libraries, which only that image carries (gitea-runners.md §3).
|
|
runs-on: rust-gtk3
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: webview dependencies
|
|
working-directory: ui
|
|
run: pnpm install --frozen-lockfile
|
|
|
|
- name: webview gate
|
|
working-directory: ui
|
|
run: |
|
|
set -euo pipefail
|
|
pnpm typecheck
|
|
pnpm lint
|
|
pnpm format:check
|
|
pnpm build
|
|
|
|
- name: rust gate
|
|
# --locked: a build that would change Cargo.lock fails rather than
|
|
# quietly resolving something new (#49).
|
|
run: |
|
|
set -euo pipefail
|
|
cargo fmt --check --all
|
|
cargo clippy --locked --workspace --all-targets -- -D warnings
|
|
cargo test --locked --workspace
|
|
|
|
- name: dependency policy
|
|
# deny.toml: licenses, advisories, bans and sources; machete: crates
|
|
# declared and never used. Both ship in the runner image (gongfoo
|
|
# runner-rust). The daily run in deps.yaml catches an advisory
|
|
# published against an unchanged lockfile (#49).
|
|
run: |
|
|
set -euo pipefail
|
|
cargo deny --version
|
|
cargo deny check
|
|
cargo machete
|
|
|
|
- name: rust talks to the webview through one file
|
|
# `ui/src/api/wallet.ts` is the only module allowed to import Tauri's
|
|
# IPC. A screen that reaches for `invoke` itself bypasses the typed
|
|
# client and its error mapping, and this is where that is caught.
|
|
run: |
|
|
set -euo pipefail
|
|
hits=$(grep -rl "@tauri-apps/api/core" ui/src || true)
|
|
if [ "$hits" != "ui/src/api/wallet.ts" ]; then
|
|
echo "Tauri IPC imported outside ui/src/api/wallet.ts:"; echo "$hits"; exit 1
|
|
fi
|
|
|
|
- name: dev node
|
|
# The chain adapter's integration tests run against a real
|
|
# `quantus-node --dev` from the pinned release (script/dev-node.sh).
|
|
# Started here, in the background, so the next step can use it; the
|
|
# runner is ephemeral, so nothing is cleaned up.
|
|
run: |
|
|
set -euo pipefail
|
|
script/dev-node.sh > dev-node.log 2>&1 &
|
|
for _ in $(seq 1 60); do
|
|
if curl -s -m 2 -H 'content-type: application/json' \
|
|
-d '{"jsonrpc":"2.0","id":1,"method":"system_chain","params":[]}' \
|
|
http://127.0.0.1:9944 | grep -q DevNet; then
|
|
echo "dev node up"; exit 0
|
|
fi
|
|
sleep 2
|
|
done
|
|
echo "dev node did not come up"; tail -50 dev-node.log; exit 1
|
|
|
|
- name: chain adapter against the dev node
|
|
env:
|
|
WALLET_DEV_NODE: ws://127.0.0.1:9944
|
|
# Only the tests that need a node; their names all end in
|
|
# `on_a_dev_node` or `on_dev_node`. Network tests against public
|
|
# nodes stay ignored here.
|
|
run: cargo test -p wallet-data -- --ignored dev_node
|
|
|
|
- name: generated types are current
|
|
# `cargo test` regenerates ui/src/api/generated via ts-rs. A diff here
|
|
# means an entities change was committed without its TypeScript.
|
|
run: git diff --exit-code -- ui/src/api/generated
|
|
|
|
- name: release binary
|
|
# The bare binary, as the release workflow builds it, so a change
|
|
# can be tried on a machine before any release is cut (#87). It
|
|
# embeds the webview built by the gate above (tauri.conf.json's
|
|
# frontendDist), and it wants the GTK/WebKitGTK libraries the rpm
|
|
# depends on. Last, so a red gate uploads nothing to mistake for
|
|
# tested.
|
|
run: |
|
|
set -euo pipefail
|
|
cargo build --locked --release -p wallet-app
|
|
mkdir -p artifact
|
|
install -m 0755 target/release/blackbeard-wallet \
|
|
"artifact/blackbeard-wallet-${GITHUB_SHA::7}-x86_64-linux-gnu"
|
|
(cd artifact && sha256sum * > SHA256SUMS)
|
|
ls -l artifact
|
|
|
|
- name: upload the binary
|
|
uses: actions/upload-artifact@v3
|
|
with:
|
|
name: blackbeard-wallet-${{ github.sha }}-x86_64-linux-gnu
|
|
path: artifact/
|
|
retention-days: 7
|