125 Commits

Author SHA1 Message Date
Dylan M. Taylor 44a7db40b1 Merge pull request #106 from dylanmtaylor/docs/no-caller-jobs
docs: app workflows only call these shared workflows; app-specific checks move here
2026-11-01 01:06:51 -04:00
Dylan M. Taylor 75fbd9b7b5 Merge pull request #96 from g1obalworlds/fix/supply-chain-gh-repo
supply-chain: name the repository for the SBOM upload
2026-11-01 01:06:07 -04:00
Dylan M. Taylor 40191f5daf Merge pull request #112 from storytold/fix/flatpak-eu-strip
fix(flatpak): install elfutils so flatpak-builder can eu-strip modules
2026-11-01 01:05:04 -04:00
Dylan M. Taylor 7ee7f15d22 Merge branch 'main' into fix/flatpak-eu-strip 2026-11-01 01:04:49 -04:00
Dylan M. Taylor 817ac1cb88 Merge pull request #99 from g1obalworlds/sonar-shard-exclude-tests
sonarcloud: leave test code out of sharded coverage, as cargo llvm-cov does
2026-11-01 01:03:24 -04:00
Dylan M. Taylor 09a83a41f5 Merge pull request #101 from ZIDAN44/fix/arch-xkbcommon-x11
fix(arch-package): depend on libxkbcommon-x11, without which the window can't open
2026-11-01 01:02:40 -04:00
Dylan M. Taylor 925395fde6 Merge pull request #107 from storytold/dependabot/github_actions/actions-a6a2a90062
ci(deps): bump the actions group across 1 directory with 2 updates
2026-11-01 01:01:19 -04:00
Dylan M. Taylor 2ce6aa59c7 Merge pull request #110 from nanox333/codex/release-contributor-refresh
Release: refresh contributor credits automatically before builds
2026-11-01 01:00:55 -04:00
Dylan M. Taylor 841376d7a9 Merge pull request #119 from storytold/ci/gate-optional-packages
feat(gate): packages is optional; an empty list installs none
2026-11-01 00:59:32 -04:00
dependabot[bot] 7d24ca64b1 ci(deps): bump the actions group across 1 directory with 2 updates
Bumps the actions group with 2 updates in the / directory: [taiki-e/install-action](https://github.com/taiki-e/install-action) and [SonarSource/sonarqube-scan-action](https://github.com/sonarsource/sonarqube-scan-action).


Updates `taiki-e/install-action` from 2.87.33 to 2.88.0
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](https://github.com/taiki-e/install-action/compare/645d1ab48b3cb8591684a8b730b2ccf4cb3f9568...86f7a0ffb25f40114606501a311ebcfaf882ea32)

Updates `SonarSource/sonarqube-scan-action` from 8.3.0 to 8.4.0
- [Release notes](https://github.com/sonarsource/sonarqube-scan-action/releases)
- [Commits](https://github.com/sonarsource/sonarqube-scan-action/compare/d209202bc7d53ff1cc128f7f907dac145c9d6ae9...4d1dc0c91ee400dcf8a6dddf2f705ac36542e304)

---
updated-dependencies:
- dependency-name: SonarSource/sonarqube-scan-action
  dependency-version: 8.4.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
- dependency-name: taiki-e/install-action
  dependency-version: 2.87.32
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-11-01 04:35:59 +00:00
FredApps 52dc54c75e ci: pin install-action v2.87.33, the first that knows cargo-nextest 0.9.150 (#122)
v2.87.29 knows nextest only up to 0.9.148, so every gate and coverage run that installs the
pinned cargo-nextest@0.9.150 fell back to cargo-binstall@latest: an unpinned download, then a
binstall of nextest. v2.87.33 is the oldest release whose manifest has 0.9.150; the releases
since v2.87.29 change only tool manifests.

Co-authored-by: FredApps <FredApps@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 05:32:27 +01:00
Dylan M. Taylor c926ea426a fix: retry macOS release verification (#121) 2026-10-31 23:58:50 -04:00
Dylan M. Taylor 37960c37b5 fix: pass Linux tarball to Flatpak OCI publishing (#120) 2026-10-31 23:50:07 -04:00
FredApps 0cb1ecf84c docs(gate): spell out os and targets in the second-call example
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 04:46:49 +01:00
FredApps c1f5c18c01 feat(gate): packages is optional; an empty list installs none
Calls with nothing to install from apt (a Windows-only check, a wasm build) had to pass a package
list the gate would ignore or install for nothing. packages now defaults to empty, and the apt step
runs only on Linux legs that name packages. The README describes such second gate calls, with
their own command and cache-version, instead of keeping web builds in the app's own workflow:
the apps' CI rules now allow only calls to shared workflows (#118).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 04:26:35 +01:00
FredApps e031880d47 fix(install-apt-packages): time-limit and retry mirror downloads (#117)
* fix(install-apt-packages): time-limit and retry mirror downloads

A SonarCloud job in vectorcraft (run 41253493430) sat in this step for 58 minutes: the Azure
Ubuntu mirror timed out, apt fell back to archive.ubuntu.com, then a connection went silent and
apt printed nothing until the run was cancelled. Acquire::http::Timeout doesn't end a connection
that stays open, so the job's 90-minute timeout was the only bound.

apt-get update and a new --download-only pass now each run under timeout(1), 300 s per attempt,
up to 3 attempts. The install itself then works from downloaded files only, so dpkg is never
killed mid-configure. Acquire::https::Timeout is set alongside the http one for the HTTPS fallback.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* fix(install-apt-packages): retry an update that fetched only some indexes

apt-get update warns and exits 0 when an index fails to download, so the retry never ran for
it. APT::Update::Error-Mode=any makes that a failure, which is retried. If indexes are still
missing after the last attempt the step continues with a warning, as it did before: they often
belong to a repository the packages don't need, and a package that needs one fails the download.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: FredApps <FredApps@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 02:05:24 +01:00
FredApps 84ad881711 ci(windows-arm64): only main saves the packaging cache (#116)
Pull requests that touch Windows packaging saved their own windows-arm64-package cache (about
0.7 GB), visible only to that pull request. Every app repository is at the 10 GB cache limit,
so each one evicted a cache main's gate restores. The nightly run on main still saves it.

Co-authored-by: FredApps <FredApps@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-01 01:39:08 +01:00
Dylan M. Taylor 09f920c3f4 feat: add Flatpak OCI repository scaffolding script and tests (#115) 2026-10-31 15:43:24 -04:00
Dylan M. Taylor 5cd19d05cb ci(flatpak): publish Flatpak OCI layout to GHCR alongside Flatpak builds (#113) 2026-10-31 15:33:04 -04:00
Brandon Thomas 5d6a81953e fix(flatpak): install elfutils so flatpak-builder can eu-strip modules
flatpak-builder only Recommends elfutils, which --no-install-recommends skips. Apps whose
manifests now build cups-client from source (gridcraft, designcraft, wordcraft, pdfcraft) fail
in the Flatpak job with: Failed to execute child process "eu-strip".

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-30 23:14:08 -04:00
Kristian Myram b97dadbcbe docs(release): clarify contributor refresh caller permissions 2026-10-30 21:28:16 +01:00
Kristian Myram 215a7f48c1 fix(release): exclude contributor snapshots from release assets 2026-10-30 18:00:34 +01:00
Kristian Myram 3cb27117d0 Release: support automatic contributor snapshot refresh 2026-10-30 14:36:32 +00:00
FredApps 2b3fb9dc05 ci: preserve dependency cache reuse across root manifest updates (#108)
* ci: preserve dependency cache reuse across root manifest updates

* docs: align gate cache overview with profile keys and dispatch opt-in
2026-10-30 07:47:08 -04:00
Dylan M. Taylor 2959c0cdc8 docs: app workflows only call these shared workflows; app-specific checks move here
App repos' .github/workflows/ should only call craft-common-actions at @main, so CI
is the same across the Craft apps. gate.yml and the README said app-only jobs
(fuzzing, corpora, web builds, Windows installer probes) stay in the caller; they
now belong here as shared workflows or inputs, and move without being dropped.
2026-10-29 20:25:40 -04:00
Dylan M. Taylor fa5ef18780 Build FreeBSD aarch64 release archives by default (#104)
* ci(release): build FreeBSD aarch64 archives by default

app packaging/freebsd/package.sh scripts now honor CARGO_BUILD_TARGET, so
aarch64 is no longer opt-in: freebsd-architectures defaults to
'["x86_64","aarch64"]'. Callers can still narrow it to x86_64 only.

* docs(readme): FreeBSD aarch64 is in the default freebsd-architectures
2026-10-28 15:49:07 -04:00
aiongg 41e0b4e097 fix(freebsd): install cmake-core, which the quarterly package set still has (#103)
The aarch64 job uses FreeBSD's quarterly packages, which since 2026-10-28 have no `cmake` meta-package, only `cmake-core`. `pkg install cmake` failed and stopped every app's release build. `cmake-core` is in both the quarterly and latest sets.
2026-10-28 14:10:16 -04:00
Zinadin Zidan 230d71cc34 test(arch-package): a docstring for the libxkbcommon-x11 test
The test's explanation was a comment; it's the method's docstring now, as CodeRabbit's
docstring-coverage check asks. No change to what it checks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 03:53:01 +06:00
Zinadin Zidan d5a8872113 fix(arch-package): depend on libxkbcommon-x11, without which the window can't open
The apps build winit's X11 backend, and the Craft apps' winit (storytold/winit a517b38)
loads libxkbcommon-x11 when it sets up the keyboard on X11 or XWayland: without it the app
panics at start ("Library libxkbcommon-x11.so could not be loaded"). Arch ships it as its own
package, apart from libxkbcommon, and the package only depended on libxkbcommon, so on a
system without it (a fresh install, a minimal or Wayland-first desktop) every Craft app's
Arch package started and couldn't open its window. PhotoCraft hit the same panic on its deb
(photocraft#201) and fixed its own nfpm.yaml; the shared Arch package never got it.

libxkbcommon-x11 is now in depends. A test checks the generated PKGBUILD.

Checked on a clean archlinux container with a Craft app's release tarball, under Xvfb: the
package built by main installs without libxkbcommon-x11 and the window fails with that error;
the one built with this change pulls in libxkbcommon-x11 1.13.2 and the window runs. The
unit tests pass on Ubuntu 24.04 as in test-freebsd.yml (155, 28 skipped), and test_arch
passes on Arch with makepkg, end-to-end build included; shellcheck is clean.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-28 03:39:41 +06:00
Jeremy 8bb4e5ab95 fix(ci): separate ARM64 install paths and scope (#100)
* fix(ci): separate ARM64 install paths and installation scope

* test(ci): exercise ARM64 installer contract fixtures on Windows
2026-10-27 15:45:39 -04:00
g1obalworlds 0e8822f295 sonarcloud: leave test code out of sharded coverage, as cargo llvm-cov does
cargo llvm-cov adds its own exclusions to --ignore-filename-regex: tests/,
examples/ and benches/ directories and tests.rs / *_tests.rs files. The
sharded merge (the default since #87) calls llvm-cov export directly with
only (vendor|xtask)/, so integration tests and src/**/tests.rs reached
lcov.info as almost fully covered source, and coverage moved when a caller
switched between shards: 1 and the default. Put those exclusions in the
shared regex; the unsharded run already applies them.
2026-10-26 17:16:25 -07:00
g1obalworlds 03a637cbc0 supply-chain: name the repository for the SBOM upload
The attest job has no checkout, so `gh release upload` had no git remote to
find the repository from and failed with "not a git repository" after the
attestations were already published. Pass GH_REPO, as draft-release does.
2026-10-26 17:00:22 -07:00
skylar taylor-barrick 86bc2ce420 Merge pull request #95 from storytold/fix/nextest-0.9.150
ci: pin nextest to 0.9.150
2026-10-26 16:37:11 -06:00
skylar b97d27ffa3 test: cover nextest installer aliases
Reject affected alias installers and duplicate selectors in the pin inventory.
2026-10-26 16:20:05 -06:00
skylar d07589f3fe ci: pin nextest to 0.9.150
Use the fixed release for GHSA-vc25-qg58-w57c.
2026-10-26 14:13:00 -06:00
skylar taylor-barrick be6bbf3ca5 Provision fonts and optional Python coverage for Sonar (#88)
* Provision coverage fonts for archive builds and test runners

* Keep coverage fonts optional unless a pin is requested

* Pin nested actions used by coverage jobs

* Export the font path only after a requested checkout

* Measure optional Python tooling coverage in Sonar

* ci: restore craft-common-actions tracking main

* ci: share Python coverage configuration with XML reporting
2026-10-25 23:37:12 -04:00
Dylan M. Taylor 452c0b419f sonarcloud: exclude i18n tables from duplication checks (#91) 2026-10-25 21:20:17 -04:00
Dylan M. Taylor 07683e249a sonarcloud: unpack the coverage archive outside the workspace (#90) 2026-10-25 21:17:09 -04:00
Dylan M. Taylor e3814b3ec2 sonarcloud: fail a shard that cannot run its tests instead of scanning empty coverage (#89) 2026-10-25 19:49:55 -04:00
Dylan M. Taylor 395270d2c0 sonarcloud: optionally shard Rust coverage across parallel nextest partitions (#87)
* sonarcloud: optionally shard Rust coverage across parallel nextest partitions

* sonarcloud: default coverage to four shards

* sonarcloud: build the instrumented archive once and shard tests from it

* sonarcloud: skip sharded scan steps when the plan job produces no shards

* sonarcloud: validate shard count, pin the archive's toolchain, merge only test binaries
2026-10-25 18:54:59 -04:00
Dylan M. Taylor 6182ccebfd Raise the default SonarCloud job timeout to 90 minutes (#86) 2026-10-25 17:05:09 -04:00
Dylan M. Taylor d4d0d33284 Merge pull request #85 from storytold/codex/egui037-sonar-timeout-20261025
Allow callers to budget longer Sonar coverage jobs
2026-10-25 16:48:56 -04:00
skylartaylor d74cca0665 Allow callers to budget longer Sonar coverage jobs 2026-10-25 21:45:03 +01:00
Dylan M. Taylor 2b4eb2c6d9 Merge pull request #83 from dylanmtaylor/security/workflows-hardening
security(workflows): strengthen SonarCloud project-key and FreeBSD architecture input validation (F-005, F-006, F-007, F-009, F-010)
2026-10-24 22:48:54 -04:00
Dylan M. Taylor e84f24ac6b Merge pull request #82 from dylanmtaylor/security/action-inputs-validation
security(actions): harden apt package and resolve-version input handling (F-003, F-004)
2026-10-24 22:48:50 -04:00
Dylan M. Taylor ef752f1e72 Merge pull request #81 from dylanmtaylor/security/arch-package-hardening
security(arch-package): harden metadata serialization and license path validation (F-001, F-002, F-008)
2026-10-24 22:48:47 -04:00
Dylan M. Taylor 7b38cb1f31 test(resolve-version): add test for CRLF sanitization in app-title 2026-10-24 22:46:59 -04:00
Dylan M. Taylor 85f7365b1c fix(arch-package): preserve SPDX license expression and copy licenses with --remove-destination
- Preserve full SPDX expression as a single shell-quoted array element in PKGBUILD license
- Use cp --remove-destination to replace any destination symlink when copying license files
- Update test_pkgbuild_and_makepkg_conf_safe_serialization test assertion to expect preserved expression
2026-10-24 22:45:48 -04:00
Dylan M. Taylor 58e2894843 security(workflows): strengthen SonarCloud project-key and FreeBSD architecture input validation (F-005, F-006, F-007, F-009, F-010)
- Restrict SonarCloud project-key grammar to start with an alphanumeric/underscore, reject leading hyphens/flags, and enforce 400 character length limit (F-006)
- Verify Nix extra-args argument parsing without eval (F-005)
- Verify Windows ARM64 PowerShell environment variable passing and path component sanitization (F-007)
- Add unit test verifying FreeBSD workflow architecture pre-validation rejects invalid architectures and injection payloads prior to VM execution (F-009)
- Verify FreeBSD custom-test-command environment data passing (F-010)
2026-10-24 22:44:09 -04:00
Dylan M. Taylor 80908a10c8 security(actions): harden apt package and resolve-version input handling (F-003, F-004)
- Disallow carriage returns and newlines upfront in resolve-version to prevent GitHub output-file protocol forgery
- Strictly validate generated build date against YYYY-MM-DD format
- Sanitize APP_TITLE against carriage returns and newlines in step summary
- Validate package tokens in install-apt-packages, rejecting options, path traversals, and injection payloads
- Terminate options with -- when invoking apt-get install
- Add unit tests for install-apt-packages validation and new test suite for resolve-version
2026-10-24 22:42:14 -04:00