The engine's 180 specs were never run by CI: the mirror repo is generated by a subtree split, so a pipeline committed there would be overwritten on the next sync, and the monorepo's own pipeline only mirrored and published. A broken engine could reach the gem registry. The test now gates both — it runs on the same trigger the mirror does (a change under libs/ruby/warp_engine), and the steps after it only run if it passes. The specs need MySQL, hence the service, and a prepared test database: on a fresh database maintain_test_schema! reports the engine's own migrations as pending instead of loading the schema. Verified by running the step as written in a clean ruby:3.2 container against a fresh mysql:8 — 180 examples, 0 failures. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
93 lines
3.1 KiB
YAML
93 lines
3.1 KiB
YAML
# Read-only split mirror: a libs/ruby/warp_engine alkönyvtárat kitükrözi a
|
|
# engines/warp_engine repóba (fejlesztés itt, a monorepóban történik; a tükör
|
|
# csak publikálásra való). Tag-elt release (warp_engine-v*) esetén a gem a
|
|
# Forgejo rubygems registry-be is felmegy.
|
|
#
|
|
# Szükséges Woodpecker secret: forge_token — Forgejo access token
|
|
# repository:write (engines/warp_engine) és package:write joggal.
|
|
|
|
when:
|
|
- event: push
|
|
branch: master
|
|
path: "libs/ruby/warp_engine/**"
|
|
- event: manual
|
|
- event: tag
|
|
ref: refs/tags/warp_engine-v*
|
|
|
|
clone:
|
|
git:
|
|
image: woodpeckerci/plugin-git
|
|
settings:
|
|
partial: false
|
|
depth: 0 # a subtree splithez teljes history kell
|
|
|
|
services:
|
|
- name: mysql
|
|
image: mysql:8
|
|
environment:
|
|
MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
|
|
MYSQL_DATABASE: warp_engine_test
|
|
|
|
steps:
|
|
# A motor tesztje kapuzza a tobbit: ha bukik, se a tukrozes, se a gem
|
|
# kiadasa nem fut le. A mirror repoba nincs ertelme CI-t tenni, mert azt a
|
|
# subtree split minden alkalommal feluliria.
|
|
test-engine:
|
|
image: ruby:3.2
|
|
environment:
|
|
RAILS_ENV: test
|
|
DB_HOST: mysql
|
|
commands:
|
|
- apt-get update && apt-get install -y --no-install-recommends default-libmysqlclient-dev
|
|
- cd libs/ruby/warp_engine
|
|
- bundle install --jobs 4
|
|
- |
|
|
echo "==> Varakozas a mysql-re"
|
|
for i in $(seq 1 60); do
|
|
if mysqladmin ping -h mysql --silent 2>/dev/null; then break; fi
|
|
sleep 2
|
|
done
|
|
- |
|
|
echo "==> Teszt adatbazis elokeszitese"
|
|
bundle exec rake app:db:test:prepare
|
|
- bundle exec rspec
|
|
|
|
split-mirror:
|
|
image: alpine/git
|
|
environment:
|
|
FORGE_TOKEN:
|
|
from_secret: forge_token
|
|
commands:
|
|
- apk add --no-cache git-subtree
|
|
- git subtree split --prefix=libs/ruby/warp_engine HEAD -b warp-engine-split
|
|
# a secretbe másolt token végén lehet sortörés — levágjuk
|
|
- TOKEN="$$(printf '%s' "$${FORGE_TOKEN}" | tr -d '[:space:]')"
|
|
- git push --force "https://ci:$${TOKEN}@git.teletypegames.org/engines/warp_engine.git" warp-engine-split:master
|
|
when:
|
|
- event: push
|
|
branch: master
|
|
- event: manual
|
|
|
|
publish-gem:
|
|
image: ruby:3.3-slim
|
|
environment:
|
|
FORGE_TOKEN:
|
|
from_secret: forge_token
|
|
commands:
|
|
- cd libs/ruby/warp_engine
|
|
- gem build warp_engine.gemspec
|
|
- mkdir -p ~/.gem
|
|
- TOKEN="$$(printf '%s' "$${FORGE_TOKEN}" | tr -d '[:space:]')"
|
|
# Nevesített kulcs, nem a hoszt-URL: a RubyGems a credentials fájl
|
|
# kulcsait normalizálja (a pontokból __ lesz, záró perjelet kap), így egy
|
|
# URL-kulcs sosem egyezik a --host értékével. Ilyenkor a gem push
|
|
# bejelentkezni próbál a RubyGems sign_in végpontján, amit a Gitea nem
|
|
# ismer — ez adta a "404 page not found"-ot.
|
|
- |
|
|
printf -- '---\n:gitea: Bearer %s\n' "$${TOKEN}" > ~/.gem/credentials
|
|
- chmod 600 ~/.gem/credentials
|
|
- gem push --key gitea --host https://git.teletypegames.org/api/packages/engines/rubygems warp_engine-*.gem
|
|
when:
|
|
- event: tag
|
|
ref: refs/tags/warp_engine-v*
|