YML Как указать Python 3.10

Я хочу начать матричное тестирование своего кода. Я пытаюсь запустить модульное тестирование, используя приведенный ниже 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)"

50
3

Ответы:

Я стараюсь избегать как можно большего объема работы с форматированием и т. д. в конвейерах 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)


Интересные вопросы для изучения