mirror of
https://github.com/pypa/gh-action-pypi-publish
synced 2024-11-30 21:22:28 +08:00
104bf53067
Up to this point, the project has been set up as a Docker action referencing the Dockerfile. The downside to using the Dockerfile for the action is that the Docker image must be built every time the action is used. This commit will set up the project to build the Docker image and push it to GitHub Container Registry (GHCR). This change will speed up user workflows every time the action is used because the workflows will simply pull the Docker image from GHCR instead of building again. Changes: - Add required metadata to Dockerfile - Build container image with GitHub Actions - Push container image to GHCR Docker actions support pulling in pre-built Docker images. The downside is that there's no way to specify the correct Docker tag because the GitHub Actions `image` and `uses:` keys don't accept any context. For example, if a user's workflow has `uses: pypa/gh-action-pypi-publish@release/v1.8`, then the action should pull in a Docker image built from the `release/v1.8` branch, something like `ghcr.io/pypa/gh-action-pypi-publish:release-v1.8` (Docker tags can't have `/`). The workaround is to switch the top-level `action.yml` to a composite action that then calls the Docker action, substituting the correct image name and tag.
151 lines
5.4 KiB
YAML
151 lines
5.4 KiB
YAML
---
|
|
name: pypi-publish
|
|
description: Upload Python distribution packages to PyPI
|
|
inputs:
|
|
user:
|
|
description: PyPI user
|
|
required: false
|
|
default: __token__
|
|
password:
|
|
description: Password for your PyPI user or an access token
|
|
required: false
|
|
repository-url: # Canonical alias for `repository_url`
|
|
description: The repository URL to use
|
|
required: false
|
|
repository_url: # DEPRECATED ALIAS; TODO: Remove in v3+
|
|
description: >-
|
|
[DEPRECATED]
|
|
The repository URL to use
|
|
deprecationMessage: >-
|
|
The inputs have been normalized to use kebab-case.
|
|
Use `repository-url` instead.
|
|
required: false
|
|
default: https://upload.pypi.org/legacy/
|
|
packages-dir: # Canonical alias for `packages_dir`
|
|
description: The target directory for distribution
|
|
required: false
|
|
# default: dist # TODO: uncomment once alias removed
|
|
packages_dir: # DEPRECATED ALIAS; TODO: Remove in v3+
|
|
description: >-
|
|
[DEPRECATED]
|
|
The target directory for distribution
|
|
deprecationMessage: >-
|
|
The inputs have been normalized to use kebab-case.
|
|
Use `packages-dir` instead.
|
|
required: false
|
|
default: dist
|
|
verify-metadata: # Canonical alias for `verify_metadata`
|
|
description: Check metadata before uploading
|
|
required: false
|
|
# default: 'true' # TODO: uncomment once alias removed
|
|
verify_metadata: # DEPRECATED ALIAS; TODO: Remove in v3+
|
|
description: >-
|
|
[DEPRECATED]
|
|
Check metadata before uploading
|
|
deprecationMessage: >-
|
|
The inputs have been normalized to use kebab-case.
|
|
Use `verify-metadata` instead.
|
|
required: false
|
|
default: 'true'
|
|
skip-existing: # Canonical alias for `skip_existing`
|
|
description: >-
|
|
Do not fail if a Python package distribution
|
|
exists in the target package index
|
|
required: false
|
|
# default: 'false' # TODO: uncomment once alias removed
|
|
skip_existing: # DEPRECATED ALIAS; TODO: Remove in v3+
|
|
description: >-
|
|
[DEPRECATED]
|
|
Do not fail if a Python package distribution
|
|
exists in the target package index
|
|
deprecationMessage: >-
|
|
The inputs have been normalized to use kebab-case.
|
|
Use `skip-existing` instead.
|
|
required: false
|
|
default: 'false'
|
|
verbose:
|
|
description: Show verbose output.
|
|
required: false
|
|
default: 'false'
|
|
print-hash: # Canonical alias for `print_hash`
|
|
description: Show hash values of files to be uploaded
|
|
required: false
|
|
# default: 'false' # TODO: uncomment once alias removed
|
|
print_hash: # DEPRECATED ALIAS; TODO: Remove in v3+
|
|
description: >-
|
|
[DEPRECATED]
|
|
Show hash values of files to be uploaded
|
|
deprecationMessage: >-
|
|
The inputs have been normalized to use kebab-case.
|
|
Use `print-hash` instead.
|
|
required: false
|
|
default: 'false'
|
|
attestations:
|
|
description: >-
|
|
[EXPERIMENTAL]
|
|
Enable experimental support for PEP 740 attestations.
|
|
Only works with PyPI and TestPyPI via Trusted Publishing.
|
|
required: false
|
|
default: 'false'
|
|
branding:
|
|
color: yellow
|
|
icon: upload-cloud
|
|
runs:
|
|
using: composite
|
|
steps:
|
|
- name: Reset path if needed
|
|
run: |
|
|
# Reset path if needed
|
|
# https://github.com/pypa/gh-action-pypi-publish/issues/112
|
|
if [[ $PATH != *"/usr/bin"* ]]; then
|
|
echo "\$PATH=$PATH. Resetting \$PATH for GitHub Actions."
|
|
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
|
|
echo "PATH=$PATH" >>"$GITHUB_ENV"
|
|
echo "$PATH" >>"$GITHUB_PATH"
|
|
echo "\$PATH reset. \$PATH=$PATH"
|
|
fi
|
|
shell: bash
|
|
- name: Set repo and ref from which to run Docker container action
|
|
id: set-repo-and-ref
|
|
run: |
|
|
# Set repo and ref from which to run Docker container action
|
|
# to handle cases in which `github.action_` context is not set
|
|
# https://github.com/actions/runner/issues/2473
|
|
REF=${{ env.ACTION_REF || github.ref_name }}
|
|
REPO=${{ env.ACTION_REPO || github.repository }}
|
|
echo "ref=$REF" >>"$GITHUB_OUTPUT"
|
|
echo "repo=$REPO" >>"$GITHUB_OUTPUT"
|
|
shell: bash
|
|
env:
|
|
ACTION_REF: ${{ github.action_ref }}
|
|
ACTION_REPO: ${{ github.action_repository }}
|
|
- name: Set Docker image name and tag
|
|
run: |
|
|
# Set Docker image name and tag
|
|
# if action run was triggered by a pull request to this repo,
|
|
# build image from Dockerfile because it has not been pushed to GHCR,
|
|
# else pull image from GHCR
|
|
if [[ $GITHUB_EVENT_NAME == "pull_request" ]] &&
|
|
[[ $GITHUB_REPOSITORY == "pypa/gh-action-pypi-publish" ]]; then
|
|
IMAGE="../../../Dockerfile"
|
|
else
|
|
REF=${{ steps.set-repo-and-ref.outputs.ref }}
|
|
REPO=${{ steps.set-repo-and-ref.outputs.repo }}
|
|
IMAGE="docker://ghcr.io/$REPO:${REF/'/'/'-'}"
|
|
fi
|
|
FILE=".github/actions/run-docker-container/action.yml"
|
|
sed -i -e "s|{{image}}|$IMAGE|g" "$FILE"
|
|
shell: bash
|
|
- name: Run Docker container
|
|
uses: ./.github/actions/run-docker-container
|
|
with:
|
|
user: ${{ inputs.user }}
|
|
password: ${{ inputs.password }}
|
|
repository-url: ${{ inputs.repository-url || inputs.repository_url }}
|
|
packages-dir: ${{ inputs.packages-dir || inputs.packages_dir }}
|
|
verify-metadata: ${{ inputs.verify-metadata || inputs.verify_metadata }}
|
|
skip-existing: ${{ inputs.skip-existing || inputs.skip_existing }}
|
|
verbose: ${{ inputs.verbose }}
|
|
print-hash: ${{ inputs.print-hash || inputs.print_hash }}
|
|
attestations: ${{ inputs.attestations }}
|