name: Release on: push: tags: - 'v*' env: SERVER_HOST: git.dolgolyov-family.by REGISTRY: git.dolgolyov-family.by/alexei.dolgolyov/tiny-forge jobs: create-release: runs-on: ubuntu-latest outputs: release_id: ${{ steps.create.outputs.release_id }} 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 id: create env: DEPLOY_TOKEN: ${{ secrets.DEPLOY_TOKEN }} run: | TAG="${{ gitea.ref_name }}" VERSION="${TAG#v}" BASE_URL="${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}" # Detect pre-release (alpha/beta/rc) IS_PRE="false" if echo "$TAG" | grep -qE '(alpha|beta|rc)'; then IS_PRE="true" fi # Read release notes if present if [ -f RELEASE_NOTES.md ]; then export RELEASE_NOTES=$(cat RELEASE_NOTES.md) echo "Found RELEASE_NOTES.md" else export RELEASE_NOTES="" echo "No RELEASE_NOTES.md found — release will have no body" fi BODY_JSON=$(python3 -c " import json, os notes = os.environ.get('RELEASE_NOTES', '') print(json.dumps(notes.strip())) ") # Create release via Gitea API RELEASE=$(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 }") # Fallback: if release already exists for this tag, reuse it RELEASE_ID=$(echo "$RELEASE" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])" 2>/dev/null) if [ -z "$RELEASE_ID" ]; then echo "::warning::Release already exists for tag $TAG — reusing existing release" RELEASE=$(curl -s "$BASE_URL/releases/tags/$TAG" \ -H "Authorization: token $DEPLOY_TOKEN") RELEASE_ID=$(echo "$RELEASE" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])") fi echo "release_id=$RELEASE_ID" >> "$GITHUB_OUTPUT" echo "Created release $RELEASE_ID for $TAG" build-docker: needs: create-release runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Login to Gitea Container Registry id: docker-login continue-on-error: true run: | echo "${{ secrets.DEPLOY_TOKEN }}" | docker login \ "$SERVER_HOST" -u "${{ gitea.actor }}" --password-stdin - name: Build and tag if: steps.docker-login.outcome == 'success' run: | TAG="${{ gitea.ref_name }}" VERSION="${TAG#v}" docker build -t "$REGISTRY:$TAG" -t "$REGISTRY:$VERSION" . # Tag as 'latest' only for stable releases if ! echo "$TAG" | grep -qE '(alpha|beta|rc)'; then docker tag "$REGISTRY:$TAG" "$REGISTRY:latest" fi - name: Push if: steps.docker-login.outcome == 'success' run: docker push "$REGISTRY" --all-tags - name: Trigger Portainer redeploy if: steps.docker-login.outcome == 'success' continue-on-error: true run: | if [ -n "${{ secrets.DOCKER_REDEPLOY_WEBHOOK_URL }}" ]; then echo "Triggering Portainer redeploy..." curl -sf -X POST "${{ secrets.DOCKER_REDEPLOY_WEBHOOK_URL }}" \ --max-time 30 || echo "::warning::Portainer webhook failed" else echo "DOCKER_REDEPLOY_WEBHOOK_URL not set — skipping auto-deploy" fi