name: release # Builds and pushes the minstrel container image to the Forgejo registry. # # push to main → :main # push tag vX.Y.Z → :vX.Y.Z and :latest # workflow_dispatch → manual trigger (same rules based on the ref) on: push: branches: [main] tags: ['v*'] # Tag pushes still build (tag releases are intentional, server + Flutter # share the version). Branch pushes skip when the diff is Flutter-only — # rebuilding the Go image for a Flutter-only merge wastes CI and churns # the registry. paths-ignore: - 'flutter_client/**' - 'docs/**' - '**/*.md' workflow_dispatch: jobs: release: runs-on: go-ci env: IMAGE: git.fabledsword.com/bvandeusen/minstrel steps: - name: Checkout uses: actions/checkout@v4 - name: Detect buildable project id: guard shell: bash run: | if [ -f Dockerfile ] && [ -f go.mod ]; then echo "ready=true" >> "$GITHUB_OUTPUT" else echo "ready=false" >> "$GITHUB_OUTPUT" echo "::notice::No Dockerfile + go.mod yet — release build skipped" fi - name: Compute image tags id: tags if: steps.guard.outputs.ready == 'true' shell: bash run: | if [[ "${GITHUB_REF}" == refs/tags/v* ]]; then VERSION="${GITHUB_REF#refs/tags/}" echo "args=-t ${IMAGE}:${VERSION} -t ${IMAGE}:latest" >> "$GITHUB_OUTPUT" echo "::notice::Release build: ${VERSION} + latest" else echo "args=-t ${IMAGE}:main" >> "$GITHUB_OUTPUT" echo "::notice::Main-branch build: :main" fi - name: Registry login if: steps.guard.outputs.ready == 'true' shell: bash run: | echo "${{ secrets.REGISTRY_TOKEN }}" \ | docker login git.fabledsword.com -u "${{ github.actor }}" --password-stdin - name: Build and push if: steps.guard.outputs.ready == 'true' run: docker buildx build --push ${{ steps.tags.outputs.args }} .