1
0
mirror of https://github.com/pypa/gh-action-pypi-publish synced 2024-11-30 21:22:28 +08:00

Compare commits

...

17 Commits

Author SHA1 Message Date
Sebastian Weigand
0b16008aa7
Merge aabe83c06d into 15c56dba36 2024-11-07 00:02:45 +01:00
Sviatoslav Sydorenko (Святослав Сидоренко)
15c56dba36
Merge pull request #297 from trail-of-forks/ww/bump-pypi-attestations
requirements: bump pypi-attestations to 0.0.15
2024-11-07 00:00:24 +01:00
William Woodruff
fe8d1484ba
requirements: bump pypi-attestations to 0.0.15
Signed-off-by: William Woodruff <william@trailofbits.com>
2024-11-06 17:53:10 -05:00
Sviatoslav Sydorenko (Святослав Сидоренко)
1f5d4ec244
Merge pull request #295 from trail-of-forks/ww/fix-sdist-collection 2024-11-06 20:01:10 +01:00
William Woodruff
fec2f0c0ce
attestations: collect *.zip sdists as well
Signed-off-by: William Woodruff <william@trailofbits.com>
2024-11-06 13:43:44 -05:00
Sviatoslav Sydorenko (Святослав Сидоренко)
a8b73a6d88
Merge pull request #294 from webknjaz/bugfixes/optional-python 2024-11-06 16:24:24 +01:00
Sviatoslav Sydorenko
9b4dfb0c84
Pre-install Python if there's none
This is not usually the case for GitHub-hosted Runners but it might
happen with self-hosted runners.

Fixes #289.
2024-11-06 16:20:12 +01:00
Sviatoslav Sydorenko (Святослав Сидоренко)
0a87186d5f
Merge pull request #293 from webknjaz/bugfixes/uncheckout-intermediate-action 2024-11-06 15:50:37 +01:00
Sviatoslav Sydorenko
dfcfeca43e
🧪 Use prefetched action to make trampoline
Previously, the action repository was being cloned from the remote
twice, unnecessarily. This patch eliminates this step and
uses the copy that was checked out on job start.

The generated trampoline action is still copied into the allowlisted
working directory so it can be referenced by the relative path
starting with `./`.

It is now output under
`./.github/.tmp/.generated-actions/run-pypi-publish-in-docker-container`
which mutates the end-user's workspace slightly but uses a path that
is unlikely to clash with somebody else's use.

Unfortunately, we cannot use randomized paths because the composite
action syntax does not allow accessing variables in `uses:`.

Fixes #292.
2024-11-06 15:47:43 +01:00
s-weigand
aabe83c06d Added sha of original commit to tag commit message 2020-11-09 17:36:18 +01:00
s-weigand
bf26813dfe Improved tag message 2020-11-06 15:58:16 +01:00
s-weigand
1ef704e0ad Split up git user setup, tag creation and tag pushing in separate tasks
See https://github.com/pypa/gh-action-pypi-publish/pull/45#discussion_r517258942
2020-11-06 15:48:44 +01:00
Sebastian Weigand
5fbbe92f7f
Make Tag pushing atomic
Co-authored-by: Sviatoslav Sydorenko <wk.cvs.github@sydorenko.org.ua>
2020-11-06 15:39:23 +01:00
Sebastian Weigand
54e3ca66c3 Unnest outpust creation
Co-authored-by: Sviatoslav Sydorenko <wk.cvs.github@sydorenko.org.ua>
2020-11-06 15:37:11 +01:00
s-weigand
5baaafca44 Applied requested changes 2020-11-04 00:51:15 +01:00
s-weigand
b78d2e95c3 Use 'shell : python' instead of script 2020-11-04 00:50:55 +01:00
s-weigand
e34653ec97 Add major-minor-release workflow 2020-11-03 16:55:19 +01:00
6 changed files with 111 additions and 12 deletions

View File

