Не удается изменить подключение к службе в задаче конвейера выпуска Azure DevOps

#azure #azure-devops #azure-pipelines-release-pipeline #serviceconnection

#azure #azure-devops #azure-pipelines-release-pipeline #serviceconnection

Вопрос:

У меня есть конвейер выпуска в Azure DevOps с одним этапом. Этап содержит задачу «Kubectl» для входа в кластер AKS. В качестве параметра ожидается подключение к службе. Моя проблема в том, что я получаю подключение к службе из предыдущей задачи, которая считывает значение из «Конфигурации приложения». Значение, которое я получаю из конфигурации приложения, задается как переменная среды, которую я затем передаю таким образом echo "##vso[task.setvariable variable=SC]$AKS_SERVICECONNECTION" . Итак, переменная есть SC , и я установил подключение к службе в «Kubectl»-войдите с помощью $(SC) . $AKS_SERVICECONNECTION имеет правильное значение, я распечатал его для проверки.

Это не работает. Значение не установлено, хотя переменная среды SC теперь имеет правильное значение. Итак, я протестировал это с параметром пространства имен, и это работает, но не с подключением к службе. Мой вопрос и предположение заключается в том, что подключение к службе должно быть установлено во время выполнения и не может быть установлено в предыдущей задаче, которую будет использовать следующая задача?

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

1. SC Это имя или идентификатор службы?

2. $(SC) это имя переменной, которую я установил в поле для подключения к службе. Это означает, что я назначил ему переменную SC в задаче Bash после задачи настройки приложения с именем подключения к службе и перед kubectl задачей входа в систему, которая использует $ (SC).

3. Это я понял, но каково значение этой переменной? имя подключения к службе или идентификатор подключения к службе?

4. Ах, извините, значение — это имя подключения к службе

5. Если вы можете, попробуйте ввести идентификатор

Ответ №1:

Похоже, что подключение к службе для задачи Kubectl извлекается во время компиляции перед выполнением задачи. Я создал переменную тестирования в разделе Переменные конвейера выпуска и изменил значение переменной тестирования в задаче сценария с помощью echo "##vso[task.setvariable.. . Я видел в журнале задач, что исходное значение для переменной тестирования всегда выбиралось.

Смотрите эту аналогичную проблему здесь.

Однако вы можете использовать rest api в качестве обходного пути. Смотрите следующие шаги:

1. Добавьте второй этап в свой конвейер выпуска. Выберите триггер как Manual Only . Переместите задачу Kubectl и связанные с ней задачи на второй этап (т.е. Kubetcl этап на скриншоте ниже) введите описание изображения здесь

2. Определите переменную ServiceCon в Variables разделе. Выберите переменную Scope для второго этапа (т.Е. Kubetcl ). Проверьте Settable at release time

введите описание изображения здесь

3. Добавьте задачу сценария для вызова обновления api среды выпуска rest на первом этапе (т.Е. SetServiceCon этап). Смотрите ниже встроенный сценарий powershell: Переменной SC присвоено имя подключения к службе в предыдущей задаче.

 $url = "https://vsrm.dev.azure.com/Org/Project/_apis/Release/releases/$(Release.ReleaseId)/environments/$($(Release.EnvironmentId) 1)?api-version=6.1-preview.7"

#override the variable ServiceCon by referencing to variable $(SC) from your previous task
$body = @{
  status= "inProgress";
  variables= @{ ServiceCon= @{value= $(SC)}}
}

Invoke-RestMethod -Uri $url -Headers @{Authorization = "Bearer $(System.AccessToken)"} -Method patch -Body (ConvertTo-Json $body) -ContentType "application/json"
  

Приведенный выше сценарий запустит второй этап (т. Е. этап kubetcl) с обновленным именем подключения к службе

4. Чтобы получить доступ к токену $(System.AccessToken) на предыдущем шаге, вам необходимо перейти на страницу редактирования первого этапа и установить флажок Allow scripts to access the OAuth token , см. Скриншот ниже.

введите описание изображения здесь

5, Вам также необходимо allow разрешение Manage deployments и edit release stage для учетной записи службы сборки. Смотрите скриншот ниже.

На странице редактирования конвейера выпуска. Щелкните 3 точки в правом верхнем углу. И выберите Security .

введите описание изображения здесь

Allow Manage deployments и edit release stage разрешение для (ProjectName)build service (OrgName) учетной записи.

введите описание изображения здесь

После выполнения вышеуказанных шагов и при запуске вашей линии выпуска сначала будет выполнен первый этап, и задача сценария вызовет rest API среды выпуска обновлений. Затем будет запущен второй этап с обновленным именем подключения к службе

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

1. Я протестировал ваше решение в классическом редакторе, оно работает, спасибо! Вы знаете, возможно ли это сделать в конвейере YAML? Я не смог найти rest api для конвейеров обновлений :/