Check a plugin before a Marketplace retry¶

A JetBrains Marketplace upload can succeed before a later GitHub Release step fails. On a retry, check the existing plugin version against the signed ZIP from the tagged build before calling publishPlugin again. Marketplace can repackage the outer ZIP, so compare each member path, uncompressed SHA256 digest, type, and permission bits instead of the outer file hash. Symlinks and special ZIP members fail the check.

Run the check after building and validating the signed ZIP, in a step without the Marketplace upload token:

release-creator marketplace \
  --plugin-id com.example.plugin \
  --version 2.4.6 \
  --archive build/distributions/example-2.4.6-signed.zip \
  --github-output "$GITHUB_OUTPUT"

The step prints and writes publish=true when the version-specific download returns 404. Publish only in that case. If the download exists, publish=false means every ZIP member matched. A changed, extra, missing, duplicate, or retyped member fails the check, as does a permission change. Non-404 HTTP failures and invalid ZIPs also fail. The command uses JetBrains’ version-specific download endpoint and never uploads or reads a publishing credential.

In GitHub Actions, give the check step an ID and gate the upload step on its output:

- name: Check the published plugin
  id: marketplace
  run: |
    release-creator marketplace \
      --plugin-id com.example.plugin \
      --version 2.4.6 \
      --archive build/distributions/example-2.4.6-signed.zip \
      --github-output "$GITHUB_OUTPUT"
- name: Publish the signed plugin
  if: steps.marketplace.outputs.publish == 'true'
  env:
    PUBLISH_TOKEN: ${{ secrets.PUBLISH_TOKEN }}
  run: ./gradlew publishPlugin

An uploaded version might not be publicly downloadable until JetBrains approves it. During that interval, 404 cannot prove whether the upload has already happened; a repeat upload may fail. Keep that failure visible and retry after the version appears publicly. To check an already visible version after publication, pass --mode verify; a 404 then fails instead of returning publish=true.