Manual Release #4
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: Release | |
| on: | |
| workflow_dispatch: | |
| inputs: | |
| publish_testpypi: | |
| description: "Publish the built distribution to TestPyPI" | |
| required: true | |
| default: "false" | |
| type: choice | |
| options: | |
| - "false" | |
| - "true" | |
| publish_pypi: | |
| description: "Publish the built distribution to PyPI" | |
| required: true | |
| default: "false" | |
| type: choice | |
| options: | |
| - "false" | |
| - "true" | |
| permissions: | |
| contents: read | |
| concurrency: | |
| group: release-${{ github.ref_name }} | |
| cancel-in-progress: false | |
| jobs: | |
| validate-release: | |
| name: Validate release intent | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Confirm manual release dispatch | |
| run: | | |
| if [ "${{ github.event_name }}" != "workflow_dispatch" ]; then | |
| echo "::error::Release publication is only available through workflow_dispatch." | |
| exit 1 | |
| fi | |
| - name: Prevent publishing both package indexes in one run | |
| if: github.event.inputs.publish_testpypi == 'true' && github.event.inputs.publish_pypi == 'true' | |
| run: | | |
| echo "::error::Publish to TestPyPI and PyPI in separate manual release runs." | |
| exit 1 | |
| - name: Require main for PyPI publication | |
| if: github.event.inputs.publish_pypi == 'true' && github.ref != 'refs/heads/main' | |
| run: | | |
| echo "::error::PyPI publication is only allowed from the main branch." | |
| exit 1 | |
| build: | |
| name: Build and verify distribution | |
| needs: validate-release | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Check out repository | |
| uses: actions/checkout@v6 | |
| with: | |
| persist-credentials: false | |
| - name: Set up Python | |
| uses: actions/setup-python@v6 | |
| with: | |
| python-version: "3.14" | |
| cache: pip | |
| - name: Install build tools and package | |
| run: | | |
| python -m pip install --upgrade pip | |
| python -m pip install -e ".[dev]" build twine | |
| - name: Run tests | |
| run: pytest | |
| - name: Run Django checks | |
| run: python manage.py check | |
| - name: Check migrations are current | |
| run: python manage.py makemigrations --check --dry-run | |
| - name: Compile Python sources | |
| run: python -m compileall tradingcodex_cli tradingcodex_service apps tests | |
| - name: Build source and wheel distributions | |
| run: python -m build | |
| - name: Validate distribution metadata | |
| run: python -m twine check dist/* | |
| - name: Upload distributions | |
| uses: actions/upload-artifact@v7 | |
| with: | |
| name: python-package-distributions | |
| path: dist/ | |
| publish-testpypi: | |
| name: Publish to TestPyPI | |
| needs: build | |
| if: github.event_name == 'workflow_dispatch' && github.event.inputs.publish_testpypi == 'true' | |
| runs-on: ubuntu-latest | |
| environment: | |
| name: testpypi | |
| url: https://test.pypi.org/p/tradingcodex | |
| permissions: | |
| contents: read | |
| id-token: write | |
| steps: | |
| - name: Download distributions | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: python-package-distributions | |
| path: dist/ | |
| - name: Publish to TestPyPI | |
| uses: pypa/gh-action-pypi-publish@release/v1 | |
| with: | |
| repository-url: https://test.pypi.org/legacy/ | |
| publish-pypi: | |
| name: Publish to PyPI | |
| needs: build | |
| if: github.event_name == 'workflow_dispatch' && github.event.inputs.publish_pypi == 'true' | |
| runs-on: ubuntu-latest | |
| environment: | |
| name: pypi | |
| url: https://pypi.org/p/tradingcodex | |
| permissions: | |
| contents: read | |
| id-token: write | |
| steps: | |
| - name: Download distributions | |
| uses: actions/download-artifact@v8 | |
| with: | |
| name: python-package-distributions | |
| path: dist/ | |
| - name: Publish to PyPI | |
| uses: pypa/gh-action-pypi-publish@release/v1 |