diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index 9f57c7a..ec4dca0 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -81,21 +81,35 @@ jobs: echo "Publishing release for $tag_name" wheel_file=$(ls plugin/dist/*.whl | head -n 1) tar_file=$(ls plugin/dist/*.tar.gz | head -n 1) + api_url="${{ github.server_url }}/api/v1/repos/${{ github.repository }}" - # Create release - response=$(curl -s -k -X POST "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases" \ - -H "Authorization: token $GITEA_TOKEN" \ - -H "Content-Type: application/json" \ - -d "{\"tag_name\": \"$tag_name\", \"name\": \"$tag_name\", \"body\": \"Release $tag_name for hermes-meshtastic plugin\"}") + # server_url may be http while Gitea redirects (308) to https: + # curl needs -L or the POST returns an empty body. Release may also + # already exist (retried run) — reuse it instead of failing. + fetch_id() { python3 -c "import json,sys;print(json.load(sys.stdin).get('id') or '')" 2>/dev/null; } + + response=$(curl -s -k -L -H "Authorization: token $GITEA_TOKEN" \ + "$api_url/releases/tags/$tag_name") + release_id=$(printf '%s' "$response" | fetch_id) + + if [ -z "$release_id" ]; then + response=$(curl -s -k -L -X POST "$api_url/releases" \ + -H "Authorization: token $GITEA_TOKEN" \ + -H "Content-Type: application/json" \ + -d "{\"tag_name\": \"$tag_name\", \"name\": \"$tag_name\", \"body\": \"Release $tag_name for hermes-meshtastic plugin\"}") + release_id=$(printf '%s' "$response" | fetch_id) + fi - release_id=$(echo "$response" | grep -o '"id":[0-9]*' | head -n 1 | cut -d: -f2) if [ -n "$release_id" ]; then - curl -s -k -X POST "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/$release_id/assets?name=$(basename $wheel_file)" \ + curl -s -k -L -X POST "$api_url/releases/$release_id/assets?name=$(basename "$wheel_file")" \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/octet-stream" \ --data-binary "@$wheel_file" - curl -s -k -X POST "${{ github.server_url }}/api/v1/repos/${{ github.repository }}/releases/$release_id/assets?name=$(basename $tar_file)" \ + curl -s -k -L -X POST "$api_url/releases/$release_id/assets?name=$(basename "$tar_file")" \ -H "Authorization: token $GITEA_TOKEN" \ -H "Content-Type: application/octet-stream" \ --data-binary "@$tar_file" + else + echo "ERROR: could not create or fetch release $tag_name" >&2 + exit 1 fi