From 6a54487ec17c326a00580abecb0cbe2987d3f534 Mon Sep 17 00:00:00 2001 From: Felix Faerber Date: Tue, 15 Sep 2026 12:30:07 +0300 Subject: [PATCH] build on Gitea, push to the Gitea registry This repo now lives on git.ffaerber.duckdns.org and its image is consumed by the homelab swarm, so the build moves with it: .gitea/workflows/docker.yml builds on the homelab runner and pushes to this Gitea's registry as an immutable short-SHA tag plus :latest. Build-only, on purpose. The GitHub workflow it replaces also SSHed into the Hostinger VPS and ran `docker stack deploy` on every push to main, which deploys the machine being retired and makes a deploy a side effect of a push. The homelab pattern is a PR bumping the tag in ffaerber/homelab, so shipping is a reviewed commit. Plain `docker build` rather than buildx: the runner shares the host daemon through a mounted socket, and buildx's gha cache backend does not exist outside GitHub. .github/workflows is removed from this copy so Gitea does not also try to run it -- it would log in to ghcr with a Gitea token and SSH to a host whose secrets are not here. The GitHub repository keeps its own copy untouched. --- .gitea/workflows/docker.yml | 49 +++++++++++++++++++++++++++++ .github/workflows/docker.yml | 60 ------------------------------------ 2 files changed, 49 insertions(+), 60 deletions(-) create mode 100644 .gitea/workflows/docker.yml delete mode 100644 .github/workflows/docker.yml diff --git a/.gitea/workflows/docker.yml b/.gitea/workflows/docker.yml new file mode 100644 index 0000000..07470fd --- /dev/null +++ b/.gitea/workflows/docker.yml @@ -0,0 +1,49 @@ +name: Docker +# Builds the hosted-gateway image for the homelab instance and pushes it to this +# Gitea's own registry. Deliberately build-only: the GitHub workflow this +# replaces also SSHed into the Hostinger VPS and redeployed it, which is the +# machine being retired. Here the image is deployed the way everything else in +# the homelab is -- a PR bumping the tag in ffaerber/homelab's docker-compose.yml +# -- so a deploy is a reviewed commit rather than a side effect of a push. +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +jobs: + build: + # The homelab runner (a container on pluto, sharing the host docker daemon). + runs-on: ci-runner + steps: + - uses: actions/checkout@v4 + + # Plain docker rather than buildx: the runner already has the host daemon + # on a mounted socket, and the gha cache backend buildx wants does not + # exist here. + - name: Build + run: | + set -eu + SHA=$(echo "${{ github.sha }}" | cut -c1-7) + echo "IMAGE=git.ffaerber.duckdns.org/token-for-token/hosted-gateway" >> "$GITHUB_ENV" + echo "SHA=$SHA" >> "$GITHUB_ENV" + docker build --build-arg COMMIT_SHA=${{ github.sha }} \ + -t "git.ffaerber.duckdns.org/token-for-token/hosted-gateway:$SHA" . + + # Pull requests build to prove the Dockerfile still works, and stop there. + - name: Push + if: github.event_name != 'pull_request' + run: | + set -eu + echo "${{ secrets.GITEA_TOKEN }}" | docker login git.ffaerber.duckdns.org -u "${{ github.actor }}" --password-stdin + docker tag "$IMAGE:$SHA" "$IMAGE:latest" + docker push "$IMAGE:$SHA" + docker push "$IMAGE:latest" + docker logout git.ffaerber.duckdns.org + { + echo "### Pushed" + echo + echo '```' + echo "$IMAGE:$SHA" + echo '```' + } >> "$GITHUB_STEP_SUMMARY" diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml deleted file mode 100644 index 35dde59..0000000 --- a/.github/workflows/docker.yml +++ /dev/null @@ -1,60 +0,0 @@ -name: Docker Image - -on: - push: - branches: [main, develop] - pull_request: - branches: [main] - -jobs: - build-and-push: - runs-on: ubuntu-latest - permissions: - contents: read - packages: write - - steps: - - uses: actions/checkout@v4 - - - uses: docker/setup-buildx-action@v3 - - - uses: docker/login-action@v3 - with: - registry: ghcr.io - username: ${{ github.actor }} - password: ${{ secrets.GITHUB_TOKEN }} - - - uses: docker/metadata-action@v5 - id: meta - with: - images: ghcr.io/token-for-token/hosted-gateway - tags: | - type=sha - type=ref,event=branch - type=raw,value=latest,enable={{is_default_branch}} - labels: | - org.opencontainers.image.source=https://github.com/token-for-token/hosted-gateway - - - uses: docker/build-push-action@v6 - with: - context: . - push: ${{ github.event_name != 'pull_request' }} - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - build-args: | - COMMIT_SHA=${{ github.sha }} - cache-from: type=gha - cache-to: type=gha,mode=max - - - name: docker stack deploy - if: github.event_name != 'pull_request' - uses: appleboy/ssh-action@v1.0.3 - with: - username: root - host: ${{ secrets.SSH_KNOWN_HOSTS }} - key: ${{ secrets.SSH_PRIV_KEY }} - script: | - echo ${{ secrets.GITHUB_TOKEN }} | docker login ghcr.io -u ${{ github.actor }} --password-stdin - docker pull ghcr.io/token-for-token/hosted-gateway:main - docker stack deploy -c ~/devops/hostinger/prod-stack.yaml prod --with-registry-auth --resolve-image always - docker image prune -f --filter "until=24h" -- 2.54.0