在Azure Devops管道中的部署作业生命周期挂钩之间共享变量

在Azure Devops管道中的部署作业生命周期挂钩之间共享变量,azure,azure-devops,azure-pipelines,Azure,Azure Devops,Azure Pipelines,我一直在尝试在部署作业的生命周期挂钩中定义一个变量,然后在以后的生命周期挂钩中访问该变量。报告中提到了这样做的能力,但没有提供这种情况的实际例子,并强调: 在部署作业的生命周期挂钩中定义输出变量,并在同一阶段的其他下游步骤和作业中使用它们 我一直在使用的示例管道: 阶段: -阶段:管道 工作: -部署:部署 环境:“测试” 战略: 跳动: 部署前: 步骤: -狂欢节:| echo vso[task.setvariable=myLocalVar;isOutput=false]局部变量 名称:set

我一直在尝试在部署作业的生命周期挂钩中定义一个变量,然后在以后的生命周期挂钩中访问该变量。报告中提到了这样做的能力,但没有提供这种情况的实际例子,并强调:

在部署作业的生命周期挂钩中定义输出变量,并在同一阶段的其他下游步骤和作业中使用它们

我一直在使用的示例管道:

阶段: -阶段:管道 工作: -部署:部署 环境:“测试” 战略: 跳动: 部署前: 步骤: -狂欢节:| echo vso[task.setvariable=myLocalVar;isOutput=false]局部变量 名称:setvarStep -狂欢节:| echo vso[task.setvariable=myOutputVar;isOutput=true]输出变量 名称:outvarStep -狂欢节:| echo“此处提供$myLocalVar和$outvarStep.myOutputVar” echo$myLocalVar和$outvarStep.myOutputVar都可以在这里找到 部署: 步骤: -狂欢节:| echo“此处既不提供$myLocalVar也不提供$outvarStep.myOutputVar” echo此处既不提供$myLocalVar也不提供$outvarStep.myOutputVar 我已经尝试了许多选项,但我所做的一切似乎都不允许它真正起作用-部署生命周期挂钩中bash任务的输出是:

这里既没有也没有

我已经尝试通过env:input将变量连接到bash任务,使用宏语法如$myOutputVar和运行时表达式语法,希望可能有一个隐藏的依赖项,我可以找到例如$[dependencies.Deploy.outputs['preDeploy.outVarStep.myOutputVar']],以及许多其他语法 我已经尝试在作业级别定义变量,希望它们能够通过第一个部署前生命周期挂钩进行更新,并可用于部署生命周期挂钩。 我已经尝试通过运行时表达式语法回显变量 还有很多其他的语法组合,希望我能找到真正的答案 但一切都无济于事。我可能会求助于将变量作为工件上传并稍后下载,但我真的很想找到这个问题的解决方案。有人能做到这一点吗?非常感谢。

解决以下问题:

首先,与您分享您正在寻找的此场景的正确示例:

stages:
- stage: Pipeline
  jobs:
  - deployment: Deploy
    environment: 'testing'
    strategy:
      runOnce:
        preDeploy:
          steps:
          - bash: |
              echo "##vso[task.setvariable variable=myLocalVar;isOutput=false]local variable"
            name: setvarStep
          - bash: |
              echo "##vso[task.setvariable variable=myOutputVar;isOutput=true]output variable"
            name: outvarStep
          - bash: |
              echo 'Both $(myLocalVar) and $(outvarStep.myOutputVar) are available here'
              echo "Both $(myLocalVar) and $(outvarStep.myOutputVar) are available here"
              mkdir -p $(Pipeline.Workspace)/variables
              echo "$(myLocalVar)" > $(Pipeline.Workspace)/variables/myLocalVar
              echo "$(outvarStep.myOutputVar)" > $(Pipeline.Workspace)/variables/myOutputVar

          - publish: $(Pipeline.Workspace)/variables
            artifact: variables
        deploy:
          steps:
          - bash: |
              echo 'Neither $(myLocalVar) nor $(outvarStep.myOutputVar) are available here'
              echo "Neither $(myLocalVar) nor $(outvarStep.myOutputVar) are available here"
          - download: current
            artifact: variables
          - bash: |
              myLocalVar=$(cat $(Pipeline.Workspace)/variables/myLocalVar)
              myOutputVar=$(cat $(Pipeline.Workspace)/variables/myOutputVar)
              echo "##vso[task.setvariable variable=myLocalVar;isoutput=true]$myLocalVar"
              echo "##vso[task.setvariable variable=myOutputVar;isoutput=true]$myOutputVar"
            name: output
          - bash: |
              echo "$(output.myLocalVar)"
              echo "$(output.myOutputVar)"
            name: SucceedToGet
您将看到输出变量可以在SucceedToGet任务中成功打印:

解释您以前的尝试失败的原因:

对于我们的系统,策略代表一个作业在开始运行编译时之前。它只在运行时扩展

在部署作业的生命周期中定义输出变量,并 在同一阶段的其他下游步骤和作业中使用它们


在这里,其他下游步骤和作业表示在编译时独立的独立作业。这就是为什么我们在这条线下提供YAML样品

谢谢!令人沮丧的是,医生们认为这是可能的,我希望有一天这会成为可能,但这一解决办法完成了工作。