Я хочу начать матричное тестирование своего кода. Я пытаюсь запустить модульное тестирование, используя приведенный ниже yml в конвейерах Azure Devops.
Когда я запускаю его, он сокращает «3.10» до «3.1». Как мне этого избежать?
parameters:
- name: imageList
type: object
default: ["windows-latest", "ubuntu-latest", "windows-2019", "ubuntu-20.04"]
- name: pythonList
type: object
default:
- "3.11"
- "3.10" # WHAT TO DO HERE
- "3.9"
stages:
- stage: test_on_microsoft_hosted_agents
jobs:
- ${{ each image in parameters.imageList }}:
- job: ${{ replace(replace(image, '-', '_'), '.', '_') }}
pool:
vmImage: ${{ image }}
strategy:
maxParallel: 1
matrix:
${{ each python in parameters.pythonList }}:
Python${{ replace(python, '.', '') }}:
python.version: "${{ python }}"
platform.name: "${{ image }}"
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: "$(python.version)"
displayName: "Use Python $(python.version)"
Я стараюсь избегать как можно большего объема работы с форматированием и т. д. в конвейерах Azure, поскольку это может быть проклято. Обычно (по моему опыту) проще сканировать параметр, а затем переключать классическую матрицу на основе этих значений.
Я бы реализовал эту стратегию управления версиями Python следующим образом:
parameters:
# as is
...
strategy:
matrix:
${{ if contains(parameters.pythonList, '3.8') }}:
Python38:
python.version: '3.8'
${{ if contains(parameters.pythonList, '3.9') }}:
Python39:
python.version: '3.9'
${{ if contains(parameters.pythonList, '3.10') }}:
Python310:
python.version: '3.10'
${{ if contains(parameters.pythonList, '3.11') }}:
Python311:
python.version: '3.11'
${{ if contains(parameters.pythonList, '3.12') }}:
Python312:
python.version: '3.12'
...
- task: UsePythonVersion@0
displayName: 'Use Python Version: $(python.version)'
inputs:
versionSpec: '$(python.version)'
Это также удаляет все проблемы с форматированием и разделением, и именно так Azure рекомендует обращаться с этими вопросами управления версиями.
Это грязный обходной путь, но рассмотрите возможность добавления префикса к номеру версии, чтобы он воспринимался как строка, а не как число.
Вместо:
parameters:
- name: pythonList
type: object
default:
- "3.11"
- "3.10"
- "3.9"
Делать:
parameters:
- name: pythonList
type: object
default:
- "v3.11"
- "v3.10"
- "v3.9"
Префикс v
можно легко удалить при настройке версии в задаче UsePythonVersion@0
.
trigger: none
parameters:
- name: imageList
type: object
default:
- windows-latest
- ubuntu-latest
- windows-2019
- ubuntu-20.04
- name: pythonList
type: object
default:
- v3.11
- v3.10
- v3.9
stages:
- stage: test_on_microsoft_hosted_agents
jobs:
- ${{ each image in parameters.imageList }}:
- job: ${{ replace(replace(image, '-', '_'), '.', '_') }}
pool:
vmImage: ${{ image }}
strategy:
maxParallel: 1
matrix:
${{ each python in parameters.pythonList }}:
Python${{ replace(python, '.', '') }}:
python.version: "${{ replace(python, 'v', '') }}" # <--------------- remove 'v' from version
platform.name: "${{ image }}"
steps:
- task: UsePythonVersion@0
inputs:
versionSpec: "$(python.version)"
displayName: "Use Python $(python.version)"
Запуск трубопровода:
Похоже, о поведении сообщалось здесь. Я также пытался использовать функцию split()
, но, похоже, она работала не так replace()
, как предлагал @RUI.
Поскольку свойство versionSpec
объекта UsePythonVersion@0
использует синтаксис диапазона версий SemVer,
Ведущий символ "=" или "v" удаляется и игнорируется.
Таким образом, мы можем использовать v3.10
как версию Python непосредственно в задаче UsePythonVersion
.
parameters:
- name: imageList
type: object
default: ["windows-latest", "ubuntu-latest", "windows-2019", "ubuntu-20.04"]
- name: pythonList
type: object
default:
- 'v3.11'
- 'v3.10' # WHAT TO DO HERE
- 'v3.9'
stages:
- stage: test_on_microsoft_hosted_agents
jobs:
- ${{ each image in parameters.imageList }}:
- job: ${{ replace(replace(image, '-', '_'), '.', '_') }}
pool:
vmImage: ${{ image }}
strategy:
maxParallel: 10
matrix:
${{ each python in parameters.pythonList }}:
Python${{ replace(python, '.', '') }}:
python.version: ${{python}} # Use v3.x directly
platform.name: ${{ image }}
steps:
- script: |
echo $(python.version)
- task: UsePythonVersion@0
inputs:
versionSpec: '$(python.version)'
displayName: Use Python $(python.version)