name: Release Electron App run-name: Releasing ${{ gitea.ref_name }} on: push: tags: - 'v*' jobs: release-desktop: runs-on: ubuntu-latest container: image: electronuserland/builder:wine steps: - name: Checkout Code uses: actions/checkout@v4 - name: Install System Dependencies for Linux Makers run: | apt-get update apt-get install -y fakeroot dpkg mono-complete - name: Install Dependencies run: npm install - name: Set version from tag run: npm version "${GITHUB_REF_NAME#v}" --no-git-tag-version --allow-same-version - name: Make App (Linux) run: npm run make -- --platform=linux --arch=x64 - name: Initialize Wine run: | export WINEDEBUG=-all export DISPLAY= wineboot --init env: WINEDEBUG: '-all' - name: Make App (Windows) run: npm run make -- --platform=win32 --arch=x64 env: WINEDEBUG: '-all' - name: Create Gitea Release run: | GITEA_URL="http://10.0.0.119:3000" TAG="${GITHUB_REF_NAME}" REPO="${GITHUB_REPOSITORY}" TOKEN="${{ gitea.token }}" # Check if release exists, create if not RELEASE_ID=$(curl -sf \ -H "Authorization: token ${TOKEN}" \ "${GITEA_URL}/api/v1/repos/${REPO}/releases/tags/${TAG}" \ | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2) if [ -z "$RELEASE_ID" ]; then RELEASE_ID=$(curl -sf \ -X POST \ -H "Authorization: token ${TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"tag_name\":\"${TAG}\",\"name\":\"${TAG}\"}" \ "${GITEA_URL}/api/v1/repos/${REPO}/releases" \ | grep -o '"id":[0-9]*' | head -1 | cut -d: -f2) fi echo "Release ID: ${RELEASE_ID}" echo "RELEASE_ID=${RELEASE_ID}" >> "$GITHUB_ENV" - name: Upload Release Assets shell: bash run: | GITEA_URL="http://10.0.0.119:3000" REPO="${GITHUB_REPOSITORY}" TOKEN="${{ gitea.token }}" MAX_RETRIES=3 upload_file() { local file="$1" local name name=$(basename "$file") local encoded_name encoded_name=$(printf '%s' "$name" | sed 's/ /%20/g') local attempt=1 while [ $attempt -le $MAX_RETRIES ]; do local filesize filesize=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null || echo "unknown") echo "Uploading ${name} (${filesize} bytes, attempt ${attempt}/${MAX_RETRIES})..." RESPONSE=$(curl -s -w "\n%{http_code}" \ --max-time 300 \ -X POST \ -H "Authorization: token ${TOKEN}" \ -H "Expect:" \ -F "attachment=@${file}" \ "${GITEA_URL}/api/v1/repos/${REPO}/releases/${RELEASE_ID}/assets?name=${encoded_name}") HTTP_CODE=$(echo "$RESPONSE" | tail -1) BODY=$(echo "$RESPONSE" | head -n -1) if [ "$HTTP_CODE" -ge 200 ] 2>/dev/null && [ "$HTTP_CODE" -lt 300 ] 2>/dev/null; then echo "✅ Uploaded ${name}" return 0 fi echo "⚠️ Upload failed (HTTP ${HTTP_CODE}), body: ${BODY}" echo "Retrying in 5s..." sleep 5 attempt=$((attempt + 1)) done echo "❌ Failed to upload ${name} after ${MAX_RETRIES} attempts" return 1 } FAILED=0 while IFS= read -r -d '' file; do upload_file "$file" || FAILED=1 done < <(find out/make -type f \( -name "*.exe" -o -name "*.zip" -o -name "*.deb" -o -name "*.rpm" \) -print0) if [ $FAILED -eq 1 ]; then echo "Some uploads failed" exit 1 fi