name: Publish Python Packages on: push: tags: - 'v*' workflow_dispatch: inputs: package: description: 'Package to publish (aitbc-sdk, aitbc-crypto, or all)' required: true default: 'all' dry_run: description: 'Dry run (build only, no publish)' required: false default: false type: boolean jobs: publish: runs-on: ubuntu-latest permissions: contents: read id-token: write # IMPORTANT: this permission is mandatory for trusted publishing steps: - name: Checkout repository uses: actions/checkout@v4 with: fetch-depth: 0 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.11' - name: Install build dependencies run: | python -m pip install --upgrade pip pip install build twine - name: Build aitbc-crypto if: ${{ github.event.inputs.package == 'all' || github.event.inputs.package == 'aitbc-crypto' }} run: | cd packages/py/aitbc-crypto python -m build - name: Build aitbc-sdk if: ${{ github.event.inputs.package == 'all' || github.event.inputs.package == 'aitbc-sdk' }} run: | cd packages/py/aitbc-sdk python -m build - name: Check packages run: | for dist in packages/py/*/dist/*; do echo "Checking $dist" python -m twine check "$dist" done - name: Publish to PyPI if: ${{ github.event.inputs.dry_run != 'true' }} run: | for dist in packages/py/*/dist/*; do echo "Publishing $dist" python -m twine upload --skip-existing "$dist" || true done - name: Dry run - check only if: ${{ github.event.inputs.dry_run == 'true' }} run: | echo "Dry run complete - packages built and checked but not published" ls -la packages/py/*/dist/