name: Gitea Release on: workflow_call: jobs: create-release: runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.x' - name: Install PlatformIO run: | python -m pip install --upgrade pip pip install --upgrade platformio - name: Build Firmware run: | pio run -t buildfs # Build SPIFFS pio run # Build firmware - name: Install esptool run: | pip install esptool - name: Merge firmware and SPIFFS run: | esptool.py --chip esp32 merge_bin \ --flash_mode dio \ --flash_freq 40m \ --flash_size 4MB \ -o .pio/build/esp32dev/filaman_full.bin \ 0x1000 .pio/build/esp32dev/bootloader.bin \ 0x8000 .pio/build/esp32dev/partitions.bin \ 0x10000 .pio/build/esp32dev/firmware.bin \ 0x290000 .pio/build/esp32dev/spiffs.bin - name: Prepare OTA firmware run: | cp .pio/build/esp32dev/firmware.bin .pio/build/esp32dev/filaman_ota.bin - name: Get version from tag id: get_version run: | TAG="${GITEA_REF_NAME}" VERSION="${TAG#v}" echo "VERSION=$VERSION" >> $GITEA_OUTPUT - name: Read CHANGELOG.md id: changelog run: | VERSION=${{ steps.get_version.outputs.VERSION }} CHANGELOG=$(awk "/## \\[$VERSION\\]/{p=1;print;next} /## \\[/{p=0} p" CHANGELOG.md) echo "CHANGES<> $GITEA_OUTPUT echo "$CHANGELOG" >> $GITEA_OUTPUT echo "EOF" >> $GITEA_OUTPUT - name: Create Gitea Release env: GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }} run: | # Debug: Print all environment variables (excluding the token) env | grep -v "GITEA_TOKEN" # Remove trailing slash from server URL if present SERVER_URL="${GITEA_SERVER_URL%/}" REPO="${GITEA_REPOSITORY}" TAG="${GITEA_REF_NAME}" VERSION="${TAG#v}" # Remove v prefix if present echo "Debug environment:" echo "Server URL: $SERVER_URL" echo "Repository: $REPO" echo "Tag: $TAG" echo "Version: $VERSION" # Test API connectivity echo "Testing API connectivity..." TEST_RESPONSE=$(curl -v -k -H "Authorization: token ${GITEA_TOKEN}" "${SERVER_URL}/api/v1/version" 2>&1) echo "API Test Response:" echo "$TEST_RESPONSE" # Construct clean API URL API_URL="${SERVER_URL}/api/v1" RELEASE_URL="${API_URL}/repos/${REPO}/releases" echo "Using Release API URL: $RELEASE_URL" # Common curl options CURL_OPTS="-v -k" # -v for verbose, -k to ignore SSL verification # Create release with minimal data first echo "Creating release..." RELEASE_RESPONSE=$(curl $CURL_OPTS -X POST \ -H "accept: application/json" \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"tag_name\":\"${TAG}\",\"name\":\"Release ${VERSION}\",\"draft\":false,\"prerelease\":false}" \ "${RELEASE_URL}" 2>&1) echo "Full release creation response (including headers):" echo "$RELEASE_RESPONSE" # Extract the JSON response (last line) RELEASE_JSON=$(echo "$RELEASE_RESPONSE" | tail -n 1) echo "Release JSON response:" echo "$RELEASE_JSON" | jq '.' || echo "Failed to parse JSON response" # Get release ID RELEASE_ID=$(echo "$RELEASE_JSON" | jq -r '.id') if [ -z "$RELEASE_ID" ] || [ "$RELEASE_ID" = "null" ]; then echo "Failed to create release. Full response:" echo "$RELEASE_RESPONSE" # Try to get more detailed error information ERROR_MSG=$(echo "$RELEASE_JSON" | jq -r '.message // .error // "Unknown error"') echo "Error message: $ERROR_MSG" exit 1 fi echo "Successfully created release with ID: $RELEASE_ID" # Upload assets for file in "filaman_full.bin" "filaman_ota.bin"; do echo "Uploading $file..." UPLOAD_URL="${RELEASE_URL}/${RELEASE_ID}/assets?name=${file}" echo "Upload URL: $UPLOAD_URL" UPLOAD_RESPONSE=$(curl $CURL_OPTS -X POST \ -H "accept: application/json" \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/octet-stream" \ --data-binary "@.pio/build/esp32dev/${file}" \ "${UPLOAD_URL}" 2>&1) echo "Full upload response for $file (including headers):" echo "$UPLOAD_RESPONSE" # Extract the JSON response (last line) UPLOAD_JSON=$(echo "$UPLOAD_RESPONSE" | tail -n 1) echo "Upload JSON response:" echo "$UPLOAD_JSON" | jq '.' || echo "Failed to parse JSON response" if ! echo "$UPLOAD_JSON" | jq -e '.id' > /dev/null; then echo "Failed to upload $file. Full response:" echo "$UPLOAD_RESPONSE" ERROR_MSG=$(echo "$UPLOAD_JSON" | jq -r '.message // .error // "Unknown error"') echo "Error message: $ERROR_MSG" exit 1 fi echo "Successfully uploaded $file" done # Update release with full description after successful file upload echo "Updating release description..." CHANGELOG='${{ steps.changelog.outputs.CHANGES }}' UPDATE_RESPONSE=$(curl $CURL_OPTS -X PATCH \ -H "accept: application/json" \ -H "Authorization: token ${GITEA_TOKEN}" \ -H "Content-Type: application/json" \ -d "{\"body\":$(echo "$CHANGELOG" | jq -R -s .)}" \ "${RELEASE_URL}/${RELEASE_ID}" 2>&1) echo "Full update response (including headers):" echo "$UPDATE_RESPONSE" # Extract the JSON response (last line) UPDATE_JSON=$(echo "$UPDATE_RESPONSE" | tail -n 1) echo "Update JSON response:" echo "$UPDATE_JSON" | jq '.' || echo "Failed to parse JSON response" echo "Release process completed"