Передать параметры в конвейер сборки devops из API

У меня проблемы с пониманием того, что мне нужно сделать... но У меня есть конвейер сборки... ниже мои базовые скрипты для тестирования.
Я хочу иметь возможность добавлять/обновлять параметры через API и PowerShell. Я не уверен, что это лучший способ добиться этого, но, похоже, он работает хорошо, когда я вручную добавляю свои параметры. Когда я передаю параметр, он не сохраняется. Буду признателен за любую помощь... даже если я отправлю свой запрос где-нибудь еще. Спасибо

  1. сценарий конвейера

     variables:
        patchgroup: test
    
     jobs: 
     - template: patch-template.yml  
    
       parameters:    
         patchgroup: $(patchgroup)    
         sqlservers:      
           - sqlserver: name: ""
    
  2. файл шаблона патча

    parameters:
      sqlservers: {}
      patchgroup: ''
    
    jobs:
    - ${{ each sqlserver in parameters.sqlservers }}:
      - template: patch-tasks.yml
        parameters:
          sqlserver: ${{ sqlserver.name }}
          patchgroup: ${{ parameters.patchgroup }}
    
  3. исправление задач параметры: sqlсервер: '' группа патчей: ''

     jobs:
       - job: 
         displayName: '${{ parameters.sqlserver }}--set-up-stuff'
         steps:
         - task: PowerShell@2
           inputs:
             targetType: 'inline'
             script: |
               Write-Host "Patchgroup '${{ parameters.patchgroup }}'"
               Write-Host "sqlserver '${{ parameters.sqlserver }}'"
    
  4. сценарий powershell

     $defurl = "$collectionurl/$project/_apis/build/builds?api-version=5.0"
     $json = '{"variables":  "{\"patchgroup\":  \"xyxyxyxyx\"}","definition":  {"id":  "194"}}'
     #$json = '{"parameters":"{\"sqlservers\": \"\"{\"sqlserver\":  \"servername\"}\"\"}","definition":{"id":"194"}}'
     $updatedef = Invoke-RestMethod -Uri $defurl -Method POST -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)}
    

🤔 А знаете ли вы, что...
С PowerShell можно автоматизировать задачи резервного копирования и восстановления данных.


1
1 844
1

Ответ:

Решено

Согласно вашему коду, я провел несколько тестов.

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

Поэтому, когда вы запускаете конвейер, вы не можете передавать параметры в исходный код yaml через Rest API.

Чтобы решить эту проблему, вы можете попробовать использовать параметр для передачи значения параметра.

Обновлять:

Вы можете проверить мой новый пример:

patch-tasks.yml

 jobs:
   - job: 
     displayName: '${{ parameters.sqlserver }}--set-up-stuff'
     steps:
     - task: PowerShell@2
       inputs:
         targetType: 'inline'
         script: |
           Write-Host "Patchgroup '${{ parameters.patchgroup }}'"
           Write-Host "sqlserver '${{ parameters.sqlserver }}'"

патч-template.yml

parameters:
- name: sqlservers 
  type: object
  default: [] 

- name: patchgroup 
  type: string
  default: ''


jobs:
- ${{ each sqlserver in parameters.sqlservers }}:
  - template: patch-tasks.yml
    parameters:
      sqlserver: ${{ sqlserver }}
      patchgroup: ${{ parameters.patchgroup }}

сценарий конвейера

trigger: none

parameters:
- name: InstanceArgs 
  type: object
  default: [] 
    
variables:
    patchgroup: test
    


jobs: 
 - template: patch-template.yml  

   parameters:    
     patchgroup: $(patchgroup)    
     sqlservers:  ${{ parameters.InstanceArgs }} 
  

Когда вы запускаете конвейер, вы можете увидеть поле ввода.

В этом случае вы можете использовать Rest API для передачи значений параметров при запуске конвейера. Вы можете использовать этот Rest API: Runs — Run Pipeline

Пример сценария PowerShell:

$token = "PAT"

$url = "https://dev.azure.com/{OrganizationNmae}/{ProjectName}/_apis/pipelines/{PipelineId}/runs?api-version=5.1-preview"

$token = [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($token)"))

$JSON = @'
{
  


  "resources": {
    "repositories": {
      "self": {
        "refName": "refs/heads/BranchName"
      }
    }
  },
  "templateParameters": {
    "InstanceArgs":"[1,2,3]"
   },



}
'@

$response = Invoke-RestMethod -Uri $url -Headers @{Authorization = "Basic $token"} -Method Post -Body $JSON -ContentType application/json