mirror of
https://github.com/openai/codex.git
synced 2026-09-10 20:26:47 +00:00
## What changed Add a downstream workflow that builds the Python SDK and runtime from the stable CLI release commit, using the CLI version for both packages and the SDK's exact runtime dependency. Publish and verify the runtime on PyPI before publishing the SDK. Require a successful CLI `release` job, an unchanged release tag, and complete runtime assets. Skip CLI prereleases and allow publication despite unrelated publisher failures. Support retries by CLI workflow run ID and accept existing PyPI uploads while verifying the complete release. Document release setup, retry procedures, and independent SDK releases. ## Testing Add resolver unit tests covering tag resolution, prerelease skipping, partial reruns, pagination, invalid runs, moved tags, missing assets, and equivalent automatic and manual release resolution. GitOrigin-RevId: 4ec6b2e77c94c851507dbe7200ea420994fce36e
157 lines
5.2 KiB
YAML
157 lines
5.2 KiB
YAML
name: python-sdk-cli-release
|
|
|
|
on:
|
|
workflow_run:
|
|
workflows: [rust-release]
|
|
types: [completed]
|
|
workflow_dispatch:
|
|
inputs:
|
|
cli_run_id:
|
|
description: "Stable rust-release run to publish or retry."
|
|
required: true
|
|
type: string
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: python-sdk-cli-release-${{ github.event.workflow_run.id || inputs.cli_run_id }}
|
|
cancel-in-progress: false
|
|
|
|
jobs:
|
|
resolve-cli-release:
|
|
if: github.repository == 'openai/codex'
|
|
runs-on: ubuntu-latest
|
|
permissions:
|
|
contents: read
|
|
actions: read
|
|
outputs:
|
|
publish: ${{ steps.release.outputs.publish }}
|
|
version: ${{ steps.release.outputs.version }}
|
|
source_sha: ${{ steps.release.outputs.source_sha }}
|
|
steps:
|
|
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
with:
|
|
persist-credentials: false
|
|
- name: Resolve the completed CLI release
|
|
id: release
|
|
env:
|
|
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
CLI_RUN_ID: ${{ github.event.workflow_run.id || inputs.cli_run_id }}
|
|
run: |
|
|
python3 .github/scripts/resolve_python_cli_release.py "$CLI_RUN_ID" \
|
|
--repository "$GITHUB_REPOSITORY" \
|
|
--event-path "$GITHUB_EVENT_PATH" \
|
|
--github-output "$GITHUB_OUTPUT"
|
|
|
|
prepare-python-runtime:
|
|
name: prepare-python-runtime
|
|
needs: resolve-cli-release
|
|
if: needs.resolve-cli-release.outputs.publish == 'true'
|
|
permissions:
|
|
contents: read
|
|
uses: ./.github/workflows/python-runtime-build.yml
|
|
with:
|
|
runtime_version: ${{ needs.resolve-cli-release.outputs.version }}
|
|
source_ref: ${{ needs.resolve-cli-release.outputs.source_sha }}
|
|
|
|
build-python-sdk:
|
|
name: build-python-sdk
|
|
needs: resolve-cli-release
|
|
if: needs.resolve-cli-release.outputs.publish == 'true'
|
|
permissions:
|
|
contents: read
|
|
uses: ./.github/workflows/python-sdk-build.yml
|
|
with:
|
|
sdk_version: ${{ needs.resolve-cli-release.outputs.version }}
|
|
runtime_version: ${{ needs.resolve-cli-release.outputs.version }}
|
|
source_ref: ${{ needs.resolve-cli-release.outputs.source_sha }}
|
|
|
|
# Publish from the top-level workflow: PyPI does not support reusable
|
|
# workflows as Trusted Publishers. The runtime must be available before
|
|
# publishing the SDK that depends on it.
|
|
publish-python-runtime:
|
|
if: github.repository == 'openai/codex'
|
|
name: publish-python-runtime
|
|
needs:
|
|
- prepare-python-runtime
|
|
- build-python-sdk
|
|
- resolve-cli-release
|
|
runs-on: ubuntu-latest
|
|
environment: pypi
|
|
permissions:
|
|
contents: read
|
|
id-token: write # Required for PyPI trusted publishing.
|
|
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
with:
|
|
ref: ${{ needs.resolve-cli-release.outputs.source_sha }}
|
|
persist-credentials: false
|
|
|
|
- name: Download Python runtime wheels
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
name: python-runtime-wheels
|
|
path: dist/python-runtime
|
|
|
|
- name: Publish Python runtime wheels to PyPI
|
|
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
with:
|
|
packages-dir: dist/python-runtime
|
|
skip-existing: true
|
|
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
with:
|
|
version: "0.11.3"
|
|
|
|
- name: Verify Python runtime wheels are available on PyPI
|
|
env:
|
|
PYTHON_RUNTIME_VERSION: ${{ needs.resolve-cli-release.outputs.version }}
|
|
run: |
|
|
uv run --no-project --with packaging==26.2 python .github/scripts/verify_pypi_release.py \
|
|
openai-codex-cli-bin "$PYTHON_RUNTIME_VERSION"
|
|
|
|
publish-python-sdk:
|
|
name: publish-python-sdk
|
|
needs:
|
|
- build-python-sdk
|
|
- publish-python-runtime
|
|
- resolve-cli-release
|
|
runs-on: ubuntu-latest
|
|
environment: pypi
|
|
permissions:
|
|
contents: read
|
|
id-token: write # Required for PyPI trusted publishing.
|
|
|
|
steps:
|
|
- name: Checkout repository
|
|
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
|
|
with:
|
|
ref: ${{ needs.resolve-cli-release.outputs.source_sha }}
|
|
persist-credentials: false
|
|
|
|
- name: Download Python SDK package
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
name: python-sdk-package
|
|
path: dist/python-sdk
|
|
|
|
- name: Publish Python SDK to PyPI
|
|
uses: pypa/gh-action-pypi-publish@dc37677b2e1c63e2034f94d8a5b11f265b73ba33 # v1.14.2
|
|
with:
|
|
packages-dir: dist/python-sdk
|
|
skip-existing: true
|
|
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
|
|
with:
|
|
version: "0.11.3"
|
|
|
|
- name: Verify Python SDK is available on PyPI
|
|
env:
|
|
SDK_VERSION: ${{ needs.resolve-cli-release.outputs.version }}
|
|
run: uv run --no-project --with packaging==26.2 python .github/scripts/verify_pypi_release.py openai-codex "$SDK_VERSION"
|