SonarQubePublish@6 завершается с ошибкой при запуске с другого этапа, чем SonarQubePrepare, и сообщает: «Переменные отсутствуют»

Я работаю над конвейером Dev Azure, который состоит из нескольких этапов, на которых есть задачи по подготовке отчета сонара. Важные части этапов, на которых я хочу сосредоточиться, выглядят так:

build_and_sonar_prepare:
    - task: SonarQubePrepare@6
      displayName: prepare_sonar
      inputs:
        SonarQube: ${{ parameters.SonarQube}}
        scannerMode: 'Other'
        
    - task: Bash@3
      displayName: scan_sonar
      inputs:
        targetType: 'inline'
        script: |
          mvn sonar:sonar other commands
        
sonar_publish:
     - task: SonarQubePublish@6
       inputs:
       pollingTimeoutSec: '300'

Я не управляю build_and_sonar_prepare, это часть шаблона, который я использую повторно. Он работает нормально и генерирует правильный отчет сонара со ссылкой на сервер сонара. Этап, которым я управляю, — sonar_publish, где я хотел бы публиковать результаты только для того, чтобы увидеть результаты отчета в сводке Azure Devops Pipeline (для этого я создал отдельный вопрос: (Azure Devops Pipeline, покажите ссылку) сделайте отчет сонара на сводной странице Pipeline Run)

Здесь происходит то, что

  1. SonarQubePrepare вызывается с правильным рабочим соединением с SonarQube ${{parameters.SonarQube}}, который управляется Azure и работает нормально.
  2. вместо SonarCubeAnalyze вызывается mvn sonar:sonar, и, к сожалению, я не могу его изменить, потому что это часть шаблона
  3. Вызывается SonarQubePublish@6, но с другого этапа

После запуска этого конвейера я получаю сообщение об ошибке: ##[error]Variables are missing. Please make sure that you are running the Prepare and Analyze tasks before running the Publish task.

Я попытался поместить SonarCubeAnalyze на свою сцену, прежде чем вызвать «Опубликовать», но это также не удалось. Я также позаботился о том, чтобы все файлы, созданные отчетом сонара, копировались в рабочую область sonar_publish (используя CopyFiles@2 и PublishBuildArtifacts@1 на этапе build_and_sonar_prepare и CopyFiles@2 на этапе sonar_publish). Пока безуспешно. Интересно, можно ли публиковать отчет сонара с помощью этой настройки? Я также хотел бы знать, какие переменные отсутствуют и как проверить, существуют ли они на этапе sonar_publish и каковы их значения?

Самый простой и логичный способ — попросить того, кто управляет шаблонами build_and_sonar_prepare, добавить новую задачу. Если автор беспокоится о том, чтобы сломать или каким-то образом изменить поведение существующих сборок, он/она может добавить логический параметр с именем publishQualityGate со значением по умолчанию false и на основе этого параметра включать задачу или нет.

Rui Jarimba 08.07.2024 13:36

Или, как альтернатива, добавьте шаги до и после в шаблоны этапов или заданий — см. Создание настраиваемых и расширяемых заданий

Rui Jarimba 08.07.2024 13:41

добавить условный запуск этой задачи - это то, что я предложу владельцам шаблонов, а пока пытаюсь это как-то настроить на своем этапе

fascynacja 08.07.2024 13:44
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
3
270
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны поместить SonarQubePrepare@6 задачу и SonarQubePublish@6 задачу в одну и ту же работу.

Я могу воспроизвести вашу проблему при размещении задачи SonarQubePrepare@6 и задачи SonarQubePublish@6 в разных заданиях.

SonarQubePrepare@6 задача используется для настройки всех необходимых параметров перед выполнением сборки. Эта задача является обязательной, а ее областью является текущее задание. При запуске этапа «sonar_publish» он будет работать на совершенно новом агенте, который не был настроен с помощью SonarQube. Этот агент не содержит никакой информации, которую вы настроили на этапе «build_and_sonar_prepare». Как показано на скриншоте, значения SONARQUBE_SCANNER_PARAMS и SONAR_ENDPOINT оба «неопределены».

Если вы проверите журнал отладки рабочего запуска (в том же задании), вы увидите, что задача SonarQubePublish@6 автоматически получит информацию из текущей среды.

