-
Notifications
You must be signed in to change notification settings - Fork 64
141 lines (121 loc) · 3.84 KB
/
Copy pathrelease.yml
File metadata and controls
141 lines (121 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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