diff --git a/README.md b/README.md index ea0f4f3..e51c004 100644 --- a/README.md +++ b/README.md @@ -111,6 +111,25 @@ check with: verify_metadata: false ``` +### Tolerating release package file duplicates + +Sometimes, when you publish releases from multiple places, your workflow +may hit race conditions. For example, when publishing from multiple CIs +or even having workflows with the same steps triggered withing GitHub +Actions CI/CD for different events concerning the same high-level act. + +To facilitate this use-case, you may use `skip_existing` (disabled by +default) setting as follows: + +```yml + with: + skip_existing: true +``` + +> **Pro tip**: try to avoid enabling this setting where possible. If you +have steps for publishing to both PyPI and TestPyPI, consider only using +it for the latter, having the former fail loudly on duplicates. + ## License The Dockerfile and associated scripts and documentation in this project diff --git a/action.yml b/action.yml index a5bcd55..1a25481 100644 --- a/action.yml +++ b/action.yml @@ -20,6 +20,12 @@ inputs: description: Check metadata before uploading required: false default: true + skip_existing: + description: >- + Do not fail if a Python package distribution + exists in the target package index + required: false + default: false branding: color: yellow icon: upload-cloud @@ -32,3 +38,4 @@ runs: - ${{ inputs.repository_url }} - ${{ inputs.packages_dir }} - ${{ inputs.verify_metadata }} + - ${{ inputs.skip_existing }} diff --git a/twine-upload.sh b/twine-upload.sh index 52015d7..d827134 100755 --- a/twine-upload.sh +++ b/twine-upload.sh @@ -37,8 +37,13 @@ if [[ ${INPUT_VERIFY_METADATA,,} != "false" ]] ; then twine check ${INPUT_PACKAGES_DIR%%/}/* fi +TWINE_EXTRA_ARGS= +if [[ ${INPUT_SKIP_EXISTING,,} != "false" ]] ; then + TWINE_EXTRA_ARGS=--skip-existing +fi + TWINE_USERNAME="$INPUT_USER" \ TWINE_PASSWORD="$INPUT_PASSWORD" \ TWINE_REPOSITORY_URL="$INPUT_REPOSITORY_URL" \ - exec twine upload ${INPUT_PACKAGES_DIR%%/}/* + exec twine upload ${TWINE_EXTRA_ARGS} ${INPUT_PACKAGES_DIR%%/}/*