-
Notifications
You must be signed in to change notification settings - Fork 15
273 lines (262 loc) · 7.89 KB
/
ci_python.yml
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
# This file was initially generated by maturin v1.2.0, using:
#
# maturin generate-ci github --pytest -o ../.github/workflows/ci_python.yml
#
# TODO:
# - `safety`
# - `typeguard`
# - `xdoctest`
name: CI
on:
push:
branches:
- main
tags:
- '*'
pull_request:
branches:
- main
merge_group:
branches:
- main
defaults:
run:
shell: bash
working-directory: python
permissions:
contents: read
jobs:
# Run lint separately from the build -- it doesn't need the built Rust code.
#
# Also, only do it on one machine.
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Install poetry
run: |
pipx install poetry
poetry config virtualenvs.create true --local
poetry config virtualenvs.in-project true --local
- uses: actions/setup-python@v4
with:
python-version: 3.11
cache: poetry
- name: install deps
run: |
poetry install --only=main --only=lint
- name: black
run: |
poetry run black --diff pysrc pytests docs/source
- name: flake8
run: |
poetry run flake8 pysrc pytests docs/source
- name: isort
run: |
poetry run isort --filter-files --diff pysrc pytests docs/source
- name: darglint
run: |
poetry run darglint pysrc
- name: pydocstyle
run: |
poetry run pydocstyle pysrc
build-wheel:
strategy:
fail-fast: false
matrix:
include:
- host: ubuntu-latest
target: x86_64
test: host
python_versions: |
3.8
3.9
3.10
3.11
- host: ubuntu-latest
target: x86
test: host
- host: ubuntu-latest
target: aarch64
test: run_on_arch
- host: ubuntu-latest
target: armv7
test: run_on_arch
#
# Fail to build `ring` crate
# - host: ubuntu-latest
# target: s390x
#
# Fail to build `ring` crate
# - host: ubuntu-latest
# target: ppc64le
#
# Linker error
# - host: windows-latest
# target: x64
#
# "your Rust target architecture (32-bit) does not match your python interpreter (64-bit)"
# - host: windows-latest
# target: x86
#
- host: macos-latest
target: x86_64
- host: macos-latest
target: aarch64
test: host
python_versions: |
3.8
3.9
3.10
3.11
runs-on: ${{ matrix.host }}
steps:
- uses: actions/checkout@v2
- name: Install poetry
run: |
pipx install poetry
poetry config virtualenvs.create true --local
poetry config virtualenvs.in-project true --local
- uses: actions/setup-python@v4
with:
python-version: ${{ matrix.python_versions || '3.11' }}
cache: poetry
- name: Install Protoc
uses: arduino/setup-protoc@v1
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
- name: Build wheels
uses: PyO3/maturin-action@v1
with:
target: ${{ matrix.target }}
args: --release --out dist
sccache: 'true'
manylinux: auto
working-directory: python
before-script-linux: |
# We need to add the protobuf-compiler since manylinux builds happen
# in a docker container that doesn't have it.
yum install -y protobuf-compiler
- name: Upload wheels
uses: actions/upload-artifact@v3
with:
name: wheels
path: ${{ github.workspace }}/python/dist
- name: pytest and mypy (host)
if: ${{ matrix.test == 'host' }}
run: |
for V in $(echo "${{ matrix.python_versions }}" | xargs); do
echo "::group::Install for Python $V"
poetry env use $V
poetry install --only=main --only=test --only=typecheck
pip install kaskada --find-links dist --force-reinstall
echo "::endgroup::"
echo "::group::Test Python $V"
poetry run pytest
echo "::endgroup::"
echo "::group::MyPy Python $V"
poetry run mypy -- --install-types --non-interacitve pysrc pytests docs/source/
echo "::endgroup::"
done
- name: pytest (on arch)
uses: uraimo/[email protected]
if: ${{ matrix.test == 'run_on_arch' }}
with:
arch: ${{ matrix.target }}
distro: ubuntu22.04
githubToken: ${{ github.token }}
dockerRunArgs: |
--volume "${{ github.workspace }}/python:/python"
install: |
apt-get update
apt-get install -y --no-install-recommends python3 python3-pip
pip3 install -U pip poetry
run: |
set -e
cd /python
echo "Directory contents"
ls
# We shouldn't need regular dependencies, since they come from
# the `pip install` of kaskada later.
poetry install --only=main --only=test --only=typecheck
pip3 install kaskada --find-links dist --force-reinstall
pytest
# Make the source distribution
sdist:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build sdist
uses: PyO3/maturin-action@v1
with:
command: sdist
args: --out dist
working-directory: python
- name: Upload sdist
uses: actions/upload-artifact@v3
with:
name: wheels
path: ${{ github.workspace }}/python/dist
# Make the documentation site
docs-build:
needs: [build-wheel]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Install poetry
run: |
pipx install poetry
poetry config virtualenvs.create true --local
poetry config virtualenvs.in-project true --local
- uses: actions/setup-python@v4
with:
python-version: 3.11
cache: poetry
- uses: actions/download-artifact@v3
with:
name: wheels
- name: Install dependencies
run: |
poetry install --only=main --only=docs --only=typecheck
pip install kaskada --find-links dist --force-reinstall
- name: Build docs
run: |
sphinx-build docs/source docs/_build -j auto
- name: Upload artifact
# Automatically uploads an artifact from the './_site' directory by default
uses: actions/upload-pages-artifact@v2
with:
path: ${{ github.workspace }}/python/docs/_build
docs-deploy:
# Deployment job
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
# Grant GITHUB_TOKEN the permissions required to make a Pages deployment
permissions:
pages: write # to deploy to Pages
id-token: write # to verify the deployment originates from an appropriate source
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
needs: [docs-build]
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v2
# release:
# name: Release
# runs-on: ubuntu-latest
# if: "startsWith(github.ref, 'refs/tags/')"
# needs: [linux, windows, macos, sdist]
# steps:
# - uses: actions/download-artifact@v3
# with:
# name: wheels
# - name: Publish to PyPI
# uses: PyO3/maturin-action@v1
# env:
# MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }}
# with:
# command: upload
# args: --skip-existing *
# working-directory: python