【问题标题】:Can't get a deployment job output variable to pass to another deployment job无法获取部署作业输出变量以传递给另一个部署作业
【发布时间】:2020-03-04 12:19:31
【问题描述】:

我正在尝试使用 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 https://developercommunity.visualstudio.com/content/problem/937451/unable-to-share-variable-from-one-deployment-job-t.html记录了这个

我已尝试按照https://docs.microsoft.com/en-us/azure/devops/release-notes/2020/sprint-164-update#support-for-output-variables-in-a-deployment-job 的语法将第二个部署作业设置为正常作业

jobs:
- deployment: masternode
  strategy:
    runOnce:
      deploy:
        steps:
        - script: | 
            SWARMTOKEN="Docker GUID"
            echo "##vso[task.setvariable variable=token;isOutput=true]$SWARMTOKEN"
          name: 'setvar'
        - script: echo $(setvar.token)
          name: echovar
  environment:
    name: swarm
    resourceType: VirtualMachine
    tags: SwarmNodeMaster

- job: 'swarmnode'
  dependsOn: 'masternode'
  variables:
    tokenvar: $[ dependencies.masternode.outputs['deploy.setvar.token'] ]
  steps:
  - script: echo $(tokenvar)
    name: echovar

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

提前感谢您的帮助!

更新: @Kontekst 感谢您分享您的工作 yaml,我已经设法追踪它来定义“主”节点的环境:

environment:
      name: swarm
      resourceType: VirtualMachine
      tags: SwarmNodeMaster

swarm master 节点具有标签“SwarmNodeMaster”,并且与其他 2 个具有标签“SwarmNode”的 VM 属于同一环境,如果我将上述内容更改为仅环境,则在第二步中使用该标签:'swarm ' 我可以将变量传递给下一步,但如果我尝试定位主节点,则会再次停止工作......

这是成功将变量传递给下一个部署作业的 yaml: https://hastebin.com/gudelokufi.bash

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

这是我想要的工作,但似乎破坏了输出变量:https://hastebin.com/yocepowopu.bash

【问题讨论】:

  • 试试这个并告诉它是否有效 ---- tokenvar: $[ dependencies.masternode.outputs['masternode.setvar.token'] ]
  • @Kontekst 不,那没用
  • 我现在找不到任何问题。你可以看看我之前测试过这个功能的 yaml。它现在对我有用。您可以检查您的和我的 yaml 之间的差异,这可能会有所帮助。作业 B 登录控制台“我的 IP 变量 = SomeIpAddress”,所以看起来这个 yaml 是正确的。 hastebin.com/heruqaveze
  • 请为未来的用户描述答案,我的 yaml 代码将在 30 天内到期:P
  • 我已经更新了 OP,我仍然无法得到我想要的工作..也许我想要做的事情无法实现......

标签: azure-devops


【解决方案1】:

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

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)

我还没有找到将作业名称作为变量引用的方法,因为值随每个作业而变化,但系统变量是“SYSTEM_JOBNAME”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2018-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多