name: CI on: push: pull_request: jobs: check: runs-on: brick-build steps: - uses: actions/checkout@v4 # No ruby-version input: the action auto-detects it from # .ruby-version when the input is omitted (not "file", which isn't # a recognized value and fails with "Unknown engine file"). - uses: ruby/setup-ruby@v1 with: bundler-cache: true - name: Ruby syntax check run: find app.rb config lib bin -name "*.rb" -print0 | xargs -0 -n1 ruby -c - name: App loads without errors run: bundle exec ruby -e 'require_relative "app"' - name: Ruby tests run: bundle exec rake test - uses: actions/setup-node@v4 with: node-version: "22" - name: JS syntax check run: find public/js -name "*.js" -print0 | xargs -0 -n1 node --check # Handled by a separate, native (non-Docker) runner registered with the # single "brick-host" label (see docs/deployment.adoc) — it runs directly # on the server, so it has podman/git/etc. from the host, no socket/bind # mount tricks needed. The Docker-based runner keeps handling `check`. deploy: needs: check if: github.event_name == 'push' && github.ref == 'refs/heads/main' runs-on: brick-host steps: # Not actions/checkout@v4: keeping this plain-git checkout from when # the job ran in a Node-less container — no reason to add a Node # dependency back in for something this already does. - name: Checkout run: | rm -rf .git * .[!.]* 2>/dev/null git init -q git remote add origin "${{ gitea.server_url }}/${{ gitea.repository }}.git" git -c http.extraHeader="Authorization: token ${{ secrets.GITHUB_TOKEN }}" \ fetch --depth 1 origin "${{ gitea.sha }}" git checkout -q FETCH_HEAD # Read by app.rb at boot and shown (as a hover tooltip on the topbar # brand) so it's possible to tell which commit is actually live # without digging through `tea actions runs list` — written here, # before .git gets dropped below, since that's otherwise the only # place the commit is recorded. - name: Write REVISION run: git rev-parse --short HEAD > REVISION # The checkout lives in build/, wiped and fully replaced every # deploy — data/ and .env live one level up, in /srv/podman/maptool/ # itself, so they're never inside the directory this nukes and never # need special-casing here (an earlier version of this step had to # skip data/ by name for exactly that reason). docker-compose.yaml # itself is symlinked up to /srv/podman/maptool/ (relative target, so # it survives /srv/podman itself ever being renamed) purely for # discoverability — a human poking around expects to find it at the # top, not a level down — and because that's what makes `./data` in # it resolve to the sibling directory: compose resolves a relative # volume path against the *symlink's* location, not build/ (verified # against plain `docker-compose config`), so podman-compose@.service's # own WorkingDirectory=/srv/podman/maptool needs no change either. - name: Sync to /srv/podman/maptool/build run: | rm -rf /srv/podman/maptool/build mkdir -p /srv/podman/maptool/build cp -a . /srv/podman/maptool/build/ rm -rf /srv/podman/maptool/build/.git ln -sf build/docker-compose.yaml /srv/podman/maptool/docker-compose.yaml # Regenerated on every deploy from repo secrets (Settings -> Actions # -> Secrets) rather than created once by hand on the server — see # docs/deployment.adoc. Values are masked in the job log by Gitea # automatically since they come from `secrets`. Secret names here # can't start with "GITEA_"/"GITHUB_" — Gitea reserves those prefixes # — hence OAUTH_CLIENT_* rather than GITEA_OAUTH_CLIENT_*; the .env # var names on the right of `=` are unaffected, still what app.rb # actually reads. - name: Write .env run: | cat > /srv/podman/maptool/.env <