# WarpEngine gem: verzió -> rubocop -> teszt -> tükrözés -> gem kiadás. # # A fejlesztés ebben a monorepóban történik; a engines/warp_engine repó csak # publikálásra való read-only tükör, ezért CI-t oda nincs értelme tenni: a # subtree split minden alkalommal felülírja. # # 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: # Első kapu: a motor nem módosulhat verzióemelés nélkül. Ugyanaz a szkript # fut a .githooks/pre-commit hookban is, csak --staged módban. version-bumped: image: ruby:3.3 commands: - ruby script/warp_engine_version_check.rb --range "$CI_PREV_COMMIT_SHA" "$CI_COMMIT_SHA" when: - event: [ push, manual ] # Tag esetén a verzió már nem emelkedhet: a tagnek a VERSION-t kell hirdetnie. tag-matches-version: image: ruby:3.3 commands: - ruby script/warp_engine_version_check.rb --tag "$CI_COMMIT_REF" when: - event: tag rubocop: image: ruby:3.2 environment: BUNDLE_PATH: /cache/bundle volumes: # A gemek a szerveren maradnak futások között. Külön könyvtár ruby-verziónként: # a natív kiterjesztések (mysql2) egy ABI-hoz fordulnak. - /srv/ci-cache/bundle/warp_engine-ruby3.2:/cache/bundle commands: - apt-get update && apt-get install -y --no-install-recommends default-libmysqlclient-dev - cd libs/ruby/warp_engine # A lock a párhuzamos futásokat választja szét: két pipeline nem ír egyszerre # ugyanabba a bundle könyvtárba. - flock -w 900 /cache/bundle/.install.lock bundle install --jobs 4 - bundle exec rubocop test-engine: image: ruby:3.2 environment: RAILS_ENV: test DB_HOST: mysql BUNDLE_PATH: /cache/bundle volumes: - /srv/ci-cache/bundle/warp_engine-ruby3.2:/cache/bundle commands: - apt-get update && apt-get install -y --no-install-recommends default-libmysqlclient-dev default-mysql-client - cd libs/ruby/warp_engine - flock -w 900 /cache/bundle/.install.lock 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*