Я работаю над конвейером 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)
Здесь происходит то, что
После запуска этого конвейера я получаю сообщение об ошибке:
##[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 и каковы их значения?
Или, как альтернатива, добавьте шаги до и после в шаблоны этапов или заданий — см. Создание настраиваемых и расширяемых заданий
добавить условный запуск этой задачи - это то, что я предложу владельцам шаблонов, а пока пытаюсь это как-то настроить на своем этапе
Вы должны поместить 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-адрес результата и поместить его на страницу сводки сборки.
SonarQubeAnalyze@6
, и используйте этот идентификатор для получения журнала задачи.Обратитесь к следующим сценариям 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-адрес другой.
Я попробую этот подход. А пока где в документации указано, что эти задачи нужно запускать из одного и того же задания? Я нашел информацию о том, что их можно запускать даже с разных этапов.
Я попробовал ваше решение, действительно, сейчас у меня нет ошибки, но есть предупреждение: ##[предупреждение]В этой сборке анализов не найдено! Пожалуйста, проверьте конфигурацию сборки. Также на панели «Отчет об анализе SonarQube» я не вижу никаких данных.
«где в документации указано, что эти задачи должны запускаться из одного и того же задания» — как я уже упоминал выше, задача SonarQubePrepare@6
используется для настройки с помощью SonarQube для текущего задания. При запуске этапа «sonar_publish» он будет работать на новом агенте, где агент не настроен для доступа к вашему SonarQube. Вот как работает агент. Дополнительную информацию о работе агента см. в разделе Вакансии пула агентов.
«но у меня предупреждение: ##[предупреждение]В этой сборке анализов не найдено! Пожалуйста, проверьте конфигурацию сборки». Вы видите это предупреждение, потому что вы не проводили никакого анализа на этапе «sonar_publish».
«Я также позаботился о том, чтобы все файлы, созданные отчетом сонара, копировались в рабочую область sonar_publish (используя CopyFiles@2 и PublishBuildArtifacts@1 на этапе build_and_sonar_prepare». Вы можете добавить CopyFiles@2 и PublishBuildArtifacts@1 на этапе «build_and_sonar_prepare», почему вы не можете добавить задачу SonarQubePublish@6
на этот этап? Это было бы проще, чем добавить задачу SonarQubePrepare@6
и выполнить анализ на этапе «sonar_publish».
эти две задачи уже включены в этап build_and_sonar_prepare. Я их не добавлял, если честно, они уже есть
По вашему вопросу в этом билете невозможно заставить SonarQubePublish@6
задачу работать без добавления SonarQubePrepare@6
задачи и выполнения анализа в одной и той же задаче. Вот как работают расширение SonarQube и агент DevOps.
Могу ли я узнать URL-адрес отчета в вашем этом вопросе? Я хочу знать формат, не зная конкретных параметров. Это что-то вроде https://sonarcloud.io/dashboard?id = {SonarQubeProjectId}
? Тогда я могу попытаться помочь вам показать ссылку URL-адреса на сводной странице другими способами.
Ссылка такая: sonar.domain.interna.company.int/v9/…
Если вы не можете поместить задачу SonarQubePrepare@6 и задачу SonarQubePublish@6 в одно задание. Вы можете проанализировать журнал, чтобы получить URL-адрес результата и поместить его на страницу сводки сборки. Подробности смотрите в моем обновлении выше.
Выглядит потрясающе, я попробую
к сожалению, похоже, что у агентов нет powershell:( Я получаю сообщение об ошибке: ##[ошибка]Невозможно найти исполняемый файл: 'pwsh'. Убедитесь, что путь к файлу существует или файл можно найти в каталоге, указанном переменная среды PATH Также проверьте режим файла, чтобы убедиться, что файл является исполняемым.
Вы можете установить PowerShell на свой компьютер. Если вы не можете, вы можете настроить сценарии в соответствии с тем, который поддерживается на вашем компьютере. Приведенные выше сценарии просто запускают два REST API, находят целевую строку в журнале и выполняют команду регистрации ##vso[task.uploadsummary].
У меня нет прав на обновление агентов. Попробую запросить это у команды devops. До сих пор я использовал только задачи Bash
Я обновил ответ выше с помощью задачи Bash. Пожалуйста, попробуйте это в своем конвейере. Пожалуйста, замените OrgName
и ProjectName
на свое фактическое значение. Создайте PAT и добавьте его в конвейер как переменную. Для тестирования рекомендуется установить область ПОЛНАЯ, чтобы избежать нехватки разрешений.
Решение с bash сработало, как и ожидалось. После того, как я обновлю агент, я также попробую вариант с powershell.
Самый простой и логичный способ — попросить того, кто управляет шаблонами
build_and_sonar_prepare
, добавить новую задачу. Если автор беспокоится о том, чтобы сломать или каким-то образом изменить поведение существующих сборок, он/она может добавить логический параметр с именемpublishQualityGate
со значением по умолчаниюfalse
и на основе этого параметра включать задачу или нет.