WarpEngine 0.7.0: a képtár és a CI is a hoszté, adapteren keresztül

Két dolog volt beépítve az engine-be, ami nem az övé.

A **képtár** eddig `WarpEngine::Image` volt, pedig a modell teljesen általános:
a teletypegames-ben a tagok arcképét is ez hordozza, nem csak a katalógus
borítóit. Az `Image` modell, a feltöltött fájlok, az `/api/image/:id` végpont
és az admin oldal ezért átkerült a hosztba, az engine pedig adapteren szól
hozzá (`WarpEngine::Images`): `url_for` adja a katalógus JSON `imageUrl`-jét,
`select_options` a software-form képválasztóját, `build_from_upload` a
"tölts fel új képet" ágat. Az alapértelmezés az `Image` osztály, tehát a
default útvonal bitre a régi. A `SoftwareImage` (a katalógus-kapcsolat)
maradt az engine-ben, és **az `images` tábla nem mozdult**: az engine csak
abbahagyta a létrehozását, a generátor írja meg hoszt-kódként.

A **CI** eddig végig Woodpecker volt: kliens, aláírás-ellenőrzés,
pipeline-receptek, repo-szinkron, secret-kiosztás. Mindez egy adapter mögé
került (`WarpEngine.ci`), a Woodpecker-implementáció pedig az engine-ben
maradt `WarpEngine::CI::Woodpecker` néven — kliens, adapter, httpsig-ellenőrző
és a platformonkénti pipeline-receptek, mert a YAML-dialektus a szolgáltatóé.
Az engine saját kódja már nem nevez szolgáltatót: `CI::Repo` és `CI::Run`
értékeket kap, `CI::ConnectionError`/`ApiError`/`NotConfigured` hibákat dob, a
`Pipeline` pedig `remote_repo_id`-t ad a történelmi `woodpecker_repo_id`
kolumna fölött (a tábla itt sem mozdult). `c.ci_adapter = :none` azt jelenti,
hogy ez a hoszt nem buildel: az `/api/ci/*` 503, a `/build/config` elutasít,
az admin akciók elbújnak.

Mindkét seam a hoszt initializerében van kimondva, nem alapértelmezésre
hagyva — a hoszt megnevezi, mi a képtára és mi a CI-ja.

Törés a 0.6-hoz képest: `image_container_path`, `image_owners`,
`ci_platforms`, `ci_update_server`, `ci_extension_public_key(_url)`,
`woodpecker_url`, `woodpecker_api_token`, `woodpecker_repo_owner` és a
`WarpEngine.woodpecker_configured?` megszűnt; a helyük `c.image_class_name` /
`c.image_adapter` és `c.ci_adapter`. Az `/api/ci/*` `latest_run`/`trigger`
válasza a normalizált `CI::Run` alakot adja (number, status, branch, message,
createdAt, url), a `pipelines` lista pedig `repo_id`-t is közöl a megtartott
`woodpecker_repo_id` mellett.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-08-23 00:56:01 +02:00
co-authored by Claude Opus 5
parent a0fbf1e2b4
commit 19d142ef64
62 changed files with 1391 additions and 793 deletions
+51
View File
@@ -0,0 +1,51 @@
require "rails_helper"
RSpec.describe WarpEngine::Images do
after { WarpEngine.config.image_adapter = nil }
describe "the default adapter" do
it "is the host model named in the configuration" do
expect(described_class.model_name).to eq("Image")
expect(described_class.model).to eq(Image)
end
it "serves images from the address the clients have always used" do
expect(described_class.url_for(7)).to eq("/api/image/7")
expect(described_class.url_for(nil)).to be_nil
end
it "offers the host's images to an admin select" do
image = create(:image, original_filename: "cover.png")
expect(described_class.select_options).to include([ "cover.png", image.id ])
end
it "builds a host image from an upload" do
expect(described_class.build_from_upload(nil)).to be_a(Image)
end
end
describe "a host adapter" do
it "decides where an image is served from" do
WarpEngine.config.image_adapter = Class.new do
def url_for(image_id) = "https://cdn.example.com/#{image_id}.png"
end.new
expect(described_class.url_for(9)).to eq("https://cdn.example.com/9.png")
end
end
it "links the catalog to the host's image model" do
expect(WarpEngine::SoftwareImage.reflect_on_association(:image).klass).to eq(Image)
end
it "puts the adapter URL in the catalog payload" do
software = create(:software)
image = create(:image)
WarpEngine::SoftwareImage.create!(software: software, image_id: image.id, is_default: true)
payload = WarpEngine::SoftwareSerializer.render_as_hash(software.reload)
expect(payload[:imageUrl]).to eq("/api/image/#{image.id}")
end
end