77
88permissions :
99 contents : read
10- id-token : write
10+ id-token : write # Required for PyPI trusted publishing / attestations
11+
12+ concurrency :
13+ group : release
14+ cancel-in-progress : false
1115
1216env :
1317 PYTHON_VERSION : " 3.12"
@@ -16,17 +20,18 @@ jobs:
1620 release :
1721 runs-on : ubuntu-latest
1822 steps :
19- - uses : actions/checkout@v4
23+ - uses : actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
24+
2025 - name : Install uv
21- uses : astral-sh/setup-uv@v5
26+ uses : astral-sh/setup-uv@d4b2f3b6ecc6e67c4457f6d3e41ec42d3d0fcb86 # v5
2227 with :
2328 python-version : ${{ env.PYTHON_VERSION }}
2429
2530 - name : Set up Python
2631 run : uv python install
2732
2833 - name : Install dependencies
29- run : uv sync --locked --group release
34+ run : uv sync --locked --only- group release --no-install-project
3035
3136 - name : Validate version matches release tag
3237 env :
@@ -39,16 +44,15 @@ jobs:
3944 fi
4045
4146 - name : Build artifact
42- run : |
43- uv build
47+ id : build
48+ run : uv build
4449
4550 - name : Publish package
46- uses : pypa/gh-action-pypi-publish@release/v1
47- with :
48- password : ${{ secrets.PYPI_API_TOKEN }}
49- skip-existing : true
51+ uses : pypa/gh-action-pypi-publish@ed0c53931b1dc9bd32cbe73a98c7f6766f8a527e # release/v1
5052
53+ # Best-effort: attempt Azure upload even if PyPI fails, but only if build succeeded.
5154 - name : Create .pypirc for Azure Artifacts
55+ if : always() && steps.build.outcome == 'success'
5256 run : |
5357 cat <<EOF > ~/.pypirc
5458 [distutils]
@@ -62,15 +66,16 @@ jobs:
6266 EOF
6367
6468 - name : Publish package to Azure Artifacts
69+ if : always() && steps.build.outcome == 'success'
6570 run : |
6671 EXIT_CODE=0
6772 uv run --no-sync twine upload -r azure dist/* || EXIT_CODE=$?
6873 if [[ $EXIT_CODE -eq 0 ]]; then
69- echo "✅ Successfully published to Azure Artifacts (or already existed)"
74+ echo "Successfully published to Azure Artifacts (or already existed)"
7075 else
71- echo "❌ Azure Artifacts upload failed, but PyPI upload succeeded"
76+ echo "Azure Artifacts upload failed, but PyPI upload succeeded"
7277 if [[ $EXIT_CODE -eq 1 ]]; then
73- echo "⚠️ This may be due to version conflicts or connectivity issues"
78+ echo "This may be due to version conflicts or connectivity issues"
7479 fi
7580 echo "This is non-critical - the package is available on PyPI"
7681 fi
0 commit comments