Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
126 changes: 126 additions & 0 deletions .github/workflows/release-splunk-ao-adk-test.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,126 @@
name: Release splunk-ao-adk to Test PyPI

on:
pull_request: # Publishes a .dev pre-release on every PR push
Comment on lines +3 to +4

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 major (design): The pull_request: trigger has no paths: filter. Scope it to the adk package (and this workflow file) so unrelated PRs don't publish dev releases to Test PyPI.

Suggested change
on:
pull_request: # Publishes a .dev pre-release on every PR push
on:
pull_request: # Publishes a .dev pre-release on every PR push
paths:
- 'splunk-ao-adk/**'
- '.github/workflows/release-splunk-ao-adk-test.yaml'

🤖 Generated by Astra

workflow_dispatch:
inputs:
version:
description: 'Version to publish (e.g., 0.1.0, 1.2.3rc1, 1.2.3.post1). Must be an explicit version. Leave empty to use the version in pyproject.toml as-is.'
required: false
type: string

jobs:
test:
name: Run tests
runs-on: ubuntu-latest
timeout-minutes: 30
permissions:
contents: read
defaults:
run:
working-directory: splunk-ao-adk
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: '3.11'

- name: Install uv
uses: astral-sh/setup-uv@681c641aba71e4a1c380be3ab5e12ad51f415867 # v7.1.6
with:
enable-cache: true
cache-dependency-glob: "**/splunk-ao-adk/pyproject.toml"

- name: Install dependencies
run: uv sync --dev

- name: Run type check
run: uv run mypy src/

- name: Run tests
run: uv run pytest --cov=splunk_ao_adk --cov-report=xml

build:
name: Build package
needs: test # Only build if tests pass
runs-on: ubuntu-latest
permissions:
contents: read
defaults:
run:
working-directory: splunk-ao-adk
outputs:
version: ${{ steps.get-version.outputs.version }}
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Python
uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
with:
python-version: '3.11'

# PR builds: append .dev<run_number> so the clean version is never
# consumed on Test PyPI and can still be used for the real release.
- name: Set pre-release version
if: github.event_name == 'pull_request'
run: |
VERSION_BASE=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
PRE_VERSION="${VERSION_BASE}.dev${{ github.run_number }}"
sed -i "s/^version = \".*\"/version = \"${PRE_VERSION}\"/" pyproject.toml
sed -i "s/__version__ = \".*\"/__version__ = \"${PRE_VERSION}\"/" src/splunk_ao_adk/__init__.py

# Manual dispatch: validate and use the supplied version if provided.
- name: Override version
if: github.event_name == 'workflow_dispatch' && inputs.version != ''
env:
INPUT_VERSION: ${{ inputs.version }}
run: |
if ! printf '%s' "$INPUT_VERSION" | grep -Eq '^[0-9]+\.[0-9]+\.[0-9]+((a|b|rc)[0-9]+)?(\.post[0-9]+)?(\.dev[0-9]+)?$'; then
echo "::error::Invalid version '${INPUT_VERSION}'. Expected an explicit version like 0.1.0, 1.2.3rc1, or 1.2.3.post1. Bump keywords like 'patch' or 'major' are not accepted."
exit 1
fi
sed -i "s/^version = \".*\"/version = \"${INPUT_VERSION}\"/" pyproject.toml
sed -i "s/__version__ = \".*\"/__version__ = \"${INPUT_VERSION}\"/" src/splunk_ao_adk/__init__.py

- name: Get current version
id: get-version
run: |
VERSION=$(grep '^version = ' pyproject.toml | sed 's/version = "\(.*\)"/\1/')
echo "version=${VERSION}" >> "$GITHUB_OUTPUT"

- name: Build package
run: |
pip install build
python -m build

- name: Upload distributables
uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
with:
name: splunk-ao-adk-${{ steps.get-version.outputs.version }}
path: splunk-ao-adk/dist/

publish:
name: Publish to Test PyPI
needs: build # Only publish if build succeeds (which requires tests passing)
runs-on: ubuntu-latest
permissions:
id-token: write # Required for OIDC trusted publishing
environment:
name: testpypi
url: https://test.pypi.org/project/splunk-ao-adk/

steps:
- name: Download distributables
uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0
with:
name: splunk-ao-adk-${{ needs.build.outputs.version }}
path: dist/

- name: Publish to Test PyPI
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
with:
repository-url: https://test.pypi.org/legacy/
verbose: true
print-hash: true
Comment on lines +121 to +126

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟡 minor (bug): Test PyPI (like PyPI) rejects re-uploading a file for a version that already exists. The PR version is keyed on github.run_number, which stays constant across re-runs (only run_attempt changes). So re-running a failed/succeeded workflow run will fail the publish step with a 400 File already exists error. Add skip-existing: true to make re-runs idempotent.

Suggested change
- name: Publish to Test PyPI
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
with:
repository-url: https://test.pypi.org/legacy/
verbose: true
print-hash: true
- name: Publish to Test PyPI
uses: pypa/gh-action-pypi-publish@cef221092ed1bacb1cc03d23a2d87d1d172e277b # release/v1
with:
repository-url: https://test.pypi.org/legacy/
skip-existing: true
verbose: true
print-hash: true

🤖 Generated by Astra

Loading