# Éles deploy: master push -> rubocop -> host teszt -> pull + függőségek + restart. # # A woodpecker-agent ugyanabban a stackben fut, mint az api és a frontend, ezért # a deploy nem SSH-zik: a hoszt docker socketjét használja. A stack könyvtára a # konténerben UGYANARRA az útvonalra van mountolva, mint a hoszton — különben a # compose relatív bind mountjai (./data, ./apps) máshova oldódnának fel. # # Feltételek: # - Woodpecker: a repónál engedélyezni kell a "trusted: volumes" jelölést # (Repo settings -> Trusted, admin joggal), különben a mountok tiltottak. # - Woodpecker secret: forge_token — Forgejo token a services/teletypegames # olvasásához (ugyanaz, amit a warp_engine workflow használ). # - A szerveren /srv/stacks/teletype-games egy master-en álló git checkout, # benne az api és frontend konténerek futnak (container_name: api, frontend). when: - event: push branch: master - event: manual services: - name: mysql image: mysql:8 environment: MYSQL_ALLOW_EMPTY_PASSWORD: "yes" MYSQL_DATABASE: softwares # a zeitwerk:check production modban bootol; a softwares_test-et a db:test:prepare csinalja steps: rubocop: image: ruby:3.3 environment: BUNDLE_PATH: /cache/bundle volumes: # A gemek a szerveren maradnak futások között; a ruby-verzió a kulcs, mert a # natív kiterjesztések (mysql2) egy ABI-hoz fordulnak. - /srv/ci-cache/bundle/api-ruby3.3:/cache/bundle commands: - apt-get update && apt-get install -y --no-install-recommends default-libmysqlclient-dev - cd apps/api # 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-host: image: ruby:3.3 environment: RAILS_ENV: test DB_HOST: mysql DB_USER: root DB_NAME: softwares FILE_CONTAINER_PATH: /tmp/softwares IMAGE_CONTAINER_PATH: /tmp/images UPDATE_SECRET: ci-test SECRET_KEY_BASE: ci-test BUNDLE_PATH: /cache/bundle volumes: - /srv/ci-cache/bundle/api-ruby3.3:/cache/bundle commands: - apt-get update && apt-get install -y --no-install-recommends default-libmysqlclient-dev default-mysql-client - mkdir -p /tmp/softwares /tmp/images - cd apps/api - 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 - bundle exec rails db:test:prepare - bundle exec rspec # Production modu eager load: a sema-betoltott teszt adatbazisra mutatunk, # hogy a boot ne egy ures DB-n haljon el. - RAILS_ENV=production DB_NAME=softwares_test bundle exec rails zeitwerk:check pull: image: alpine/git environment: FORGE_TOKEN: from_secret: forge_token volumes: - /srv/stacks/teletype-games:/srv/stacks/teletype-games commands: - git config --global --add safe.directory /srv/stacks/teletype-games - cd /srv/stacks/teletype-games # A szerver checkoutja detached HEAD-en is állhat: akkor a pull "sikeres", # de a futó kód nem mozdul. Inkább bukjunk el itt. - | BRANCH="$(git symbolic-ref --short -q HEAD || true)" if [ "$BRANCH" != "master" ]; then echo "A checkout nem master-en all (HEAD: $${BRANCH:-detached}), a deploy megall." exit 1 fi - TOKEN="$$(printf '%s' "$${FORGE_TOKEN}" | tr -d '[:space:]')" - git fetch "https://ci:$${TOKEN}@git.teletypegames.org/services/teletypegames.git" master - git merge --ff-only FETCH_HEAD - | HEAD_SHA="$(git rev-parse HEAD)" echo "==> A szerver most itt all: $HEAD_SHA" if [ "$HEAD_SHA" != "$CI_COMMIT_SHA" ]; then echo "Megjegyzes: ez nem a pipeline commitja ($CI_COMMIT_SHA) — kozben ujabb push jott." fi when: - event: [ push, manual ] branch: master restart: image: docker:cli volumes: - /var/run/docker.sock:/var/run/docker.sock commands: # Csak az api és a frontend indul újra. A stack többi szolgáltatását # (traefik, gitea, woodpecker, mysql) nem bántjuk: a woodpecker-server # restartja épp ezt a pipeline-t vágná el. - docker exec api bundle install # A migracio a restart elott fut: a motor migraciois utvonala a hoszt # db:migrate-jaban van, tehat ez a warp_engine migraciot is elvegzi. - docker exec api bundle exec rails db:migrate - docker restart api - docker exec frontend npm install - docker restart frontend - docker ps --filter name=api --filter name=frontend --format '{{.Names}} {{.Status}}' when: - event: [ push, manual ] branch: master