Если вы не можете добавить задачу SonarQubePublish@6 на этап «build_and_sonar_prepare», вы можете добавить задачу SonarQubePrepare@6 на этап «sonar_publish» и использовать то же подключение к службе.

Некоторые документы для справки:


Обновлять:

Если вы не можете поместить SonarQubePrepare@6 задачу и SonarQubePublish@6 задачу в одну работу. Вы можете проанализировать журнал, чтобы получить URL-адрес результата и поместить его на страницу сводки сборки.

  1. Запустите REST API, чтобы получить идентификатор журнала задачи SonarQubeAnalyze@6, и используйте этот идентификатор для получения журнала задачи.
  2. Проанализируйте журнал и получите URL-адрес результата. Запишите URL-адрес в файл Markdown.
  3. Используйте команду регистрации ##vso[task.uploadsummary] для загрузки URL-адреса результата на страницу сводки сборки через сводный файл Markdown.
Задача PowerShell

Обратитесь к следующим сценариям PowerShell:

- job: JobB
  dependsOn: JobA
  steps:
    - task: PowerShell@2
      inputs:
        targetType: 'inline'
        script: |
          $token = "$(PAT)"
          $token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))
          $head = @{ Authorization  = " Basic $token" }
          $org = "{OrgName}"
          $proj = "{ProjectName}"
          $url1  = "https://dev.azure.com/$org/$proj/_apis/build/builds/$(Build.BuildId)/timeline?api-version=6.0"
          $timeline = Invoke-RestMethod -Uri $url1 -Method Get -Headers $head 
          $targetlog = $timeline.records | Where-Object {$_.name -eq "SonarQubeAnalyze"} | Select-Object 
          $logId = $targetlog.log.id
          $logId
          
          
          $url2 = "https://dev.azure.com/$org/$proj/_apis/build/builds/$(Build.BuildId)/logs/$($logId)?api-version=6.0"
          $logContent = Invoke-RestMethod -Uri $url2 -Method Get -Headers $head 
          $logLines = $logContent -split "`n"
          $targetline = $logLines | Select-String -Pattern "ANALYSIS SUCCESSFUL, you can find the results at:"
          Write-Output $targetline
          $sonarUrl = $targetline.Line
          $sonarUrl = $sonarUrl.Split("ANALYSIS SUCCESSFUL", 2)[1]
          $sonarUrl
          $sonarUrl | Out-File -FilePath Summary.md -Encoding utf8
          Write-Host "##vso[task.uploadsummary]$(System.DefaultWorkingDirectory)/Summary.md"

Результат:

Баш-задача

    - task: Bash@3
      inputs:
        targetType: 'inline'
        script: |
          token = "$(PAT)"
          token=$(echo -n ":${token}" | base64)
          head = "Authorization: Basic ${token}"
          org = "{OrgName}"
          proj = "{ProjectName}"
          url1 = "https://dev.azure.com/${org}/${proj}/_apis/build/builds/$(Build.BuildId)/timeline?api-version=6.0"
          
          timeline=$(curl -s -H "${head}" "${url1}")
          targetlog=$(echo "${timeline}" | jq '.records[] | select(.name= = "SonarQubeAnalyze")')
          logId=$(echo "${targetlog}" | jq '.log.id')
          
          url2 = "https://dev.azure.com/${org}/${proj}/_apis/build/builds/$(Build.BuildId)/logs/${logId}?api-version=6.0"
          logContent=$(curl -s -H "${head}" "${url2}")
          targetline=$(echo "${logContent}" | grep "ANALYSIS SUCCESSFUL, you can find the results at:")
          sonarUrl=$(echo "${targetline}" | cut -d' ' -f5-)
          
          echo "${sonarUrl}" > Summary.md
          echo "##vso[task.uploadsummary]$(System.DefaultWorkingDirectory)/Summary.md"

Я тестирую с помощью SonarCloud, поэтому URL-адрес другой.

Я попробую этот подход. А пока где в документации указано, что эти задачи нужно запускать из одного и того же задания? Я нашел информацию о том, что их можно запускать даже с разных этапов.

fascynacja 08.07.2024 09:35

Я попробовал ваше решение, действительно, сейчас у меня нет ошибки, но есть предупреждение: ##[предупреждение]В этой сборке анализов не найдено! Пожалуйста, проверьте конфигурацию сборки. Также на панели «Отчет об анализе SonarQube» я не вижу никаких данных.

