Проверка безопасности Azure DevOps как часть запроса на сборку и извлечение только при инкрементных изменениях

#azure-devops #azure-devops-rest-api #azure-pipelines-yaml #veracode

Вопрос:

мы пытаемся построить конвейер Azure Devops (конвейер на основе yaml), в котором сборка запускается по запросу на извлечение, но мы хотим выполнить только шаг (сканирование безопасности с помощью расширения veracode) при инкрементных изменениях, т. Е. Допустим, у меня есть базовый код с версией «X», и я вношу в него несколько изменений (изменяю пару файлов, добавляю пару файлов и т. Д.), И теперь всякий раз, когда я выполняю запрос на извлечение, я хочу, чтобы запускалась сборка, но как часть сборки шаг проверки безопасности должен выполняться только при инкрементных изменениях, а не при всей базе кода телосложение. Я не уверен, как мы можем достичь этого в рамках конвейера YAML (шаг), где автоматически применяется некоторое значение фильтра (может быть, какой-то REST API для получения дополнительных изменений в этой сборке), поэтому шаг выполняется только для этих измененных файлов.

Я попробовал команду git diff HEAD со следующим сценарием только для вывода изменений из последней сборки, но это ничего мне не возвращает

 steps:
    - task: AzurePowerShell@5
      displayName: 'Check changed files'
      inputs:
        azureSubscription:  'mysubscription'
        scriptType: 'InlineScript'
        Inline: |
          $url = "https://dev.azure.com/xxxx/KKKK/_apis/build/latest/2083?apir-version=6.0-preview.1amp;branchName=myevbrnch"
          $response = (Invoke-RestMethod -Uri $url -Method GET -Headers $AzureDevOpsAuthenicationHeader)
          $files = (git diff HEAD $response.sourceVersion --name-only)
          $temp=$files -split ' '
          $count=$temp.Length
          echo "Total changed $count files"
          For ($i=0; $i -lt $temp.Length; $i  )
          {
            $name=$temp[$i]
            echo "this is $name file"
            if ($name -like "SecOpsTest/*")
              {
                Write-Host "##vso[task.setvariable variable=MicroserviceAUpdated]True"
              }
          }
        azurePowerShellVersion: 'latestVersion'
        pwsh: true
 

Любая помощь в том, как мы можем достичь этого с помощью трубопровода YAML?

Спасибо

Ответ №1:

Я смог получить различия между последней сборкой и текущим изменением, мне пришлось включить пометку в сборке, и с включенной функцией я ввел следующий скрипт powershell для проверки изменений между сборкой (нашел этот код сравнения тегов, написанный Шамраем Александром:

 steps:
    - task: AzurePowerShell@5
      displayName: 'Check changed files'
      inputs:
        azureSubscription:  'mysubscription'
        scriptType: 'InlineScript'
         Inline: |
      $last_tag = git describe --tags --abbrev=0 --match "[0-9]*"
      $changes = git diff --name-only --relative --diff-filter AMR $last_tag HEAD .
      if ($changes -is [string]){ 
        echo "Nothing changed $changes" }
      else
      {
          if ($changes -is [array])
          {       
              foreach ($change in $changes){
                 if ($change -like '*Azure.Infra/SecOpsTest/*') { 
                  echo "this is changed file $change"
                }
               
                }
          }
      }
          
        azurePowerShellVersion: 'latestVersion'
        pwsh: true