forked from scipy/scipy
-
Notifications
You must be signed in to change notification settings - Fork 0
/
azure-pipelines.yml
381 lines (369 loc) · 13.4 KB
/
azure-pipelines.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
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
trigger:
# start a new build for every push
batch: False
branches:
include:
- main
- maintenance/*
paths:
include:
- '*'
exclude:
- 'benchmarks/*'
- './*.txt'
- 'site.cfg.example'
pr:
branches:
include:
- '*' # must quote since "*" is a YAML reserved character; we want a string
# the version of OpenBLAS used is currently 0.3.21
# and should be updated to match scipy-wheels as appropriate
variables:
openblas_version: 0.3.21.dev
pre_wheels: https://pypi.anaconda.org/scipy-wheels-nightly/simple
CCACHE_DIR: $(Pipeline.Workspace)/ccache
SCIPY_AVAILABLE_MEM: 3G
NPY_NUM_BUILD_JOBS: 2
CCACHE_COMPRESS: 1
# Using a single thread can actually speed up some computations
OPENBLAS_NUM_THREADS: 1
stages:
- stage: Check
jobs:
- job: Skip
pool:
vmImage: 'ubuntu-22.04'
variables:
DECODE_PERCENTS: 'false'
RET: 'true'
steps:
- bash: |
git_log=`git log --max-count=1 --skip=1 --pretty=format:"%B" | tr "\n" " "`
echo "##vso[task.setvariable variable=log]$git_log"
- bash: echo "##vso[task.setvariable variable=RET]false"
condition: or(contains(variables.log, '[skip azp]'), contains(variables.log, '[azp skip]'), contains(variables.log, '[skip ci]'), contains(variables.log, '[ci skip]'))
- bash: echo "##vso[task.setvariable variable=start_main;isOutput=true]$RET"
name: result
- stage: Main
condition: and(succeeded(), eq(dependencies.Check.outputs['Skip.result.start_main'], 'true'))
dependsOn: Check
variables:
AZURE_CI: 'true'
jobs:
- job: prerelease_deps_coverage_64bit_blas
timeoutInMinutes: 90
pool:
vmImage: 'ubuntu-22.04'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.9'
addToPath: true
architecture: 'x64'
- template: ci/azure-travis-template.yaml
parameters:
test_mode: full
coverage: true
numpy_spec: "--pre --upgrade --timeout=60 -i $PRE_WHEELS numpy"
other_spec: "--pre --upgrade --timeout=60"
use_64bit_blas: true
- job: refguide_asv_check
timeoutInMinutes: 90
pool:
vmImage: 'ubuntu-22.04'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.9'
addToPath: true
architecture: 'x64'
- template: ci/azure-travis-template.yaml
parameters:
test_mode: fast
numpy_spec: "numpy==1.23.5"
refguide_check: true
asv_check: true
use_wheel: true
- job: source_distribution
timeoutInMinutes: 90
pool:
vmImage: 'ubuntu-22.04'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.9'
addToPath: true
architecture: 'x64'
- template: ci/azure-travis-template.yaml
parameters:
test_mode: fast
numpy_spec: "numpy==1.21.6"
use_sdist: true
- job: wheel_optimized_gcc8
timeoutInMinutes: 90
pool:
vmImage: 'ubuntu-20.04' # 22.04 does not have gfortran-8
variables:
# The following is needed for optimized "-OO" test run but since we use
# pytest-xdist plugin for load scheduling its workers don't pick up the
# flag. This environment variable starts all Py instances in -OO mode.
PYTHONOPTIMIZE: 2
# Use gcc version 6
CC: gcc-8
CXX: g++-8
FC: gfortran-8
steps:
- script: |
set -euo pipefail
sudo apt update -y
sudo apt install -y g++-8 gcc-8 gfortran-8
displayName: 'Install GCC 8'
- task: UsePythonVersion@0
inputs:
versionSpec: '3.9'
addToPath: true
architecture: 'x64'
- template: ci/azure-travis-template.yaml
parameters:
test_mode: fast
numpy_spec: "numpy==1.21.6"
use_wheel: true
- job: Lint
condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main')) # skip for PR merges
pool:
vmImage: 'ubuntu-22.04'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: '3.9'
addToPath: true
architecture: 'x64'
- script: >-
python -m pip install ruff cython-lint
displayName: 'Install tools'
failOnStderr: false
- script: |
set -euo pipefail
# for Travis CI we used to do: git fetch --unshallow
# but apparently Azure clones are not as shallow
# so does not appear to be needed to fetch maintenance
# branches (which Azure logs show being checked out
# in Checkout stage)
python tools/lint.py --diff-against origin/$(System.PullRequest.TargetBranch)
tools/unicode-check.py
tools/check_test_name.py
displayName: 'Run Lint Checks'
failOnStderr: true
- job: Linux_Python_39_32bit_full
timeoutInMinutes: 90
condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main')) # skip for PR merges
pool:
vmImage: 'ubuntu-22.04' # vm does not matter as we use docker
steps:
- script: |
git submodule update --init
displayName: 'Fetch submodules'
- script: |
# For when updating this job to Meson: the `openblas` used here is
# missing pkg-config files. Ubunty Jammy (LTS 22.04) has openblas
# 3.20, so if that Docker image is available by then, just remove
# the unusual install method. For the bug report about missing .pc
# files: https://github.com/MacPython/openblas-libs/issues/74
set -euo pipefail
docker pull i386/ubuntu:focal
docker run -v $(pwd):/scipy i386/ubuntu:focal /usr/bin/linux32 /bin/bash -c "cd scipy && \
export DEBIAN_FRONTEND=noninteractive && \
apt-get -y update && \
apt-get -y install curl python3.9-dev python3.9 python3-distutils pkg-config libpng-dev libjpeg8-dev libfreetype6-dev && \
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py && \
python3.9 get-pip.py && \
pip3 --version && \
pip3 install setuptools==59.6.0 wheel numpy==1.21.6 cython==0.29.32 pybind11 pytest pytest-timeout pytest-xdist pytest-env pytest-cov Pillow mpmath pythran pooch && \
apt-get -y install build-essential gfortran wget && \
cd .. && \
mkdir openblas && cd openblas && \
target=\$(python3.9 ../scipy/tools/openblas_support.py) && \
cp -r \$target/lib/* /usr/lib && \
cp \$target/include/* /usr/include && \
cd ../scipy && \
python3.9 setup.py install && \
python3.9 tools/openblas_support.py --check_version $(openblas_version) && \
python3.9 runtests.py -n --mode=full -- -n auto -s --junitxml=junit/test-results.xml --cov-config=.coveragerc --cov-report=xml --cov-report=html --durations=10 --timeout=60"
displayName: 'Run 32-bit Ubuntu Docker Build / Tests'
- task: PublishTestResults@2
condition: succeededOrFailed()
inputs:
testResultsFiles: '**/test-*.xml'
failTaskOnFailedTests: true
testRunTitle: 'Publish test results for Python 3.9-32 bit full Linux'
- task: PublishCodeCoverageResults@1
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml'
reportDirectory: '$(System.DefaultWorkingDirectory)/**/htmlcov'
- job: Windows
timeoutInMinutes: 90
condition: and(succeeded(), ne(variables['Build.SourceBranch'], 'refs/heads/main')) # skip for PR merges
pool:
vmImage: 'windows-2019'
variables:
# OPENBLAS64_ variable has same value
# but only needed for ILP64 build below
OPENBLAS: '$(Agent.HomeDirectory)\openblaslib'
strategy:
maxParallel: 4
matrix:
Python39-32bit-fast:
PYTHON_VERSION: '3.9'
PYTHON_ARCH: 'x86'
TEST_MODE: fast
BITS: 32
SCIPY_USE_PYTHRAN: 1
Python39-64bit-full:
PYTHON_VERSION: '3.9'
PYTHON_ARCH: 'x64'
TEST_MODE: full
BITS: 64
SCIPY_USE_PYTHRAN: 0
Python311-64bit-full-ilp64:
PYTHON_VERSION: '3.11'
PYTHON_ARCH: 'x64'
TEST_MODE: full
NPY_USE_BLAS_ILP64: 1
BITS: 64
OPENBLAS64_: $(OPENBLAS)
SCIPY_USE_PYTHRAN: 1
Python310-64bit-fast:
PYTHON_VERSION: '3.10'
PYTHON_ARCH: 'x64'
TEST_MODE: fast
BITS: 64
SCIPY_USE_PYTHRAN: 0
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: $(PYTHON_VERSION)
addToPath: true
architecture: $(PYTHON_ARCH)
- script: |
git submodule update --init
displayName: 'Fetch submodules'
- script: |
python -m pip install --upgrade pip "setuptools==59.6.0" wheel
displayName: 'Install tools'
- powershell: |
$pyversion = python -c "import sys; print(sys.version.split()[0])"
Write-Host "Python Version: $pyversion"
function Download-OpenBLAS($ilp64) {
if ($ilp64 -eq '1') { $target_name = "openblas64_.a" } else { $target_name = "openblas.a" }
$target = "$(OPENBLAS)\$target_name"
Write-Host "target path: $target"
$old_value = $env:NPY_USE_BLAS_ILP64
$env:NPY_USE_BLAS_ILP64 = $ilp64
$openblas = python tools/openblas_support.py
$env:NPY_USE_BLAS_ILP64 = $old_value
cp $openblas $target
}
mkdir $(OPENBLAS)
Download-OpenBLAS('0')
If ($env:NPY_USE_BLAS_ILP64 -eq '1') {
Download-OpenBLAS('1')
}
displayName: 'Download / Install OpenBLAS'
- powershell: |
# wheels must use same version
choco install -y mingw rtools
displayName: 'Install 64-bit mingw for 64-bit builds'
condition: and(succeeded(), eq(variables['BITS'], 64))
- script: |
# provides clang-cl, which is required by Pythran
choco install -y llvm
set PATH=C:\Program Files\LLVM\bin;%PATH%
echo '##vso[task.setvariable variable=PATH]%PATH%'
displayName: 'Install clang-cl'
- script: |
clang-cl.exe --version
displayName: 'clang-cl version'
- powershell: |
# wheels must use same version
choco install -y mingw --forcex86 --force --version=8.1.0
displayName: 'Install 32-bit mingw for 32-bit builds'
condition: and(succeeded(), eq(variables['BITS'], 32))
- script: >-
python -m pip install
cython==0.29.32
matplotlib
mpmath
numpy==1.23.5
Pillow
pybind11
pythran==0.12.0
pytest
pytest-cov
pytest-env
pytest-timeout
pytest-xdist
threadpoolctl
pooch
displayName: 'Install dependencies'
# DLL resolution mechanics were changed in
# Python 3.9: https://bugs.python.org/issue36085
# While we normally leave adjustment of _distributor_init.py
# up to the specific distributors of SciPy builds, we
# are the primary providers of the SciPy wheels available
# on PyPI, so we now regularly test that the version of
# _distributor_init.py in our wheels repo is capable of
# loading the DLLs from a master branch wheel build
- powershell: |
git clone -n --depth 1 https://github.com/MacPython/scipy-wheels.git
cd scipy-wheels
git checkout HEAD _distributor_init.py
cd ..
rm scipy/_distributor_init.py
mv scipy-wheels/_distributor_init.py scipy/
displayName: 'Copy in _distributor_init.py'
condition: and(succeeded(), eq(variables['PYTHON_VERSION'], '3.9'))
- powershell: |
# The below lines ensure exit status of every line in this step is checked
Set-StrictMode -Version Latest
$global:erroractionpreference = 1
If ($(BITS) -eq 32) {
# 32-bit build requires careful adjustments
# until Microsoft has a switch we can use
# directly for i686 mingw
$env:NPY_DISTUTILS_APPEND_FLAGS = 1
$env:CFLAGS = "-m32"
$env:CXXFLAGS = "-m32"
$env:LDFLAGS = "-m32"
$env:PATH = "C:\\ProgramData\\chocolatey\\lib\\mingw\\tools\\install\\mingw$(BITS)\\bin;" + $env:PATH
refreshenv
}
Else
{
$env:PATH = "C:\\rtools40\\ucrt64\\bin;" + $env:PATH
}
$env:SCIPY_USE_PYTHRAN=$(SCIPY_USE_PYTHRAN)
# Still testing distutils here (`pip wheel --no-use-pep517` cannot be
# used, so back to `setup.py` it is ...)
python setup.py bdist_wheel
ls dist -r | Foreach-Object {
pip install $_.FullName
}
displayName: 'Build SciPy'
- powershell: |
If ($(BITS) -eq 32) {
$env:PATH = "C:\\ProgramData\\chocolatey\\lib\\mingw\\tools\\install\\mingw$(BITS)\\bin;" + $env:PATH
refreshenv
}
Else
{
$env:PATH = "C:\\rtools40\\ucrt64\\bin;" + $env:PATH
}
python runtests.py -n --mode=$(TEST_MODE) -- -n 2 --junitxml=junit/test-results.xml --durations=10 --timeout=60
displayName: 'Run SciPy Test Suite'
- task: PublishTestResults@2
condition: succeededOrFailed()
inputs:
testResultsFiles: '**/test-*.xml'
failTaskOnFailedTests: true
testRunTitle: 'Publish test results for Python $(python.version)'