name: Build Release on: push: tags: - 'v*' jobs: # ── Create the release first (shared by all build jobs) ──── create-release: runs-on: ubuntu-latest outputs: release_id: ${{ steps.create.outputs.release_id }} steps: - name: Create Gitea release id: create env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: | TAG="${{ gitea.ref_name }}" 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 RELEASE=$(curl -s -X POST "$BASE_URL/releases" \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/json" \ -d "{ \"tag_name\": \"$TAG\", \"name\": \"LedGrab $TAG\", \"body\": \"## Downloads\\n\\n| Platform | File | How to run |\\n|----------|------|------------|\\n| Windows | \`LedGrab-${TAG}-win-x64.zip\` | Unzip → run \`LedGrab.bat\` → open http://localhost:8080 |\\n| Linux | \`LedGrab-${TAG}-linux-x64.tar.gz\` | Extract → run \`./run.sh\` → open http://localhost:8080 |\\n| Docker | See below | \`docker pull\` → \`docker run\` |\\n\\n### Docker\\n\\n\`\`\`bash\\ndocker pull ${{ gitea.server_url }}/${{ gitea.repository }}:${TAG}\\ndocker run -d -p 8080:8080 ${{ gitea.server_url }}/${{ gitea.repository }}:${TAG}\\n\`\`\`\", \"draft\": false, \"prerelease\": $IS_PRE }") RELEASE_ID=$(echo "$RELEASE" | python3 -c "import sys,json; print(json.load(sys.stdin)['id'])") echo "release_id=$RELEASE_ID" >> "$GITHUB_OUTPUT" echo "Created release ID: $RELEASE_ID" # ── Windows portable ZIP ─────────────────────────────────── build-windows: needs: create-release runs-on: windows-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' - name: Build portable distribution shell: pwsh run: | .\build-dist.ps1 -Version "${{ gitea.ref_name }}" - name: Upload build artifact uses: actions/upload-artifact@v3 with: name: LedGrab-${{ gitea.ref_name }}-win-x64 path: build/LedGrab-*.zip retention-days: 90 - name: Attach ZIP to release shell: bash env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: | TAG="${{ gitea.ref_name }}" RELEASE_ID="${{ needs.create-release.outputs.release_id }}" BASE_URL="${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}" ZIP_FILE=$(ls build/LedGrab-*.zip | head -1) ZIP_NAME=$(basename "$ZIP_FILE") curl -s -X POST \ "$BASE_URL/releases/$RELEASE_ID/assets?name=$ZIP_NAME" \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/octet-stream" \ --data-binary "@$ZIP_FILE" echo "Uploaded: $ZIP_NAME" # ── Linux tarball ────────────────────────────────────────── build-linux: needs: create-release runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Setup Python uses: actions/setup-python@v5 with: python-version: '3.11' - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: '20' - name: Install system dependencies run: | sudo apt-get update sudo apt-get install -y --no-install-recommends libportaudio2 - name: Build Linux distribution run: | chmod +x build-dist.sh ./build-dist.sh "${{ gitea.ref_name }}" - name: Upload build artifact uses: actions/upload-artifact@v3 with: name: LedGrab-${{ gitea.ref_name }}-linux-x64 path: build/LedGrab-*.tar.gz retention-days: 90 - name: Attach tarball to release env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: | TAG="${{ gitea.ref_name }}" RELEASE_ID="${{ needs.create-release.outputs.release_id }}" BASE_URL="${{ gitea.server_url }}/api/v1/repos/${{ gitea.repository }}" TAR_FILE=$(ls build/LedGrab-*.tar.gz | head -1) TAR_NAME=$(basename "$TAR_FILE") curl -s -X POST \ "$BASE_URL/releases/$RELEASE_ID/assets?name=$TAR_NAME" \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/octet-stream" \ --data-binary "@$TAR_FILE" echo "Uploaded: $TAR_NAME" # ── Docker image ─────────────────────────────────────────── build-docker: needs: create-release runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Login to Gitea Container Registry uses: docker/login-action@v3 with: registry: ${{ gitea.server_url }} username: ${{ gitea.actor }} password: ${{ secrets.GITEA_TOKEN }} - name: Extract version metadata id: meta run: | TAG="${{ gitea.ref_name }}" VERSION="${TAG#v}" REGISTRY="${{ gitea.server_url }}/${{ gitea.repository }}" # Lowercase the registry path (Docker requires it) REGISTRY=$(echo "$REGISTRY" | tr '[:upper:]' '[:lower:]' | sed 's|https\?://||') echo "version=$VERSION" >> "$GITHUB_OUTPUT" echo "registry=$REGISTRY" >> "$GITHUB_OUTPUT" # Build tag list: version + latest (only for stable releases) TAGS="$REGISTRY:$TAG,$REGISTRY:$VERSION" if ! echo "$TAG" | grep -qE '(alpha|beta|rc)'; then TAGS="$TAGS,$REGISTRY:latest" fi echo "tags=$TAGS" >> "$GITHUB_OUTPUT" - name: Build and push Docker image uses: docker/build-push-action@v5 with: context: ./server push: true tags: ${{ steps.meta.outputs.tags }} labels: | org.opencontainers.image.version=${{ steps.meta.outputs.version }} org.opencontainers.image.revision=${{ gitea.sha }} cache-from: type=gha cache-to: type=gha,mode=max