fascynacja 08.07.2024 09:52

«где в документации указано, что эти задачи должны запускаться из одного и того же задания» — как я уже упоминал выше, задача SonarQubePrepare@6 используется для настройки с помощью SonarQube для текущего задания. При запуске этапа «sonar_publish» он будет работать на новом агенте, где агент не настроен для доступа к вашему SonarQube. Вот как работает агент. Дополнительную информацию о работе агента см. в разделе Вакансии пула агентов.

Ziyang Liu-MSFT 08.07.2024 11:40

«но у меня предупреждение: ##[предупреждение]В этой сборке анализов не найдено! Пожалуйста, проверьте конфигурацию сборки». Вы видите это предупреждение, потому что вы не проводили никакого анализа на этапе «sonar_publish».

Ziyang Liu-MSFT 08.07.2024 12:08

«Я также позаботился о том, чтобы все файлы, созданные отчетом сонара, копировались в рабочую область sonar_publish (используя CopyFiles@2 и PublishBuildArtifacts@1 на этапе build_and_sonar_prepare». Вы можете добавить CopyFiles@2 и PublishBuildArtifacts@1 на этапе «build_and_sonar_prepare», почему вы не можете добавить задачу SonarQubePublish@6 на этот этап? Это было бы проще, чем добавить задачу SonarQubePrepare@6 и выполнить анализ на этапе «sonar_publish».

Ziyang Liu-MSFT 08.07.2024 12:16

эти две задачи уже включены в этап build_and_sonar_prepare. Я их не добавлял, если честно, они уже есть

fascynacja 08.07.2024 12:18

По вашему вопросу в этом билете невозможно заставить SonarQubePublish@6 задачу работать без добавления SonarQubePrepare@6 задачи и выполнения анализа в одной и той же задаче. Вот как работают расширение SonarQube и агент DevOps.

Ziyang Liu-MSFT 08.07.2024 12:37

Могу ли я узнать URL-адрес отчета в вашем этом вопросе? Я хочу знать формат, не зная конкретных параметров. Это что-то вроде https://sonarcloud.io/dashboard?id = {SonarQubeProjectId}? Тогда я могу попытаться помочь вам показать ссылку URL-адреса на сводной странице другими способами.

Ziyang Liu-MSFT 08.07.2024 12:43

Ссылка такая: sonar.domain.interna.company.int/v9/…

fascynacja 08.07.2024 12:52

Если вы не можете поместить задачу SonarQubePrepare@6 и задачу SonarQubePublish@6 в одно задание. Вы можете проанализировать журнал, чтобы получить URL-адрес результата и поместить его на страницу сводки сборки. Подробности смотрите в моем обновлении выше.

Ziyang Liu-MSFT 09.07.2024 08:03

Выглядит потрясающе, я попробую

fascynacja 09.07.2024 08:22

к сожалению, похоже, что у агентов нет powershell:( Я получаю сообщение об ошибке: ##[ошибка]Невозможно найти исполняемый файл: 'pwsh'. Убедитесь, что путь к файлу существует или файл можно найти в каталоге, указанном переменная среды PATH Также проверьте режим файла, чтобы убедиться, что файл является исполняемым.

fascynacja 09.07.2024 09:26

Вы можете установить PowerShell на свой компьютер. Если вы не можете, вы можете настроить сценарии в соответствии с тем, который поддерживается на вашем компьютере. Приведенные выше сценарии просто запускают два REST API, находят целевую строку в журнале и выполняют команду регистрации ##vso[task.uploadsummary].

Ziyang Liu-MSFT 09.07.2024 09:30

У меня нет прав на обновление агентов. Попробую запросить это у команды devops. До сих пор я использовал только задачи Bash

fascynacja 09.07.2024 09:45

Я обновил ответ выше с помощью задачи Bash. Пожалуйста, попробуйте это в своем конвейере. Пожалуйста, замените OrgName и ProjectName на свое фактическое значение. Создайте PAT и добавьте его в конвейер как переменную. Для тестирования рекомендуется установить область ПОЛНАЯ, чтобы избежать нехватки разрешений.

Ziyang Liu-MSFT 09.07.2024 10:26

Решение с bash сработало, как и ожидалось. После того, как я обновлю агент, я также попробую вариант с powershell.

fascynacja 09.07.2024 12:05

Другие вопросы по теме