Nothing said whether a release was finished. A pipeline step can fail, a
platform can gain a target, a title can be published from a laptop — and the
catalog happily serves a release with three of its seven assets. The only way
to find out was to open `/api/softwares/<name>/builds` one name at a time.
$ bin/rails warp_engine:builds:check
rabbitroller ebitengine v1.1.1 1/7
[x] html
[ ] win_x86
[ ] win_x64
[ ] linux_x64
[ ] linux_arm64
[-] mac_x64
[-] mac_arm64
The CI can build these and the release does not have them:
rabbitroller v1.1.1 (ebitengine): win_x86, win_x64, linux_x64, linux_arm64
5 softwares, 5 releases, 14/32 assets present, 16 missing from CI-built kinds
The third marker is the point. Two different questions were being conflated:
what the **updater** can ingest (`Platform#expected_kinds`) and what the
**pipeline** actually produces. For six of the seven platforms they are the
same list; for ebitengine they are not — the updater accepts macOS builds, the
Woodpecker builder cannot cross-compile them (osxcross), so `mac_x64` and
`mac_arm64` would be reported as gaps on every ebitengine release, for ever.
`[ ]` is now a real gap and `[-]` is "upload it by hand or not at all", so the
list stays worth reading.
That knowledge is data, next to the templates that produce it:
`PipelineConfig::BUILT_KINDS`, reachable through the adapter as
`built_kinds(platform)`. An adapter that cannot answer — no CI configured, a
platform with no builder — returns nil, and then nothing is excused: every
missing kind counts as a gap.
`WarpEngine::AssetCoverage` computes it (`#rows`, `#missing_rows`, `#totals`)
and `AssetCoverageChecklist` renders it, so the numbers are testable without a
terminal. Options are env vars: NAME, PLATFORM, RELEASES=all, ONLY=missing, and
STRICT=1 for a non-zero exit in CI. The default is the newest release per
software, using the same non-`dev-` rule the catalog API uses for "latest".
33 new examples, including two that keep BUILT_KINDS honest: every claimed kind
has to be a kind the updater knows, and has to appear in the platform's rendered
pipeline. Adding a platform without teaching this list about it fails the suite.
Ships in 0.8.0.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
55 lines
1.7 KiB
Ruby
55 lines
1.7 KiB
Ruby
require "rails_helper"
|
|
|
|
RSpec.describe WarpEngine::CI::Woodpecker::PipelineConfig do
|
|
BUILT_KINDS = described_class::BUILT_KINDS
|
|
|
|
def self.fragment_for(kind)
|
|
case kind
|
|
when "html" then ".html.zip"
|
|
when "docs" then "-docs.zip"
|
|
when "cartridge", "source" then nil
|
|
else kind.tr("_", "-")
|
|
end
|
|
end
|
|
|
|
def config_for(platform)
|
|
described_class.new(platforms: { platform => { builder: "builder:latest", exporter: "exporter:latest" } })
|
|
end
|
|
|
|
it "knows every platform in the registry" do
|
|
expect(BUILT_KINDS.keys).to match_array(WarpEngine::Platform.names)
|
|
end
|
|
|
|
WarpEngine::Platform::NAMES.each do |platform|
|
|
context platform do
|
|
let(:kinds) { BUILT_KINDS.fetch(platform) }
|
|
let(:rendered) do
|
|
config_for(platform).render(platform: platform, name: "example", update_server: "https://example.test")
|
|
end
|
|
|
|
it "claims only kinds the updater knows how to ingest" do
|
|
expect(kinds - WarpEngine::Platform.find(platform).expected_kinds).to be_empty
|
|
end
|
|
|
|
it "claims only kinds the pipeline actually packages" do
|
|
kinds.each do |kind|
|
|
fragment = self.class.fragment_for(kind)
|
|
next if fragment.nil?
|
|
|
|
expect(rendered).to include(fragment), "#{platform}: nothing in the pipeline produces #{kind}"
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
describe "#built_kinds" do
|
|
it "answers with the kinds of a platform it has a builder for" do
|
|
expect(config_for("tic80").built_kinds("tic80")).to include("cartridge", "html", "win_x64")
|
|
end
|
|
|
|
it "answers nil for a platform with no builder configured, so nothing is excused" do
|
|
expect(config_for("tic80").built_kinds("godot")).to be_nil
|
|
end
|
|
end
|
|
end
|