Azure devops Can';无法获取要传递给另一个部署作业的部署作业输出变量

Azure devops Can';无法获取要传递给另一个部署作业的部署作业输出变量,azure-devops,Azure Devops,我正在尝试使用Azure DevOps配置docker swarm群集,环境中包含3个安装了docker的RHEL7 vm,其中一个被配置为swarm主机 以下是管道的yaml文件: jobs: - deployment: MasterNode strategy: runOnce: deploy: steps: - bash: | SWARMTOKEN=$(docker swarm join-token manage

我正在尝试使用Azure DevOps配置docker swarm群集,环境中包含3个安装了docker的RHEL7 vm,其中一个被配置为swarm主机

以下是管道的yaml文件:

jobs:
- deployment: MasterNode
  strategy:
    runOnce:
      deploy:
        steps:
        - bash: |
            SWARMTOKEN=$(docker swarm join-token manager -q)
            echo "##vso[task.setvariable variable=tokenswarm;isOutput=true]$SWARMTOKEN"
          name: setvar
        - script: echo $(setvar.tokenswarm)
          name: echovar
  environment:
    name: swarm
    resourceType: VirtualMachine
    tags: SwarmNodeMaster

- deployment: SwarmNode
  dependsOn: MasterNode
  variables:
    tokenvar: $[ dependencies.MasterNode.outputs['deploy.setvar.tokenswarm'] ]
  strategy:
    runOnce:
      deploy:
        steps:
        - bash: |
            echo $(tokenvar)
  environment: 
    name: swarm
    resourceType: VirtualMachine
    tags: SwarmNode 
我已经在VSD上登录了

我已尝试按照以下语法将第二个部署作业设置为正常作业:

无论我尝试什么,似乎都无法在下一个部署步骤中扩展变量

提前感谢您的帮助

更新: @Kontekst感谢您分享您的工作yaml,利用它,我成功地跟踪到定义“主”节点的环境:

swarm master节点具有标记“SwarmNodeMaster”,并且与其他两个具有标记“SwarmNode”的虚拟机属于相同的环境,如果我将上述更改为just environment,则在第二步中使用该标记:“swarm”我可以将变量传递到下一步,但如果我尝试以主节点为目标,则再次停止工作

以下是成功将变量传递给下一个部署作业的yaml:

我的主要问题是,我需要从swarm主机向swarm节点获取令牌,但当我尝试将变量从针对swarm主机的部署步骤传递到针对swarm节点的部署作业时,该变量无法在第二个部署作业中展开


这就是我想要解决的问题,但似乎破坏了输出变量:

因此,经过多次尝试和错误,我发现当您将环境标记用作部署作业的一部分时,它会将作业名称附加到环境资源名称之后,再加上生命周期挂钩。这是工作代码:

stages:
- stage: MyStage
  jobs:
  - deployment: masterNode
    displayName: AnyDeploy
    pool:
      vmImage: 'ubuntu-latest'
    environment:
      name: swarm
      resourceType: virtualmachine
      tags: swarmnodemaster
    strategy:
      runOnce:
       deploy:
        steps:
        - task: Bash@3
          displayName: 'Setting output variable'
          inputs:
            targetType: 'inline'
            script: |
              token=Some_Value
              echo "##vso[task.setvariable variable=token;isOutput=true]$token"
              echo $token
          name: setvarStep
        - task: Bash@3
          inputs:
            targetType: 'inline'
            script: 'env | sort'

  - deployment: swarmNode
    dependsOn: masterNode
    pool:
      vmImage: 'ubuntu-latest'
    environment:
      name: swarm
      resourceType: virtualmachine
      tags: swarmnode
    variables:
      myToken: $[ dependencies.masterNode.outputs['masterNode_<resource name>_Deploy.setvarStep.token'] ]
    strategy:
      runOnce:
       deploy:
        steps:
        - task: Bash@3
          displayName: 'Checking if output variable was passed'
          inputs:
            targetType: 'inline'
            script: |
              echo My docker token = $(myToken)
阶段:
-舞台:MyStage
工作:
-部署:主节点
显示名称:AnyDeploy
游泳池:
vmImage:“ubuntu最新版本”
环境:
姓名:swarm
资源类型:虚拟机
标签:swarmnodemaster
战略:
跳动:
部署:
步骤:
-任务:Bash@3
displayName:“设置输出变量”
投入:
targetType:“内联”
脚本:|
令牌=某个值
echo“##vso[task.setvariable=token;isooutput=true]$token”
echo$代币
名称:setvarStep
-任务:Bash@3
投入:
targetType:“内联”
脚本:“env | sort”
-部署:swarmNode
dependsOn:masterNode
游泳池:
vmImage:“ubuntu最新版本”
环境:
姓名:swarm
资源类型:虚拟机
标记:swarmnode
变量:
myToken:$[dependencies.masterNode.outputs['masterNode\uu Deploy.setvarStep.token']]
战略:
跳动:
部署:
步骤:
-任务:Bash@3
displayName:'检查是否传递了输出变量'
投入:
targetType:“内联”
脚本:|
回显我的docker令牌=$(myToken)

我还没有找到将作业名称作为变量引用的方法,因为每个作业的值都会发生变化,但是系统变量是“system_JOBNAME”

试试这个,然后告诉我它是否有效----tokenvar:$[dependencies.masternode.outputs['masternode.setvar.token']@Kontekst No没有起作用我现在找不到任何问题。你可以看看我以前的yaml,我一直在测试这个功能。它现在适合我了。你可以检查你的和我的yaml之间的差异,这可能会有所帮助。作业B登录控制台“My IP variable=SomeIpAddress”,因此该yaml工作正常。请为未来的用户描述答案,我的yaml代码将在30天后过期:PI已经更新了OP,我仍然无法得到我想要的工作…也许我正在尝试的是无法实现的。。。
environment:
      name: swarm
      resourceType: VirtualMachine
      tags: SwarmNodeMaster
stages:
- stage: MyStage
  jobs:
  - deployment: masterNode
    displayName: AnyDeploy
    pool:
      vmImage: 'ubuntu-latest'
    environment:
      name: swarm
      resourceType: virtualmachine
      tags: swarmnodemaster
    strategy:
      runOnce:
       deploy:
        steps:
        - task: Bash@3
          displayName: 'Setting output variable'
          inputs:
            targetType: 'inline'
            script: |
              token=Some_Value
              echo "##vso[task.setvariable variable=token;isOutput=true]$token"
              echo $token
          name: setvarStep
        - task: Bash@3
          inputs:
            targetType: 'inline'
            script: 'env | sort'

  - deployment: swarmNode
    dependsOn: masterNode
    pool:
      vmImage: 'ubuntu-latest'
    environment:
      name: swarm
      resourceType: virtualmachine
      tags: swarmnode
    variables:
      myToken: $[ dependencies.masterNode.outputs['masterNode_<resource name>_Deploy.setvarStep.token'] ]
    strategy:
      runOnce:
       deploy:
        steps:
        - task: Bash@3
          displayName: 'Checking if output variable was passed'
          inputs:
            targetType: 'inline'
            script: |
              echo My docker token = $(myToken)