在Azure Devops管道中的部署作业生命周期挂钩之间共享变量
我一直在尝试在部署作业的生命周期挂钩中定义一个变量,然后在以后的生命周期挂钩中访问该变量。报告中提到了这样做的能力,但没有提供这种情况的实际例子,并强调: 在部署作业的生命周期挂钩中定义输出变量,并在同一阶段的其他下游步骤和作业中使用它们 我一直在使用的示例管道: 阶段: -阶段:管道 工作: -部署:部署 环境:“测试” 战略: 跳动: 部署前: 步骤: -狂欢节:| 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']],以及许多其他语法 我已经尝试在作业级别定义变量,希望它们能够通过第一个部署前生命周期挂钩进行更新,并可用于部署生命周期挂钩。 我已经尝试通过运行时表达式语法回显变量 还有很多其他的语法组合,希望我能找到真正的答案 但一切都无济于事。我可能会求助于将变量作为工件上传并稍后下载,但我真的很想找到这个问题的解决方案。有人能做到这一点吗?非常感谢。解决以下问题: 首先,与您分享您正在寻找的此场景的正确示例:在Azure Devops管道中的部署作业生命周期挂钩之间共享变量,azure,azure-devops,azure-pipelines,Azure,Azure Devops,Azure Pipelines,我一直在尝试在部署作业的生命周期挂钩中定义一个变量,然后在以后的生命周期挂钩中访问该变量。报告中提到了这样做的能力,但没有提供这种情况的实际例子,并强调: 在部署作业的生命周期挂钩中定义输出变量,并在同一阶段的其他下游步骤和作业中使用它们 我一直在使用的示例管道: 阶段: -阶段:管道 工作: -部署:部署 环境:“测试” 战略: 跳动: 部署前: 步骤: -狂欢节:| echo vso[task.setvariable=myLocalVar;isOutput=false]局部变量 名称:set
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样品 谢谢!令人沮丧的是,医生们认为这是可能的,我希望有一天这会成为可能,但这一解决办法完成了工作。