name: Release on: push: tags: - 'v*' jobs: docker: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set image metadata id: meta run: | TAG="${{ gitea.ref_name }}" VERSION="${TAG#v}" REGISTRY="${{ gitea.server_url }}" REGISTRY="${REGISTRY#https://}" REGISTRY="${REGISTRY#http://}" IMAGE="${REGISTRY}/${{ gitea.repository }}" echo "version=${VERSION}" >> "$GITHUB_OUTPUT" echo "image=${IMAGE}" >> "$GITHUB_OUTPUT" echo "tag=${TAG}" >> "$GITHUB_OUTPUT" - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Gitea Container Registry run: | echo "${{ secrets.DEPLOY_TOKEN }}" | docker login "${{ gitea.server_url }}" -u "${{ gitea.repository_owner }}" --password-stdin - name: Build and push multi-arch Docker image uses: docker/build-push-action@v6 with: context: . platforms: linux/amd64,linux/arm64 push: true provenance: true sbom: true build-args: | VERSION=${{ steps.meta.outputs.version }} tags: | ${{ steps.meta.outputs.image }}:${{ steps.meta.outputs.version }} ${{ steps.meta.outputs.image }}:latest labels: | org.opencontainers.image.source=${{ gitea.server_url }}/${{ gitea.repository }} org.opencontainers.image.description=Self-hosted web app launcher dashboard org.opencontainers.image.version=${{ steps.meta.outputs.version }} org.opencontainers.image.licenses=MIT release: runs-on: ubuntu-latest needs: docker steps: - name: Fetch RELEASE_NOTES.md only uses: actions/checkout@v4 with: sparse-checkout: RELEASE_NOTES.md sparse-checkout-cone-mode: false - name: Create Gitea release env: DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }} run: | TAG="${{ gitea.ref_name }}" VERSION="${TAG#v}" BASE_URL="${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}" IS_PRE="false" if echo "$TAG" | grep -qE '(alpha|beta|rc)'; then IS_PRE="true" fi # Extract release notes for THIS version only. Falls back to whole file # if the markers aren't found. if [ -f RELEASE_NOTES.md ]; then BODY=$(awk -v v="$VERSION" ' BEGIN {capture = 0} /^## (v?)/ { if (capture) {exit} if ($0 ~ "## v?"v"([^0-9]|$)") {capture = 1; next} } capture {print} ' RELEASE_NOTES.md) if [ -z "$BODY" ]; then BODY=$(cat RELEASE_NOTES.md) fi BODY_JSON=$(printf '%s' "$BODY" | jq -Rs '.') echo "Found RELEASE_NOTES.md (extracted section for $VERSION)" else BODY_JSON='""' echo "No RELEASE_NOTES.md found — release will have no body" fi EXISTING=$(curl -s -o /dev/null -w "%{http_code}" \ "$BASE_URL/releases/tags/$TAG" \ -H "Authorization: token $DEPLOY_TOKEN") if [ "$EXISTING" = "200" ]; then RELEASE_ID=$(curl -s "$BASE_URL/releases/tags/$TAG" \ -H "Authorization: token $DEPLOY_TOKEN" | jq -r '.id') curl -s -X PATCH "$BASE_URL/releases/$RELEASE_ID" \ -H "Authorization: token $DEPLOY_TOKEN" \ -H "Content-Type: application/json" \ -d "{ \"name\": \"$VERSION\", \"body\": $BODY_JSON, \"draft\": false, \"prerelease\": $IS_PRE }" echo "Updated existing release $RELEASE_ID for $TAG" else curl -s -X POST "$BASE_URL/releases" \ -H "Authorization: token $DEPLOY_TOKEN" \ -H "Content-Type: application/json" \ -d "{ \"tag_name\": \"$TAG\", \"name\": \"$VERSION\", \"body\": $BODY_JSON, \"draft\": false, \"prerelease\": $IS_PRE }" echo "Created release for $TAG" fi