trigger:
# start a new build for every push
batch: false
branches:
include:
- 'main'
- 'maint/*'
pr:
branches:
include:
- '*' # must quote since "*" is a YAML reserved character; we want a string
stages:
- stage: Check
jobs:
- job: Skip
pool:
vmImage: 'ubuntu-latest'
variables:
DECODE_PERCENTS: 'false'
RET: 'true'
BUILD_REASON: $(Build.Reason)
steps:
- bash: |
git_log=`git log --format=oneline -n 1 --skip=1`
echo "##vso[task.setvariable variable=log]$git_log"
- bash: echo "##vso[task.setvariable variable=RET]false"
condition: and(eq(variables.BUILD_REASON, 'PullRequest'), 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: Style
variables:
AZURE_CI: 'true'
jobs:
- job: All
pool:
vmImage: 'ubuntu-latest'
variables:
PYTHON_VERSION: '3.11'
PYTHON_ARCH: 'x64'
steps:
- bash: echo $(COMMIT_MSG)
- task: UsePythonVersion@0
inputs:
versionSpec: $(PYTHON_VERSION)
architecture: $(PYTHON_ARCH)
addToPath: true
displayName: 'Get Python'
- bash: |
set -eo pipefail
python -m pip install --progress-bar off --upgrade pip build
python -m pip install --progress-bar off -ve .[hdf5,test]
python -m pip uninstall -yq pytest-qt # don't want to set up display, etc. for this
pre-commit install --install-hooks
displayName: Install dependencies
- bash: |
make pre-commit
displayName: make pre-commit
condition: always()
- bash: |
make nesting
displayName: make nesting
condition: always()
- bash: |
make check-readme
displayName: make check-readme
condition: always()
- bash: mypy
displayName: mypy
condition: always()
- bash: vulture
displayName: vulture
condition: always()
- stage: Test
condition: and(succeeded(), eq(dependencies.Check.outputs['Skip.result.start_main'], 'true'))
dependsOn: ['Style', 'Check']
variables:
AZURE_CI: 'true'
jobs:
- job: Ultraslow_PG
pool:
vmImage: 'ubuntu-22.04'
variables:
DISPLAY: ':99'
OPENBLAS_NUM_THREADS: '1'
MNE_TEST_ALLOW_SKIP: '^.*(PySide6 causes segfaults).*$'
MNE_BROWSER_PRECOMPUTE: 'false'
steps:
- bash: |
set -e
./tools/setup_xvfb.sh
sudo apt install -yq tcsh
displayName: 'Install Ubuntu dependencies'
- bash: |
source tools/get_minimal_commands.sh
displayName: 'Install minimal commands'
- bash: |
echo $PATH
mne_surf2bem --version
fsl_rigid_register --version
displayName: 'Test minimal commands'
- task: UsePythonVersion@0
inputs:
versionSpec: '3.12'
architecture: 'x64'
addToPath: true
displayName: 'Get Python'
- bash: |
set -e
python -m pip install --progress-bar off --upgrade pip
python -m pip install --progress-bar off "mne-qt-browser[opengl] @ git+https://github.com/mne-tools/mne-qt-browser.git" pyvista scikit-learn python-picard qtpy nibabel sphinx-gallery "PySide6!=6.8.0,!=6.8.0.1,!=6.8.1.1" pandas neo pymatreader antio defusedxml
python -m pip uninstall -yq mne
python -m pip install --progress-bar off --upgrade -e .[test]
displayName: 'Install dependencies with pip'
- bash: |
set -e
mne sys_info -pd
mne sys_info -pd | grep "qtpy .*(PySide6=.*)$"
displayName: Print config
- bash: |
set -e
LD_DEBUG=libs python -c "from PySide6.QtWidgets import QApplication, QWidget; app = QApplication([]); import matplotlib; matplotlib.use('QtAgg'); import matplotlib.pyplot as plt; plt.figure()"
- bash: source tools/get_testing_version.sh
displayName: 'Get testing version'
- task: Cache@2
inputs:
key: $(testing_version)
path: /home/vsts/mne_data
displayName: 'Cache testing data'
- script: python -c "import mne; mne.datasets.testing.data_path(verbose=True)"
displayName: 'Get test data'
- script: pytest -m "ultraslowtest or pgtest" --tb=short --cov=mne --cov-report=xml -vv mne
displayName: 'slow and mne-qt-browser tests'
# Coverage
- bash: bash <(curl -s https://codecov.io/bash)
displayName: 'Codecov'
condition: succeededOrFailed()
- task: PublishTestResults@2
inputs:
testResultsFiles: '**/junit-*.xml'
testRunTitle: 'Publish test results for $(Agent.JobName)'
failTaskOnFailedTests: true
condition: succeededOrFailed()
- task: PublishCodeCoverageResults@2
inputs:
summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml'
- job: Qt
pool:
vmImage: 'ubuntu-22.04'
variables:
DISPLAY: ':99'
OPENBLAS_NUM_THREADS: '1'
TEST_OPTIONS: "--tb=short --cov=mne --cov-report=xml --cov-append -vv mne/viz/_brain mne/viz/backends mne/viz/tests/test_evoked.py mne/gui mne/report"
MNE_TEST_ALLOW_SKIP: '^.*(PySide6 causes segfaults).*$'
steps:
- bash: ./tools/setup_xvfb.sh
displayName: 'Install Ubuntu dependencies'
- task: UsePythonVersion@0
inputs:
versionSpec: '3.10'
architecture: 'x64'
addToPath: true
displayName: 'Get Python'
- bash: |
set -e
python -m pip install --progress-bar off --upgrade pip
python -m pip install --progress-bar off --upgrade --pre --only-binary=\"numpy,scipy,matplotlib,vtk\" numpy scipy matplotlib vtk
python -c "import vtk"
python -m pip install --progress-bar off --upgrade -ve .[full,test_extra]
displayName: 'Install dependencies with pip'
- bash: |
set -e
which mne
mne sys_info -pd
python ./tools/check_mne_location.py
displayName: Print config
- bash: source tools/get_testing_version.sh
displayName: 'Get testing version'
- task: Cache@2
inputs:
key: $(testing_version)
path: /home/vsts/mne_data
displayName: 'Cache testing data'
- script: python -c "import mne; mne.datasets.testing.data_path(verbose=True)"
displayName: 'Get test data'
- bash: |
set -eo pipefail
python -m pip install PyQt6
LD_DEBUG=libs python -c "from PyQt6.QtWidgets import QApplication, QWidget; app = QApplication([]); import matplotlib; matplotlib.use('QtAgg'); import matplotlib.pyplot as plt; plt.figure()"
displayName: 'Check Qt import'
- bash: |
set -eo pipefail
mne sys_info -pd
mne sys_info -pd | grep "qtpy .* (PyQt6=.*)$"
PYTEST_QT_API=PyQt6 pytest ${TEST_OPTIONS}
python -m pip uninstall -yq PyQt6 PyQt6-sip PyQt6-Qt6
displayName: 'PyQt6'
- bash: |
set -eo pipefail
python -m pip install "PySide6!=6.8.0,!=6.8.0.1"
mne sys_info -pd
mne sys_info -pd | grep "qtpy .* (PySide6=.*)$"
PYTEST_QT_API=PySide6 pytest ${TEST_OPTIONS}
python -m pip uninstall -yq PySide6
displayName: 'PySide6'
# PyQt5 leaves cruft behind, so run it last
- bash: |
set -eo pipefail
python -m pip install PyQt5
mne sys_info -pd
mne sys_info -pd | grep "qtpy .* (PyQt5=.*)$"
PYTEST_QT_API=PyQt5 pytest ${TEST_OPTIONS}
python -m pip uninstall -yq PyQt5 PyQt5-sip PyQt5-Qt5
displayName: 'PyQt5'
# Coverage
- bash: bash <(curl -s https://codecov.io/bash)
displayName: 'Codecov'
condition: succeededOrFailed()
- task: PublishTestResults@2
inputs:
testResultsFiles: '**/junit-*.xml'
testRunTitle: 'Publish test results for $(Agent.JobName)'
failTaskOnFailedTests: true
condition: succeededOrFailed()
- task: PublishCodeCoverageResults@2
inputs:
summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml'
- job: Windows
pool:
vmImage: 'windows-latest'
variables:
MNE_LOGGING_LEVEL: 'warning'
MNE_FORCE_SERIAL: 'true'
OPENBLAS_NUM_THREADS: '2'
OMP_DYNAMIC: 'false'
PYTHONUNBUFFERED: 1
PYTHONIOENCODING: 'utf-8'
AZURE_CI_WINDOWS: 'true'
PYTHON_ARCH: 'x64'
timeoutInMinutes: 90
strategy:
maxParallel: 4
matrix:
3.10 pip:
TEST_MODE: 'pip'
PYTHON_VERSION: '3.10'
3.12 pip pre:
TEST_MODE: 'pip-pre'
PYTHON_VERSION: '3.12'
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: $(PYTHON_VERSION)
architecture: $(PYTHON_ARCH)
addToPath: true
displayName: 'Get Python'
- bash: |
set -eo pipefail
git clone --depth 1 https://github.com/pyvista/setup-headless-display-action.git
MESA3D_VERSION=24.3.0 bash setup-headless-display-action/windows/install_opengl.sh
displayName: Install OpenGL
- bash: ./tools/azure_dependencies.sh
displayName: Install dependencies with pip
- script: pip install -e .
displayName: 'Install MNE-Python dev'
- script: mne sys_info -pd
displayName: 'Print config'
- script: python -c "import numpy; numpy.show_config()"
displayName: Print NumPy config
- script: python -c "import numpy; import scipy.linalg; import sklearn.neighbors; from threadpoolctl import threadpool_info; from pprint import pprint; pprint(threadpool_info())"
displayName: Print threadpoolctl info
- bash: source tools/get_testing_version.sh
displayName: 'Get testing version'
- task: Cache@2
inputs:
key: $(testing_version)
path: C:\Users\VssAdministrator\mne_data
displayName: 'Cache testing data'
- script: python -c "import mne; mne.datasets.testing.data_path(verbose=True)"
displayName: 'Get test data'
- script: pytest -m "not (slowtest or pgtest)" --tb=short --cov=mne --cov-report=xml -vv mne
displayName: 'Run tests'
- bash: bash <(curl -s https://codecov.io/bash)
displayName: 'Codecov'
condition: succeededOrFailed()
- task: PublishTestResults@2
inputs:
testResultsFiles: '**/junit-*.xml'
testRunTitle: 'Publish test results for $(Agent.JobName) $(TEST_MODE) $(PYTHON_VERSION)'
failTaskOnFailedTests: true
condition: succeededOrFailed()
- task: PublishCodeCoverageResults@2
inputs:
summaryFileLocation: '$(System.DefaultWorkingDirectory)/**/coverage.xml'