Как передать значения среды c в конвейер Azure? - PullRequest
0 голосов
/ 08 января 2020

Я развертываю пакеты приложений Service Fabri c, и у меня есть несколько (~ 15) сред разработки, каждая из которых может использоваться для тестирования исправления кода. Я могу передать служебное соединение, поэтому развертывание окончательного пакета не является проблемой. Чего я не могу понять, так это как установить переменные c для другой среды на основе целевой среды. Я попытался использовать имя Service Connection, чтобы выбрать один из нескольких файлов шаблонов переменных:

variables:
- name: envTemplateFileTest
  ${{ if eq( variables['DevConnection'], 'Environ01' ) }}:
    value: ../Templates/DEV01-Variables-Template.yml
  ${{ if eq( variables['DevConnection'], 'Environ02' ) }}:
    value: ../Templates/DEV02-Variables-Template.yml

... (snip) ...

variables:
  - template: ${{ variables.envTemplateFile }}

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

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

В настоящее время у меня есть пустой шаблон переменной и скрипт powershell, который устанавливает значения на основе разных имен сценариев.

        - task: PowerShell@2
          inputs:
            targetType: 'filePath'
            filePath: '$(Build.ArtifactStagingDirectory)\drop\Deployment\Code\Scripts\Set-$(DevConnection)Variables.ps1'
            #arguments: # Optional
          displayName: Set environment variables

Должен быть способ получше, чем этот. Пожалуйста.

Ответы [ 2 ]

0 голосов
/ 16 января 2020

Мы решили добавить шаг сценария Powershell, который устанавливает переменные на основе переданной строки.

    - task: PowerShell@2
      inputs:
        targetType: 'filePath'
        filePath: $(Build.ArtifactStagingDirectory)\drop\Deployment\Code\Scripts\Set-DefaultValues.ps1
      displayName: Set default pipeline variables

Затем мы загружаем соответствующий файл и l oop через переменные, устанавливая каждая по очереди.

param(
  [string]
  $EnvironmentName
)

$environmentValues = @{}

switch ($EnvironmentName) {
  'DEV98' { . '.\Dev98-Values.ps1'}
  'DEV99' { . '.\Dev99-Values.ps1'}
}

foreach ($keyName in $environmentValues.Keys) {
  Write-Output "##vso[task.setvariable variable=$($keyName)]$($environmentValues[$keyName])"
}

Это позволяет нам поместить переменные среды c в простой объектный файл PSCustom и импортировать его по точкам.

$environmentValues = @{
    currentYear = '2020';
    has_multiple_nodetypes = 'false';
    protocol = 'http';
    endpoint = 'vm-dev98.cloudapp.com';
    ... snip ...
}

Так что в QA проще время поддержки различных файлов среды. Надеюсь, это поможет другим.

0 голосов
/ 09 января 2020

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

Однако у меня есть обходной путь, при котором нет необходимости писать дополнительный сценарий ps и избегать измените файл и зарегистрируйте его в своем репо каждый раз.

Поскольку все ваши самые передовые среды имеют одинаковые этапы развертывания. Затем вы можете создать шаблон шагов yaml для хранения шагов развертывания.

Затем вы можете изменить свой azure -pipelines.yml, как показано в следующем примере:

jobs:
- job: A
  pool:
    vmImage: 'windows-latest'

  steps:
  - powershell: |
      $con = "$(connection)" 
      if($con -eq "environ1"){echo "##vso[task.setvariable variable=variablegroup;isOutput=true]environ1"}
      if($con -eq "environ2"){echo "##vso[task.setvariable variable=variablegroup;isOutput=true]environ2"}
    name: setvarStep
  - script: echo '$(setvarStep.variablegroup)'


- job: environ1
  pool:
    vmImage: 'windows-latest'
  dependsOn: A
  condition: eq(dependencies.A.outputs['setvarStep.variablegroup'], 'environ1')
  variables: 
    - template: environ1.yaml
  steps:
  - template: deploy-jobs.yaml


- job: environ2
  pool:
    vmImage: 'windows-latest'
  dependsOn: A
  condition: eq(dependencies.A.outputs['setvarStep.variablegroup'], 'environ2')
  variables: 
    - template: environ2.yml
  steps:
  - template: deploy-jobs.yaml

Использование конвейера выше yml зависимости и условия . Первое задание A выведет переменную в соответствии с переменной (например, $(connection)), которую вы указали при запуске конвейера. В следующих заданиях существуют условия для оценки выходной переменной. Если условие выполнено, то задание будет выполнено, задание будет пропущено при сбое по условию.

...