Azure 管道、关于变量、powershell 和部署的问题

Azure pipelines, question about variables, powershell and deployments

我正在构建 Azure Pipelines,用于从我们的 Windows 自托管代理部署 Intranet、dotnet 核心项目。

我收到团队的请求,如果 PowerShell 脚本将变量初始化为某个值,下一步应该包括特定环境。

我们的目标是,对于某些项目,我们比较来自代理和 DEV 服务器的文件,如果不同,我们请求批准。

我试图使它与全局变量一起工作,但对不同的语法感到困惑。

这是我拥有的:

YAML

variables:
- name: MYVAR
  value: '0'

stages:
  - stage: Init
    jobs:
    - job: DisplayBefore
      steps:
        - checkout: none
        - task: CmdLine@2
          inputs:
            script: |
              echo Varname before :
              echo $(MYVAR)

===> 显示:0

  - stage: RunScript
    dependsOn: Init
    jobs:
    - job: CallScript
      steps:
        - checkout: none
        - task: PowerShell@2
          name: SetVarname
          inputs:
            targetType: filePath
            filePath: '{agent}\compareFileContent.ps1'

    - job: DisplayInSameStage
      dependsOn: CallScript
      steps:
        - checkout: none
        - task: CmdLine@2
          inputs:
            script: |
              echo Varname after :
              echo ${{ variables.MYVAR }}

===> 显示:0

      echo $(MYVAR)

===> 显示:0

  - stage: DeploymentStage
    dependsOn: RunScript
    condition: eq(variables.MYVAR, '1')
    jobs:
    - deployment: DeploymentJob
      environment: 'ATest'
      strategy:
        runOnce:
          deploy:
            steps:
              - checkout: none
              - task: CmdLine@2
                inputs:
                  script: |
                  echo Varname after :
                  echo ${{ variables.MYVAR }}

{agent}\compareFileContent.ps1

[CmdletBinding()]
param ()

echo $env:MYVAR

===> Displays: 0

$env:MYVAR = 2

echo $env:MYVAR

===> Displays: 2

echo "##vso[task.setvariable variable=env:MYVAR;]3"

exit

我的计划是为相反的情况准备另一个阶段,也许您会看到更好的方法或指导来解决我所缺少的?谢谢!!!

*********** 更新 1

我使用了环境变量,因为我知道这是从脚本访问它们的方式,如果有其他方式,我很乐意知道!

我使用阶段是因为我需要使用环境,它们似乎需要自己的阶段和部署块,否则在评估条件之前测试环境。

这是我的最新测试:

variables:
- name: MYVAR
  value: '0'

stages:
  - stage: SingleStage
    jobs:
    - job: DisplayBefore
      steps:
        - checkout: none
        - task: CmdLine@2
          inputs:
            script: |
              echo $(MYVAR)

    - job: CallScript
      dependsOn: DisplayBefore
      steps:
        - checkout: none
        - task: PowerShell@2
          name: SetVarname
          inputs:
            targetType: filePath
            filePath: '..\compareFileContent.ps1'

    - deployment: DeploymentJob
      dependsOn: DisplayInSameStage
      condition: eq(variables.MYVAR, '1')
      environment: 'ATest'
      strategy:
        runOnce:
          deploy:
            steps:
              - checkout: none
              - task: CmdLine@2
                inputs:
                  script: |
                    echo EnvName Finally: $(EnvName)

这个 YAML 并没有做太多事情,因为它一开始就请求环境的批准。

我的方案要求仅根据在 PowerShell 脚本中计算的值触发此批准。

有什么想法吗?谢谢。

作业和阶段通常 run on different agents 因此您不能期望来自不同作业的环境变量保持其值。

如果您想使用全局变量,您可以在一个作业中包含多个步骤。否则,为了保持一些逻辑 job/stage 结构,您可以只写入和读取值 to/from 外部源。这取决于您的场景。