mirror of
https://github.com/pypa/gh-action-pypi-publish.git
synced 2024-11-23 17:11:07 -05:00
Generate Docker container action with Python
This commit is contained in:
parent
0d8d5059c8
commit
aed6c4b1b0
5 changed files with 114 additions and 61 deletions
45
.github/actions/run-docker-container/action.yml
vendored
45
.github/actions/run-docker-container/action.yml
vendored
|
@ -1,45 +0,0 @@
|
||||||
---
|
|
||||||
name: 🏃
|
|
||||||
description: >-
|
|
||||||
Run Docker container to
|
|
||||||
upload Python distribution packages to PyPI
|
|
||||||
inputs:
|
|
||||||
user:
|
|
||||||
description: PyPI user
|
|
||||||
required: false
|
|
||||||
password:
|
|
||||||
description: Password for your PyPI user or an access token
|
|
||||||
required: false
|
|
||||||
repository-url:
|
|
||||||
description: The repository URL to use
|
|
||||||
required: false
|
|
||||||
packages-dir:
|
|
||||||
description: The target directory for distribution
|
|
||||||
required: false
|
|
||||||
verify-metadata:
|
|
||||||
description: Check metadata before uploading
|
|
||||||
required: false
|
|
||||||
skip-existing:
|
|
||||||
description: >-
|
|
||||||
Do not fail if a Python package distribution
|
|
||||||
exists in the target package index
|
|
||||||
required: false
|
|
||||||
verbose:
|
|
||||||
description: Show verbose output.
|
|
||||||
required: false
|
|
||||||
print-hash:
|
|
||||||
description: Show hash values of files to be uploaded
|
|
||||||
required: false
|
|
||||||
runs:
|
|
||||||
using: docker
|
|
||||||
image: "{{image}}"
|
|
||||||
args:
|
|
||||||
- ${{ inputs.user }}
|
|
||||||
- ${{ inputs.password }}
|
|
||||||
- ${{ inputs.repository-url }}
|
|
||||||
- ${{ inputs.packages-dir }}
|
|
||||||
- ${{ inputs.verify-metadata }}
|
|
||||||
- ${{ inputs.skip-existing }}
|
|
||||||
- ${{ inputs.verbose }}
|
|
||||||
- ${{ inputs.print-hash }}
|
|
||||||
- ${{ inputs.attestations }}
|
|
32
action.yml
32
action.yml
|
@ -119,25 +119,25 @@ runs:
|
||||||
env:
|
env:
|
||||||
ACTION_REF: ${{ github.action_ref }}
|
ACTION_REF: ${{ github.action_ref }}
|
||||||
ACTION_REPO: ${{ github.action_repository }}
|
ACTION_REPO: ${{ github.action_repository }}
|
||||||
- name: Set Docker image name and tag
|
- name: Check out action repo
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: action-repo
|
||||||
|
ref: ${{ steps.set-repo-and-ref.outputs.ref }}
|
||||||
|
repository: ${{ steps.set-repo-and-ref.outputs.repo }}
|
||||||
|
- name: Create Docker container action
|
||||||
run: |
|
run: |
|
||||||
# Set Docker image name and tag
|
# Create Docker container action
|
||||||
# if action run was triggered by a pull request to this repo,
|
python -m pip install -r requirements/github-actions.txt
|
||||||
# build image from Dockerfile because it has not been pushed to GHCR,
|
python create-docker-action.py ${{ steps.set-image.outputs.image }}
|
||||||
# else pull image from GHCR
|
env:
|
||||||
if [[ $GITHUB_EVENT_NAME == "pull_request" ]] &&
|
EVENT: ${{ github.event_name }}
|
||||||
[[ $GITHUB_REPOSITORY == "pypa/gh-action-pypi-publish" ]]; then
|
REF: ${{ steps.set-repo-and-ref.outputs.ref }}
|
||||||
IMAGE="../../../Dockerfile"
|
REPO: ${{ steps.set-repo-and-ref.outputs.repo }}
|
||||||
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
|
shell: bash
|
||||||
|
working-directory: action-repo
|
||||||
- name: Run Docker container
|
- name: Run Docker container
|
||||||
uses: ./.github/actions/run-docker-container
|
uses: ./action-repo/.github/actions/run-docker-container
|
||||||
with:
|
with:
|
||||||
user: ${{ inputs.user }}
|
user: ${{ inputs.user }}
|
||||||
password: ${{ inputs.password }}
|
password: ${{ inputs.password }}
|
||||||
|
|
88
create-docker-action.py
Normal file
88
create-docker-action.py
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
import os
|
||||||
|
import pathlib
|
||||||
|
|
||||||
|
import yaml
|
||||||
|
|
||||||
|
DESCRIPTION = 'description'
|
||||||
|
REQUIRED = 'required'
|
||||||
|
|
||||||
|
EVENT = os.environ['EVENT']
|
||||||
|
REF = os.environ['REF']
|
||||||
|
REPO = os.environ['REPO']
|
||||||
|
|
||||||
|
|
||||||
|
def set_image(event: str, ref: str, repo: str) -> str:
|
||||||
|
if event == 'pull_request' and 'gh-action-pypi-publish' in repo:
|
||||||
|
return '../../../Dockerfile'
|
||||||
|
docker_ref = ref.replace('/', '-')
|
||||||
|
return f'docker://ghcr.io/{repo}:{docker_ref}'
|
||||||
|
|
||||||
|
|
||||||
|
image = set_image(EVENT, REF, REPO)
|
||||||
|
|
||||||
|
action = {
|
||||||
|
'name': '🏃',
|
||||||
|
DESCRIPTION: (
|
||||||
|
'Run Docker container to upload Python distribution packages to PyPI'
|
||||||
|
),
|
||||||
|
'inputs': {
|
||||||
|
'user': {DESCRIPTION: 'PyPI user', REQUIRED: False},
|
||||||
|
'password': {
|
||||||
|
DESCRIPTION: 'Password for your PyPI user or an access token',
|
||||||
|
REQUIRED: False,
|
||||||
|
},
|
||||||
|
'repository-url': {
|
||||||
|
DESCRIPTION: 'The repository URL to use',
|
||||||
|
REQUIRED: False,
|
||||||
|
},
|
||||||
|
'packages-dir': {
|
||||||
|
DESCRIPTION: 'The target directory for distribution',
|
||||||
|
REQUIRED: False,
|
||||||
|
},
|
||||||
|
'verify-metadata': {
|
||||||
|
DESCRIPTION: 'Check metadata before uploading',
|
||||||
|
REQUIRED: False,
|
||||||
|
},
|
||||||
|
'skip-existing': {
|
||||||
|
DESCRIPTION: (
|
||||||
|
'Do not fail if a Python package distribution'
|
||||||
|
' exists in the target package index'
|
||||||
|
),
|
||||||
|
REQUIRED: False,
|
||||||
|
},
|
||||||
|
'verbose': {DESCRIPTION: 'Show verbose output.', REQUIRED: False},
|
||||||
|
'print-hash': {
|
||||||
|
DESCRIPTION: 'Show hash values of files to be uploaded',
|
||||||
|
REQUIRED: False,
|
||||||
|
},
|
||||||
|
'attestations': {
|
||||||
|
DESCRIPTION: (
|
||||||
|
'[EXPERIMENTAL]'
|
||||||
|
' Enable experimental support for PEP 740 attestations.'
|
||||||
|
' Only works with PyPI and TestPyPI via Trusted Publishing.'
|
||||||
|
),
|
||||||
|
REQUIRED: False,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'runs': {
|
||||||
|
'using': 'docker',
|
||||||
|
'image': image,
|
||||||
|
'args': [
|
||||||
|
'${{ inputs.user }}',
|
||||||
|
'${{ inputs.password }}',
|
||||||
|
'${{ inputs.repository-url }}',
|
||||||
|
'${{ inputs.packages-dir }}',
|
||||||
|
'${{ inputs.verify-metadata }}',
|
||||||
|
'${{ inputs.skip-existing }}',
|
||||||
|
'${{ inputs.verbose }}',
|
||||||
|
'${{ inputs.print-hash }}',
|
||||||
|
'${{ inputs.attestations }}',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
action_path = pathlib.Path('.github/actions/run-docker-container/action.yml')
|
||||||
|
action_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
||||||
|
with action_path.open(mode='w', encoding='utf-8') as file:
|
||||||
|
yaml.dump(action, file, allow_unicode=True, sort_keys=False)
|
2
requirements/github-actions.in
Normal file
2
requirements/github-actions.in
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
# NOTE: used by create-docker-action.py
|
||||||
|
pyyaml
|
8
requirements/github-actions.txt
Normal file
8
requirements/github-actions.txt
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
#
|
||||||
|
# This file is autogenerated by pip-compile with Python 3.12
|
||||||
|
# by the following command:
|
||||||
|
#
|
||||||
|
# pip-compile --allow-unsafe --config=../.pip-tools.toml --output-file=github-actions.txt --strip-extras github-actions.in
|
||||||
|
#
|
||||||
|
pyyaml==6.0.1
|
||||||
|
# via -r github-actions.in
|
Loading…
Reference in a new issue