Commit Graph
111 Commits
Author SHA1 Message Date
Dylan M. Taylor a5eda472ea feat(docker-build): support Docker Hub registry alongside DOCR and GHCR (#179) 2026-11-08 19:33:37 -05:00
Dylan M. Taylor 3b3ea7ed62 feat(release): dual-push Flatpak OCI layouts to Docker Hub (#178)
* feat(release): dual-push Flatpak OCI layouts to Docker Hub

* fix(release): derive Docker Hub repo name from REGISTRY
2026-11-08 19:11:04 -05:00
FredApps 8fb29161c2 fix(sonar): reduce sharded coverage disk usage (#174)
* fix(sonar): bound sharded coverage disk usage

* test(signing): detect restricted GPG agent sockets
2026-11-08 14:15:27 +01:00
Dylan M. Taylor 8e9b8b96c5 fix: support rpm 4.20+ signing and pin release job to ubuntu-24.04 (#175)
* fix(draft-release): use rpmsign --resign to support RPM 4.20+

* fix(release): run Draft GitHub Release on ubuntu-24.04
2026-11-07 20:48:33 -05:00
Dylan M. Taylor 626427bb5f Build without provenance so digests match across registries (#173)
An attestation names the repository it was pushed to, so DOCR and GHCR received
different digests and the merge job could only tag one of them.
2026-11-07 15:22:47 -05:00
Dylan M. Taylor a9cdd6881c Push every image by digest in the docker build (#172)
buildx pushes a by-digest output to one repository per invocation, so with two
imagerepositories only the last one received the manifest and the merge job failed
with "not found". Loop over the image list and assert the digests agree.
2026-11-07 15:18:14 -05:00
Dylan M. Taylor 4acf645c17 Give the composed build output its image type (#171)
buildx requires a `type=` prefix in `outputs`; without it every caller failed
with "type is required for output" before the first layer was built.
2026-11-07 15:13:09 -05:00
Dylan M. Taylor 18c197bc08 Add a reusable docker build workflow (#170)
Builds every platform in `platforms` by digest into each repository in `images`,
then joins those digests into one multi-arch manifest per repository, logging in
to DOCR, GHCR or dhi.io only when an image needs it. It carries the inputs both
craft web images need: a custom Dockerfile and stage, build args, a GHA layer
cache, preinstalled-SDK pruning, and a hook for preparing large build contexts
such as the font sources.
2026-11-07 14:29:07 -05:00
Dylan M. Taylor 3e2ac193fd feat: drop Windows 32-bit builds (#163)
Drops i686-pc-windows-msvc (x86) builds from the Windows release matrix, retaining 64-bit x64 and arm64 targets.
2026-11-06 21:27:06 -05:00
dependabot[bot] 91428662bf ci(deps): bump the actions group with 2 updates (#154)
Bumps the actions group with 2 updates: [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.89.1 to 2.90.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/682ce6c3c696a4cd5168a05f98e51aa02b877941...b80e2bb2635f28eb98b9fce1e2f0887e1535c6b2)

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

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-06 07:36:43 -05:00
nnaannooandnnaannoo 13f3c2c99b release.yml: export each app's build variables from its env.sh, so a new app needs no change here (#148)
* release.yml: export each app's build variables from its env.sh, not a list

Eight release jobs set <APP>_VERSION, <APP>_BUILD_DATE and <APP>_BUILD_SHA for
every app by name (298 lines), and the FreeBSD VM step listed them all again,
so every new app meant editing this workflow. materialcraft and texturecraft
were never added: their packaging reads MATERIALCRAFT_* and TEXTURECRAFT_*,
so their release builds got no release version, date or commit, and a
dispatched run with a version override packaged them under Cargo.toml's.

actions/export-app-build-env reads the prefix the app's packaging/env.sh (or
packaging/common.sh) already declares in VERSION="${<PREFIX>_VERSION:-...}",
falling back to app-name in capitals, and writes the three variables to
GITHUB_ENV; its names output feeds the FreeBSD VM's envs. Each job runs it
right after checkout. On all 17 apps' env.sh it finds the prefix the old
list used.

Tests run the script on sample env.sh files and check release.yml sets no
app's variable by name, so the list can't come back.

* Export the build variables after the contributor snapshot, which must follow the checkout

test_contributor_refresh requires each build job to load the contributor snapshot directly after checkout, so the export step goes after it when a job has one. Also fix the line-break test passing a variable twice.

---------

Co-authored-by: nnaannoo <n4nosaur@gmail.com>
2026-11-06 07:36:30 -05:00
FredAppsandCursor 70fc5d4964 Check that AGENTS.md copies the shared house rules.
The writer and the checker share one normalization. A rewritten digest does not make an edit pass, an intact older copy warns only when main has moved on, and a source that cannot be read is reported as could not check.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-11-06 11:34:30 +01:00
dependabot[bot] 9bcbea6fa2 ci(deps): bump taiki-e/install-action (#134)
Bumps the actions group with 1 update in the / directory: [taiki-e/install-action](https://github.com/taiki-e/install-action).


Updates `taiki-e/install-action` from 2.88.1 to 2.89.1
- [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/68a389c788b2cd04016ce8c80ee23b80d2ab3d68...682ce6c3c696a4cd5168a05f98e51aa02b877941)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.89.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-11-05 09:13:33 -05:00
nnaannooandKristian Myram 4d1066685f Add git-sources.yml: the shared "Git dependencies come from storytold" check (#147)
Eight apps paste the same 25-line job into ci.yml, nix.yml or release.yml (ten
copies): Cargo.lock exists and is up to date, no .cargo/config(.toml)
replaces, patches or overrides a source, and every git dependency comes from
github.com/storytold. Apps' workflows are meant to only call workflows here.

actions/check-git-sources holds the check as a tested script, and
git-sources.yml runs it on a credential-less checkout, so an app swaps its
job for one `uses:` line and keeps `needs: git-sources`. It reports every
problem rather than the first, as GitHub error annotations, and treats
unreadable TOML as a failure. On all 18 apps' current Cargo.lock and Cargo
config it agrees with the inline copy.

Co-authored-by: Kristian Myram <kmy@oresundsbron.com>
2026-11-05 09:13:01 -05:00
nnaannooandKristian Myram 6b66469bba Push the Flatpak OCI tags in the release workflow, not the app's script (#146)
The release job ran each app's packaging/linux/flatpak-oci.sh --push. Most
apps still carry the copy from before scripts/scaffold-flatpak-oci.sh learnt
to guard the stable tag, and it moves stable-<arch> on every push, so a
prerelease or a test run dispatched from any branch became what stable-<arch>
clients install. 15 of the 17 apps carry that copy.

Call the script without --push, which only builds the layout in every copy,
and push from the workflow: <version>-<arch> on every non-PR run, and
stable-<arch> only for a stable version built from the release branch, the
rule the scaffold template already uses. No app needs to change.

Co-authored-by: Kristian Myram <kmy@oresundsbron.com>
2026-11-05 09:12:05 -05:00
FredApps bb16e4122a gate.yml: optional gate-timeout-minutes stops a hung gate with a process list and a clear error (#143)
CI green; CodeRabbit rate-limited with no findings; 0 review threads.
2026-11-05 11:27:56 +01:00
FredApps 0755fd19c7 Add changed-paths.yml: run a job only when its paths change or a label asks (#142)
* Add changed-paths.yml: run a job only when its paths change or a label asks

* changed-paths: read paths NUL-separated, keep the reason on one line; README: what the checkout holds
2026-11-05 11:12:34 +01:00
Dylan M. Taylor afdca5e673 Run the Linux release jobs in the release environment so they can sign (#141) 2026-11-04 18:48:38 -05:00
Dylan M. Taylor 1d21484600 Sign the RPM packages in the Linux packaging jobs (#138)
* Sign RPM packages in the Linux packaging jobs

* Sign RPM packages in the Linux packaging jobs
2026-11-04 18:02:43 -05:00
Dylan M. Taylor e78816ca65 ci: install WebKitGTK for Sonar coverage builds 2026-11-04 10:00:47 -05:00
Dylan M. Taylor d43ee91f82 ci: install libsoup for Sonar coverage builds 2026-11-04 09:56:06 -05:00
Dylan M. Taylor 7987c57447 ci: prefer org SonarCloud PAT 2026-11-04 09:53:55 -05:00
Kristian Myram 4b2457cec2 Merge main and resolve workflow test trigger conflicts 2026-11-03 12:30:26 +00:00
Dylan M. Taylor f76b6b82d2 Fix Linux signing rollout and review findings 2026-11-03 00:00:15 -05:00
Dylan M. Taylor 4da08b882e Merge pull request #98 from g1obalworlds/ci/run-tests-for-every-tested-file
ci: run the unit tests when any workflow or action they cover changes
2026-11-02 22:29:15 -05:00
Dylan M. Taylor 96b8516a40 feat(release): sign every Linux package format with LINUX_SIGNING_KEY
A new optional LINUX_SIGNING_KEY secret (an unprotected OpenPGP signing subkey, from the
release environment) signs each Linux format the way its tools check it:

- rpm: embedded signature (rpmsign), for `rpm -K` and dnf/zypper gpgcheck
- deb: embedded _gpgorigin member (debsigs) and a detached .asc
- Arch: <file>.sig, which pacman looks for
- AppImage, tar.gz, zsync: detached .asc
- Flatpak bundle: signed commit and embedded public key (flatpak-bundle.sh, via the
  scaffold's new step 4), so `flatpak install` verifies it, plus a detached .asc
- Flatpak OCI image: a containers/image signature for ghcr.io/<repo>@<digest>, which Flatpak
  checks from its signature lookaside; the flatpak job records the pushed manifest for it
- SHA256SUMS.txt.asc over every release asset, and release-signing-key.asc

The draft-release action signs before computing checksums (embedded signatures change the rpm
and deb files) and verifies every signature against the exported public key. The new
import-signing-key action is shared by the flatpak and release jobs and refuses a key that
needs a passphrase. Without the secret, releases are published unsigned with a warning.
2026-11-02 20:55:58 -05:00
dependabot[bot] 23552e0010 ci(deps): bump taiki-e/install-action
Bumps the actions group with 1 update: [taiki-e/install-action](https://github.com/taiki-e/install-action).


Updates `taiki-e/install-action` from 2.88.0 to 2.88.1
- [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/86f7a0ffb25f40114606501a311ebcfaf882ea32...68a389c788b2cd04016ce8c80ee23b80d2ab3d68)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.88.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: actions
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-11-02 11:16:45 +00:00
g1obalworlds 0a8bd343f6 Merge remote-tracking branch 'upstream/main' into ci/run-tests-for-every-tested-file
# Conflicts:
#	.github/workflows/test-freebsd.yml
2026-11-01 09:52:33 -08:00
Kristian Myram 65bc9298e4 feat(release): provide the shared contributor snapshot generator 2026-11-01 13:59:31 +01:00
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 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 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
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
FredAppsandClaude Opus 5.5 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
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 5cd19d05cb ci(flatpak): publish Flatpak OCI layout to GHCR alongside Flatpak builds (#113) 2026-10-31 15:33:04 -04:00
Brandon ThomasandClaude Opus 5.5 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 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