@ -0,0 +1,62 @@
name: "Publish Major-Minor-Tags"
on:
push:
tags:
- "v*"
jobs:
push-tags:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.8
uses: actions/setup-python@v2
with:
python-version: 3.8
- name: Install packaging
run: python -m pip install -U packaging --user
- name: Get versions
id: get_versions
shell: python
run: |
from packaging.version import parse
tag_ref = "${{ github.ref }}"
tag_name = tag_ref.split("/")[-1]
version = parse(tag_name)
print(f"tag_name: {tag_name}")
print(f"version: {version}")
if version.is_prerelease:
print("No tags created (dev or pre version)!")
exit(0)
print("Creating new major and minor tags!")
print(f"::set-output name=original_tag_name::{tag_name}")
print(f"::set-output name=major_version::v{version.major}")
print(f"::set-output name=minor_version::v{version.major}.{version.minor}")
- name: Setup git user as [bot]
run: |
git config user.email 'github-actions[bot]@users.noreply.github.com'
git config user.name 'github-actions[bot]'
- name: Create major + minor tags
if: steps.get_versions.outputs.original_tag_name != ''
env:
original_tag_name: ${{ steps.get_versions.outputs.original_tag_name }}
major_version: ${{ steps.get_versions.outputs.major_version }}
minor_version: ${{ steps.get_versions.outputs.minor_version }}
run: |
git tag --annotate '${{ env.major_version }}' \
--message='Major version tag of: ${{ env.original_tag_name }}' \
--message="Original tag SHA1: $(git rev-parse ${{ env.original_tag_name }})"
git tag --annotate '${{ env.minor_version }}' \
--message='Minor version tag of: ${{ env.original_tag_name }}' \
--message="Original tag SHA1: $(git rev-parse ${{ env.original_tag_name }})"
- name: Push major + minor tags
if: steps.get_versions.outputs.original_tag_name != ''
env:
major_version: ${{ steps.get_versions.outputs.major_version }}
minor_version: ${{ steps.get_versions.outputs.minor_version }}
run: |
git push --force --atomic origin \
'${{ env.major_version }}' \
'${{ env.minor_version }}'

View File

@ -130,24 +130,44 @@ runs:
PR_REF: ${{ github.event.pull_request.head.ref }} PR_REF: ${{ github.event.pull_request.head.ref }}
PR_REPO: ${{ github.event.pull_request.head.repo.full_name }} PR_REPO: ${{ github.event.pull_request.head.repo.full_name }}
PR_REPO_ID: ${{ github.event.pull_request.base.repo.id }} PR_REPO_ID: ${{ github.event.pull_request.base.repo.id }}
- name: Check out action repo - name: Discover pre-installed Python
uses: actions/checkout@v4 id: pre-installed-python
run: |
# 🔎 Discover pre-installed Python
echo "python-path=$(command -v python3 || :)" | tee -a "${GITHUB_OUTPUT}"
shell: bash
- name: Install Python 3
if: steps.pre-installed-python.outputs.python-path == ''
id: new-python
uses: actions/setup-python@v5
with: with:
path: action-repo python-version: 3.x
ref: ${{ steps.set-repo-and-ref.outputs.ref }}
repository: ${{ steps.set-repo-and-ref.outputs.repo }}
- name: Create Docker container action - name: Create Docker container action
run: | run: |
# Create Docker container action # Create Docker container action
python create-docker-action.py ${{
steps.pre-installed-python.outputs.python-path == ''
&& steps.new-python.outputs.python-path
|| steps.pre-installed-python.outputs.python-path
}} '${{ github.action_path }}/create-docker-action.py'
env: env:
REF: ${{ steps.set-repo-and-ref.outputs.ref }} REF: ${{ steps.set-repo-and-ref.outputs.ref }}
REPO: ${{ steps.set-repo-and-ref.outputs.repo }} REPO: ${{ steps.set-repo-and-ref.outputs.repo }}
REPO_ID: ${{ steps.set-repo-and-ref.outputs.repo-id }} REPO_ID: ${{ steps.set-repo-and-ref.outputs.repo-id }}
shell: bash shell: bash
working-directory: action-repo
- name: Run Docker container - name: Run Docker container
uses: ./action-repo/.github/actions/run-docker-container # The generated trampoline action must exist in the allowlisted
# runner-defined working directory so it can be referenced by the
# relative path starting with `./`.
#
# This mutates the end-user's workspace slightly but uses a path
# that is unlikely to clash with somebody else's use.
#
# We cannot use randomized paths because the composite action
# syntax does not allow accessing variables in `uses:`. This
# means that we end up having to hardcode this path both here and
# in `create-docker-action.py`.
uses: ./.github/.tmp/.generated-actions/run-pypi-publish-in-docker-container
with: with:
user: ${{ inputs.user }} user: ${{ inputs.user }}
password: ${{ inputs.password }} password: ${{ inputs.password }}

