Как мне запустить задание, которое зависит от чего-то, что можно условно не запускать?

#azure-devops #azure-pipelines #azure-pipelines-yaml

#azure-devops #azure-конвейеры #azure-конвейеры-yaml

Вопрос:

У меня есть конвейер, в котором есть несколько наборов интеграционных тестов, но я действительно не хочу запускать их все во время сборки PR. Для этого у меня есть переменная, которая устанавливается, когда я нахожусь в главной ветке

   - job: it
    displayName: Integration Test
    timeoutInMinutes: 360
    steps: []

  - job: it_billing
    displayName: Integration Test
    condition: or(eq(variables.isMasterBranch, 'True'), eq(variables['it'], 'true'))
    steps: []

  - job: it_rest
    displayName: Integration Test
    condition: or(eq(variables.isMasterBranch, 'True'), eq(variables['it'], 'true'))
    steps: []
  

У меня есть задание контроля качества, которое запускает sonar, которое я хочу запустить

   - job: qa
    displayName: SonarQube Analysis
    dependsOn:
      - it
      - it_billing
      - it_rest
  

У которого нет условий, но оно зависит от it_billing и it_rest, потому что при основной сборке оно соберет все результаты ИТ-покрытия и создаст отчет.

Однако при сборке PR этот этап, вероятно, пропускается из-за dependsOn есть ли способ сделать это, не прибегая к копированию этапа анализа с чем-то конкретным для сборки PR?

       - job: qaOneIt
        displayName: SonarQube PR Analysis with IT
        condition: and(succeeded(), ne(variables.isMasterBranch, 'True'), ne(variables['it'], 'true'))
        dependsOn:
          - it
  

Комментарии:

1. Привет, Архимед Траяно, есть какие-нибудь обновления по этому билету?

Ответ №1:

Извините, это невозможно сделать.

По умолчанию задание выполняется, если оно не зависит ни от какого другого задания или если все задания, от которых оно зависит, завершены успешно.

Вы могли бы сослаться на это в нашем официальном документе здесь — Укажите условия

Другими словами, когда вы запускаете сборку PR, это job: qa не будет выполняться, поскольку job: it_billing и job: it_rest не были запущены.

Ответ №2:

есть ли способ сделать это, не прибегая к копированию этапа анализа с чем-то конкретным для сборки PR?

Возможно, ваш dependsOn: может быть немного более «динамичным»:

 - job: qa
    displayName: SonarQube Analysis
    dependsOn:    
    - it
    - ${{ if ne(variables['Build.SourceBranchName'], 'master') }}:
      - it_billing
      - it_rest
  

Выражение if проверяет текущую ветвь и, если она отличается от master , включает две оставшиеся зависимости: it_billing и it_rest. В противном случае ожидается только одна зависимость.