matplotlib
/
azure-pipelines.yml
279 строк · 10.3 Кб
1# Python package
2# Create and test a Python package on multiple Python versions.
3# Add steps that analyze code, save the dist with the build record, publish to a PyPI-compatible index, and
4# more:
5# https://docs.microsoft.com/en-us/azure/devops/pipelines/ecosystems/python?view=azure-devops
6
7---
8trigger:9branches:10exclude:11- v*-doc12pr:13branches:14exclude:15- v*-doc16paths:17exclude:18- doc/**/*19- galleries/**/*20
21stages:22
23- stage: Check24jobs:25- job: Skip26pool:27vmImage: 'ubuntu-latest'28variables:29DECODE_PERCENTS: 'false'30RET: 'true'31steps:32- bash: |33git_log=`git log --max-count=1 --skip=1 --pretty=format:"%B" | tr "\n" " "`
34echo "##vso[task.setvariable variable=log]$git_log"
35- bash: echo "##vso[task.setvariable variable=RET]false"36condition: >-37or(contains(variables.log, '[skip azp]'),38contains(variables.log, '[azp skip]'),39contains(variables.log, '[skip ci]'),40contains(variables.log, '[ci skip]'),41contains(variables.log, '[ci doc]'))42- bash: echo "##vso[task.setvariable variable=start_main;isOutput=true]$RET"43name: result44
45- stage: Main46condition: and(succeeded(), eq(dependencies.Check.outputs['Skip.result.start_main'], 'true'))47dependsOn: Check48jobs:49- job: Pytest50strategy:51matrix:52Linux_py310:53vmImage: 'ubuntu-20.04' # keep one job pinned to the oldest image54python.version: '3.10'55Linux_py311:56vmImage: 'ubuntu-latest'57python.version: '3.11'58macOS_py310:59vmImage: 'macOS-latest'60python.version: '3.10'61macOS_py311:62vmImage: 'macOS-latest'63python.version: '3.11'64Windows_py310:65vmImage: 'windows-2019' # keep one job pinned to the oldest image66python.version: '3.10'67Windows_py311:68vmImage: 'windows-latest'69python.version: '3.11'70maxParallel: 471pool:72vmImage: '$(vmImage)'73steps:74- task: UsePythonVersion@075inputs:76versionSpec: '$(python.version)'77architecture: 'x64'78displayName: 'Use Python $(python.version)'79
80- bash: |81set -e
82case "$AGENT_OS" in
83Linux)
84echo 'Acquire::Retries "3";' | sudo tee /etc/apt/apt.conf.d/80-retries
85sudo apt update
86sudo apt install --no-install-recommends \
87cm-super \
88dvipng \
89ffmpeg \
90fonts-freefont-otf \
91fonts-noto-cjk \
92fonts-wqy-zenhei \
93gdb \
94gir1.2-gtk-3.0 \
95graphviz \
96inkscape \
97language-pack-de \
98lcov \
99libcairo2 \
100libgirepository-1.0-1 \
101lmodern \
102ninja-build \
103poppler-utils \
104texlive-fonts-recommended \
105texlive-latex-base \
106texlive-latex-extra \
107texlive-latex-recommended \
108texlive-luatex \
109texlive-pictures \
110texlive-xetex
111;;
112Darwin)
113brew update
114export HOMEBREW_NO_INSTALL_UPGRADE=1 HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
115brew install --cask xquartz
116brew install ccache ffmpeg imagemagick mplayer ninja pkg-config
117brew install --cask font-noto-sans-cjk-sc
118;;
119Windows_NT)
120choco install ninja
121;;
122*)
123exit 1
124;;
125esac
126displayName: 'Install dependencies'127
128- bash: |129python -m pip install --upgrade pip
130python -m pip install --upgrade -r requirements/dev/build-requirements.txt
131python -m pip install -r requirements/testing/all.txt -r requirements/testing/extra.txt
132displayName: 'Install dependencies with pip'133
134- bash: |135case "$AGENT_OS" in
136Linux)
137export CPPFLAGS='--coverage -fprofile-abs-path'
138;;
139Darwin)
140export CPPFLAGS='-fprofile-instr-generate=default.%m.profraw'
141export CPPFLAGS="$CPPFLAGS -fcoverage-mapping"
142;;
143Windows_NT)
144CONFIG='--config-settings=setup-args=--vsenv'
145CONFIG="$CONFIG --config-settings=setup-args=-Dcpp_link_args=-PROFILE"
146CONFIG="$CONFIG --config-settings=setup-args=-Dbuildtype=debug"
147;;
148*)
149exit 1
150;;
151esac
152
153python -m pip install \154--no-build-isolation $CONFIG \155--verbose --editable .[dev]156displayName: "Install self"157
158- script: env159displayName: 'print env'160
161- script: pip list162displayName: 'print pip'163
164- bash: |165set -e
166if [[ "$AGENT_OS" == 'Windows_NT' ]]; then
167SESSION_ID=$(python -c "import uuid; print(uuid.uuid4(), end='')")
168echo "Coverage session ID: ${SESSION_ID}"
169VS=$(ls -d /c/Program\ Files*/Microsoft\ Visual\ Studio/*/Enterprise)
170echo "Visual Studio: ${VS}"
171DIR="$VS/Common7/IDE/Extensions/Microsoft/CodeCoverage.Console"
172if [[ -d $DIR ]]; then
173# This is for MSVC 2022 (on windows-latest).
174TOOL="$DIR/Microsoft.CodeCoverage.Console.exe"
175for f in build/cp*/src/*.pyd; do
176echo $f
177echo "=============================="
178"$TOOL" instrument $f --session-id $SESSION_ID \
179--log-level Verbose --log-file instrument.log
180cat instrument.log
181rm instrument.log
182done
183echo "Starting $TOOL in server mode"
184"$TOOL" collect \
185--session-id $SESSION_ID --server-mode \
186--output-format cobertura --output extensions.xml \
187--log-level Verbose --log-file extensions.log &
188VS_VER=2022
189else
190DIR="$VS"/Team\ Tools/Dynamic\ Code\ Coverage\ Tools/amd64
191if [[ -d $DIR ]]; then
192# This is for MSVC 2019 (on windows-2019).
193VSINSTR="$VS"/Team\ Tools/Performance\ Tools/vsinstr.exe
194for f in build/cp*/src/*.pyd; do
195"$VSINSTR" $f -Verbose -Coverage
196done
197TOOL="$DIR/CodeCoverage.exe"
198cat > extensions.config << EOF
199<CodeCoverage>
200<CollectFromChildProcesses>true</CollectFromChildProcesses>
201<ModulePaths>
202<Include>
203<ModulePath>.*\\.*\.pyd</ModulePath>
204</Include>
205</ModulePaths>
206</CodeCoverage>
207EOF
208echo "Starting $TOOL in server mode"
209"$TOOL" collect \
210-config:extensions.config -session:$SESSION_ID \
211-output:extensions.coverage -verbose &
212echo "Started $TOOL"
213VS_VER=2019
214fi
215fi
216echo "##vso[task.setvariable variable=VS_COVERAGE_TOOL]$TOOL"
217fi
218PYTHONFAULTHANDLER=1 pytest -rfEsXR -n 2 \
219--maxfail=50 --timeout=300 --durations=25 \
220--junitxml=junit/test-results.xml --cov-report=xml --cov=lib
221if [[ -n $SESSION_ID ]]; then
222if [[ $VS_VER == 2022 ]]; then
223"$TOOL" shutdown $SESSION_ID
224echo "Coverage collection log"
225echo "======================="
226cat extensions.log
227else
228"$TOOL" shutdown -session:$SESSION_ID
229fi
230fi
231displayName: 'pytest'232
233- bash: |234case "$AGENT_OS" in
235Linux)
236lcov --rc lcov_branch_coverage=1 --capture --directory . \
237--output-file coverage.info
238lcov --rc lcov_branch_coverage=1 --output-file coverage.info \
239--extract coverage.info $PWD/src/'*' $PWD/lib/'*'
240lcov --rc lcov_branch_coverage=1 --list coverage.info
241find . -name '*.gc*' -delete
242;;
243Darwin)
244xcrun llvm-profdata merge -sparse default.*.profraw \
245-o default.profdata
246xcrun llvm-cov export -format="lcov" build/*/src/*.so \
247-instr-profile default.profdata > info.lcov
248;;
249Windows_NT)
250if [[ -f extensions.coverage ]]; then
251# For MSVC 2019.
252"$VS_COVERAGE_TOOL" analyze -output:extensions.xml \
253-include_skipped_functions -include_skipped_modules \
254extensions.coverage
255rm extensions.coverage
256fi
257;;
258*)
259exit 1
260;;
261esac
262displayName: 'Filter C coverage'263condition: succeededOrFailed()264- bash: |265bash <(curl -s https://codecov.io/bash) \
266-n "$PYTHON_VERSION $AGENT_OS" \
267-f 'coverage.xml' -f 'extensions.xml'
268displayName: 'Upload to codecov.io'269condition: succeededOrFailed()270
271- task: PublishTestResults@2272inputs:273testResultsFiles: '**/test-results.xml'274testRunTitle: 'Python $(python.version)'275condition: succeededOrFailed()276
277- publish: $(System.DefaultWorkingDirectory)/result_images278artifact: $(Agent.JobName)-result_images279condition: failed()280