View File

@ -54,6 +54,7 @@ def debug(msg: str):
def collect_dists(packages_dir: Path) -> list[Path]: def collect_dists(packages_dir: Path) -> list[Path]:
# Collect all sdists and wheels. # Collect all sdists and wheels.
dist_paths = [sdist.resolve() for sdist in packages_dir.glob('*.tar.gz')] dist_paths = [sdist.resolve() for sdist in packages_dir.glob('*.tar.gz')]
dist_paths.extend(sdist.resolve() for sdist in packages_dir.glob('*.zip'))
dist_paths.extend(whl.resolve() for whl in packages_dir.glob('*.whl')) dist_paths.extend(whl.resolve() for whl in packages_dir.glob('*.whl'))
# Make sure everything that looks like a dist actually is one. # Make sure everything that looks like a dist actually is one.

View File

@ -10,10 +10,12 @@ REPO = os.environ['REPO']
REPO_ID = os.environ['REPO_ID'] REPO_ID = os.environ['REPO_ID']
REPO_ID_GH_ACTION = '178055147' REPO_ID_GH_ACTION = '178055147'
ACTION_SHELL_CHECKOUT_PATH = pathlib.Path(__file__).parent.resolve()
def set_image(ref: str, repo: str, repo_id: str) -> str: def set_image(ref: str, repo: str, repo_id: str) -> str:
if repo_id == REPO_ID_GH_ACTION: if repo_id == REPO_ID_GH_ACTION:
return '../../../Dockerfile' return str(ACTION_SHELL_CHECKOUT_PATH / 'Dockerfile')
docker_ref = ref.replace('/', '-') docker_ref = ref.replace('/', '-')
return f'docker://ghcr.io/{repo}:{docker_ref}' return f'docker://ghcr.io/{repo}:{docker_ref}'
@ -70,6 +72,20 @@ action = {
}, },
} }
action_path = pathlib.Path('.github/actions/run-docker-container/action.yml') # The generated trampoline action must exist in the allowlisted
# runner-defined working directory so it can be referenced by the
# relative path starting with `./`.
#
# This mutates the end-user's workspace slightly but uses a path
# that is unlikely to clash with somebody else's use.
#
# We cannot use randomized paths because the composite action
# syntax does not allow accessing variables in `uses:`. This
# means that we end up having to hardcode this path both here and
# in `action.yml`.
action_path = pathlib.Path(
'.github/.tmp/.generated-actions/'
'run-pypi-publish-in-docker-container/action.yml',
)
action_path.parent.mkdir(parents=True, exist_ok=True) action_path.parent.mkdir(parents=True, exist_ok=True)
action_path.write_text(json.dumps(action, ensure_ascii=False), encoding='utf-8') action_path.write_text(json.dumps(action, ensure_ascii=False), encoding='utf-8')

View File

@ -10,7 +10,7 @@ id ~= 1.0
requests requests
# NOTE: Used to generate attestations. # NOTE: Used to generate attestations.
pypi-attestations ~= 0.0.13 pypi-attestations ~= 0.0.15
sigstore ~= 3.5.1 sigstore ~= 3.5.1
# NOTE: Used to detect the PyPI package name from the distribution files # NOTE: Used to detect the PyPI package name from the distribution files

View File

@ -93,7 +93,7 @@ pyjwt==2.8.0
# via sigstore # via sigstore
pyopenssl==24.1.0 pyopenssl==24.1.0
# via sigstore # via sigstore
pypi-attestations==0.0.13 pypi-attestations==0.0.15
# via -r runtime.in # via -r runtime.in
python-dateutil==2.9.0.post0 python-dateutil==2.9.0.post0
# via betterproto # via betterproto