diff --git a/.gitea/workflows/release.yml b/.gitea/workflows/release.yml index 51803a2..0a8e25a 100644 --- a/.gitea/workflows/release.yml +++ b/.gitea/workflows/release.yml @@ -1,35 +1,60 @@ name: Release -# A tag v* publishes the agent's image to Gitea's registry (Development Plan -# M1.5, X4): gitea.dongar.net/dongar/nisse-dev: and :latest. The token -# is a secret (REGISTRY_TOKEN: write:package for REGISTRY_USER); the -# account is a setting, so it's here. +# A published release builds the agent's image and pushes it to Gitea's +# registry (Development Plan M1.5, X4): gitea.dongar.net/dongar/nisse-dev +# tagged with the version (the release tag without its v) and latest. Cut a +# release in Gitea (Releases → New release, tag vX.Y.Z); a tag pushed for any +# other reason builds nothing. +# +# The registry needs a personal access token with write:package +# (REGISTRY_TOKEN), never the built-in job token: Gitea's registry resolves +# an Actions job token to an empty package scope (go-gitea/gitea#23642 and +# others). Packages belong to the repository's owner. Never on pull_request: +# registry credentials stay off that trigger. on: - push: - tags: ["v*"] + release: + types: [published] env: REGISTRY: gitea.dongar.net - REGISTRY_USER: dongar + REGISTRY_USER: dongar # the token's account IMAGE: gitea.dongar.net/dongar/nisse-dev jobs: - image: + build-and-push: runs-on: ubuntu-latest + permissions: + contents: read steps: - - uses: actions/checkout@v4 + - name: Checkout + uses: actions/checkout@v4 - - name: Build - run: | - docker build --target agent \ - --label org.opencontainers.image.revision="${{ github.sha }}" \ - --label org.opencontainers.image.version="${{ github.ref_name }}" \ - -t "$IMAGE:${{ github.ref_name }}" -t "$IMAGE:latest" . - - - name: Push + - name: Derive the image version from the release's tag + id: vars env: - REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }} - run: | - printf '%s' "$REGISTRY_TOKEN" | docker login "$REGISTRY" -u "$REGISTRY_USER" --password-stdin - docker push "$IMAGE:${{ github.ref_name }}" - docker push "$IMAGE:latest" - docker logout "$REGISTRY" + TAG: ${{ github.event.release.tag_name }} + run: echo "version=${TAG#v}" >> "$GITHUB_OUTPUT" + + - name: Log in to Gitea's container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ env.REGISTRY_USER }} + password: ${{ secrets.REGISTRY_TOKEN }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push the agent + uses: docker/build-push-action@v5 + with: + context: . + target: agent + push: true + build-args: | + VERSION=${{ steps.vars.outputs.version }} + labels: | + org.opencontainers.image.version=${{ steps.vars.outputs.version }} + org.opencontainers.image.revision=${{ github.sha }} + tags: | + ${{ env.IMAGE }}:${{ steps.vars.outputs.version }} + ${{ env.IMAGE }}:latest diff --git a/Dockerfile b/Dockerfile index 500e760..09df155 100644 --- a/Dockerfile +++ b/Dockerfile @@ -24,6 +24,8 @@ COPY nisse-ops nisse-ops RUN uv sync --frozen --no-dev --package nisse-dev --no-editable FROM python:3.12-slim AS runtime +ARG VERSION=dev +LABEL org.opencontainers.image.title=nisse-dev org.opencontainers.image.version=$VERSION RUN apt-get update \ && apt-get install -y --no-install-recommends openssh-client \ && rm -rf /var/lib/apt/lists/* \