mirror of
https://github.com/pypa/gh-action-pypi-publish.git
synced 2024-11-23 17:11:07 -05:00
Merge pull request #230 from br3ndonland/ghcr
Build Docker image and push to GHCR
This commit is contained in:
commit
61da13deb5
4 changed files with 224 additions and 15 deletions
54
.github/workflows/build-and-push-docker-image.yml
vendored
Normal file
54
.github/workflows/build-and-push-docker-image.yml
vendored
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
---
|
||||||
|
|
||||||
|
name: 🏗️
|
||||||
|
|
||||||
|
on: # yamllint disable-line rule:truthy
|
||||||
|
pull_request:
|
||||||
|
push:
|
||||||
|
branches: ["release/*", "unstable/*"]
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: Docker image tag
|
||||||
|
required: true
|
||||||
|
type: string
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
smoke-test:
|
||||||
|
uses: ./.github/workflows/reusable-smoke-test.yml
|
||||||
|
build-and-push:
|
||||||
|
if: github.event_name != 'pull_request'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
needs:
|
||||||
|
- smoke-test
|
||||||
|
timeout-minutes: 10
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
- name: Build Docker image
|
||||||
|
run: |
|
||||||
|
DOCKER_TAG="${DOCKER_TAG/'/'/'-'}"
|
||||||
|
DOCKER_TAG_MAJOR=$(echo "$DOCKER_TAG" | cut -d '.' -f 1)
|
||||||
|
DOCKER_TAG_MAJOR_MINOR=$(echo "$DOCKER_TAG" | cut -d '.' -f 1-2)
|
||||||
|
IMAGE="ghcr.io/$GITHUB_REPOSITORY:${DOCKER_TAG}"
|
||||||
|
IMAGE_MAJOR="ghcr.io/$GITHUB_REPOSITORY:${DOCKER_TAG_MAJOR}"
|
||||||
|
IMAGE_MAJOR_MINOR="ghcr.io/$GITHUB_REPOSITORY:${DOCKER_TAG_MAJOR_MINOR}"
|
||||||
|
echo "IMAGE=$IMAGE" >>"$GITHUB_ENV"
|
||||||
|
echo "IMAGE_MAJOR=$IMAGE_MAJOR" >>"$GITHUB_ENV"
|
||||||
|
echo "IMAGE_MAJOR_MINOR=$IMAGE_MAJOR_MINOR" >>"$GITHUB_ENV"
|
||||||
|
docker build . \
|
||||||
|
--build-arg BUILDKIT_INLINE_CACHE=1 \
|
||||||
|
--cache-from $IMAGE \
|
||||||
|
--tag $IMAGE
|
||||||
|
docker tag $IMAGE $IMAGE_MAJOR
|
||||||
|
docker tag $IMAGE $IMAGE_MAJOR_MINOR
|
||||||
|
env:
|
||||||
|
DOCKER_TAG: ${{ inputs.tag || github.ref_name }}
|
||||||
|
- name: Log in to GHCR
|
||||||
|
run: >-
|
||||||
|
echo ${{ secrets.GITHUB_TOKEN }} |
|
||||||
|
docker login ghcr.io -u $GITHUB_ACTOR --password-stdin
|
||||||
|
- name: Push Docker image to GHCR
|
||||||
|
run: |
|
||||||
|
docker push $IMAGE
|
||||||
|
docker push $IMAGE_MAJOR
|
||||||
|
docker push $IMAGE_MAJOR_MINOR
|
|
@ -1,10 +1,9 @@
|
||||||
---
|
---
|
||||||
|
|
||||||
name: 🧪
|
name: ♻️ 🧪
|
||||||
|
|
||||||
on: # yamllint disable-line rule:truthy
|
on: # yamllint disable-line rule:truthy
|
||||||
push:
|
workflow_call:
|
||||||
pull_request:
|
|
||||||
|
|
||||||
env:
|
env:
|
||||||
devpi-password: abcd1234
|
devpi-password: abcd1234
|
||||||
|
@ -27,7 +26,33 @@ env:
|
||||||
PYTEST_THEME_MODE
|
PYTEST_THEME_MODE
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
fail-fast:
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [macos-latest, windows-latest]
|
||||||
|
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
|
||||||
|
timeout-minutes: 2
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Check out the action locally
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
path: test
|
||||||
|
- name: Fail-fast in unsupported environments
|
||||||
|
continue-on-error: true
|
||||||
|
id: fail-fast
|
||||||
|
uses: ./test
|
||||||
|
- name: Error if action did not fail-fast in unsupported environments
|
||||||
|
if: steps.fail-fast.outcome == 'success'
|
||||||
|
run: |
|
||||||
|
>&2 echo This action should fail-fast in unsupported environments.
|
||||||
|
exit 1
|
||||||
|
|
||||||
smoke-test:
|
smoke-test:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
services:
|
services:
|
79
action.yml
79
action.yml
|
@ -91,15 +91,70 @@ branding:
|
||||||
color: yellow
|
color: yellow
|
||||||
icon: upload-cloud
|
icon: upload-cloud
|
||||||
runs:
|
runs:
|
||||||
using: docker
|
using: composite
|
||||||
image: Dockerfile
|
steps:
|
||||||
args:
|
- name: Fail-fast in unsupported environments
|
||||||
- ${{ inputs.user }}
|
if: runner.os != 'Linux'
|
||||||
- ${{ inputs.password }}
|
run: |
|
||||||
- ${{ inputs.repository-url }}
|
>&2 echo This action is only able to run under GNU/Linux environments
|
||||||
- ${{ inputs.packages-dir }}
|
exit 1
|
||||||
- ${{ inputs.verify-metadata }}
|
shell: bash -eEuo pipefail {0}
|
||||||
- ${{ inputs.skip-existing }}
|
- name: Reset path if needed
|
||||||
- ${{ inputs.verbose }}
|
run: |
|
||||||
- ${{ inputs.print-hash }}
|
# Reset path if needed
|
||||||
- ${{ inputs.attestations }}
|
# 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 || env.PR_REF || github.ref_name }}
|
||||||
|
REPO=${{ env.ACTION_REPO || env.PR_REPO || github.repository }}
|
||||||
|
REPO_ID=${{ env.PR_REPO_ID || github.repository_id }}
|
||||||
|
echo "ref=$REF" >>"$GITHUB_OUTPUT"
|
||||||
|
echo "repo=$REPO" >>"$GITHUB_OUTPUT"
|
||||||
|
echo "repo-id=$REPO_ID" >>"$GITHUB_OUTPUT"
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
ACTION_REF: ${{ github.action_ref }}
|
||||||
|
ACTION_REPO: ${{ github.action_repository }}
|
||||||
|
PR_REF: ${{ github.event.pull_request.head.ref }}
|
||||||
|
PR_REPO: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
|
PR_REPO_ID: ${{ github.event.pull_request.base.repo.id }}
|
||||||
|
- 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: |
|
||||||
|
# Create Docker container action
|
||||||
|
python create-docker-action.py
|
||||||
|
env:
|
||||||
|
REF: ${{ steps.set-repo-and-ref.outputs.ref }}
|
||||||
|
REPO: ${{ steps.set-repo-and-ref.outputs.repo }}
|
||||||
|
REPO_ID: ${{ steps.set-repo-and-ref.outputs.repo-id }}
|
||||||
|
shell: bash
|
||||||
|
working-directory: action-repo
|
||||||
|
- name: Run Docker container
|
||||||
|
uses: ./action-repo/.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 }}
|
||||||
|
|
75
create-docker-action.py
Normal file
75
create-docker-action.py
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
import json
|
||||||
|
import os
|
||||||
|
import pathlib
|
||||||
|
|
||||||
|
DESCRIPTION = 'description'
|
||||||
|
REQUIRED = 'required'
|
||||||
|
|
||||||
|
REF = os.environ['REF']
|
||||||
|
REPO = os.environ['REPO']
|
||||||
|
REPO_ID = os.environ['REPO_ID']
|
||||||
|
REPO_ID_GH_ACTION = '178055147'
|
||||||
|
|
||||||
|
|
||||||
|
def set_image(ref: str, repo: str, repo_id: str) -> str:
|
||||||
|
if repo_id == REPO_ID_GH_ACTION:
|
||||||
|
return '../../../Dockerfile'
|
||||||
|
docker_ref = ref.replace('/', '-')
|
||||||
|
return f'docker://ghcr.io/{repo}:{docker_ref}'
|
||||||
|
|
||||||
|
|
||||||
|
image = set_image(REF, REPO, REPO_ID)
|
||||||
|
|
||||||
|
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,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
action_path = pathlib.Path('.github/actions/run-docker-container/action.yml')
|
||||||
|
action_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
|
action_path.write_text(json.dumps(action, ensure_ascii=False), encoding='utf-8')
|
Loading…
Reference in a new issue