Publish to PyPI #40
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Publish to PyPI | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| version: | |
| description: "Version to publish (e.g., 0.1.0)" | |
| required: true | |
| type: string | |
| jobs: | |
| test: | |
| runs-on: ubuntu-latest | |
| strategy: | |
| matrix: | |
| python-version: ["3.10", "3.11", "3.12", "3.13"] | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Python ${{ matrix.python-version }} | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: ${{ matrix.python-version }} | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e ".[dev]" | |
| - name: Run tests | |
| run: | | |
| python -m pytest tests/ -v | |
| lint: | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.12" | |
| - name: Install dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install -e ".[dev]" | |
| - name: Run ruff | |
| run: | | |
| ruff check src/ tests/ | |
| ruff format --check src/ tests/ | |
| - name: Run mypy | |
| run: | | |
| mypy src/ | |
| publish: | |
| needs: [test, lint] | |
| runs-on: ubuntu-latest | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| token: ${{ secrets.GITHUB_TOKEN }} | |
| fetch-depth: 0 # Fetch all history including tags (necessary for changelog generation) | |
| - name: Set up Python | |
| uses: actions/setup-python@v5 | |
| with: | |
| python-version: "3.12" | |
| - name: Set version | |
| id: version | |
| run: | | |
| VERSION="${{ github.event.inputs.version }}" | |
| echo "VERSION=$VERSION" >> $GITHUB_ENV | |
| echo "version=$VERSION" >> $GITHUB_OUTPUT | |
| - name: Update version | |
| run: | | |
| python scripts/update_version.py "${{ env.VERSION }}" | |
| - name: Install build dependencies | |
| run: | | |
| python -m pip install --upgrade pip | |
| pip install build twine | |
| - name: Build package | |
| run: python -m build | |
| - name: Check package | |
| run: twine check dist/* | |
| - name: Publish to PyPI | |
| env: | |
| TWINE_USERNAME: __token__ | |
| TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} | |
| run: | | |
| twine upload dist/* | |
| echo "Package published to PyPI" | |
| echo "Install with: pip install claude-agent-sdk==${{ env.VERSION }}" | |
| - name: Get previous release tag | |
| id: previous_tag | |
| run: | | |
| PREVIOUS_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "") | |
| echo "previous_tag=$PREVIOUS_TAG" >> $GITHUB_OUTPUT | |
| echo "Previous release: $PREVIOUS_TAG" | |
| - name: Create release branch and commit version changes | |
| run: | | |
| # Create a new branch for the version update | |
| BRANCH_NAME="release/v${{ env.VERSION }}" | |
| echo "BRANCH_NAME=$BRANCH_NAME" >> $GITHUB_ENV | |
| # Configure git | |
| git config --local user.email "github-actions[bot]@users.noreply.github.com" | |
| git config --local user.name "github-actions[bot]" | |
| # Create and switch to new branch | |
| git checkout -b "$BRANCH_NAME" | |
| # Commit version changes | |
| git add pyproject.toml src/claude_agent_sdk/_version.py | |
| git commit -m "chore: bump version to ${{ env.VERSION }}" | |
| - name: Update changelog with Claude | |
| continue-on-error: true | |
| uses: anthropics/claude-code-action@v1 | |
| with: | |
| prompt: "/generate-changelog new version: ${{ env.VERSION }}, old version: ${{ steps.previous_tag.outputs.previous_tag }}" | |
| anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }} | |
| github_token: ${{ secrets.GITHUB_TOKEN }} | |
| claude_args: | | |
| --allowedTools 'Bash(git add:*),Bash(git commit:*),Edit' | |
| - name: Push branch and create PR | |
| env: | |
| GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| # Push the branch with all commits | |
| git push origin "${{ env.BRANCH_NAME }}" | |
| # Create PR using GitHub CLI | |
| PR_BODY="This PR updates the version to ${{ env.VERSION }} after publishing to PyPI. | |
| ## Changes | |
| - Updated version in \`pyproject.toml\` | |
| - Updated version in \`src/claude_agent_sdk/_version.py\` | |
| - Updated \`CHANGELOG.md\` with release notes | |
| ## Release Information | |
| - Published to PyPI: https://pypi.org/project/claude-agent-sdk/${{ env.VERSION }}/ | |
| - Install with: \`pip install claude-agent-sdk==${{ env.VERSION }}\` | |
| 🤖 Generated by GitHub Actions" | |
| PR_URL=$(gh pr create \ | |
| --title "chore: release v${{ env.VERSION }}" \ | |
| --body "$PR_BODY" \ | |
| --base main \ | |
| --head "${{ env.BRANCH_NAME }}") | |
| echo "PR created: $PR_URL" |