Azure Pipeline:使作业在同一池中的同一代理上运行

Tom*_*ger 1 yaml azure-pipelines azure-pipelines-yaml

我有一个 YAML 脚本,如下所示:

jobs:
- job: UnixBuild
  pool: 
    name: BuildMachinesUnix
  steps:
  - bash: echo "Build Unix"

- job: WinBuild
  pool: 
    name: BuildMachinesWindows
  steps:
  - bash: echo "Build Windows"

- job: UnixRelease
  dependsOn:
    - UnixBuild
    - WinBuild
  condition: and(succeeded('UnixBuild'), succeeded('WinBuild'))
  pool: 
    name: BuildMachinesUnix
  steps:
  - bash: echo "Release on Unix"

- job: WinRelease
  dependsOn:
    - UnixBuild
    - WinBuild
  condition: and(succeeded('UnixBuild'), succeeded('WinBuild'))
  pool: 
    name: BuildMachinesWindows
  steps:
  - bash: echo "Release on Windows"

Run Code Online (Sandbox Code Playgroud)

每个池都有多个代理,我希望承担 UnixBuild 作业的代理也能处理 UnixRelease 作业,因为该版本的所有文件都在那里,这样我就不需要在发布步骤中重建它,并且WindowsBuild 也是如此

这样的事情可能吗?如果可能的话,怎么可能?

如果没有,对于如何仅在 Unix 和 Windows 都成功时才发布,而不必编译两次,有什么好的建议吗?

Leo*_*SFT 7

\n

我希望承担 UnixBuild 作业的代理也能处理 UnixRelease 作业,因为该版本的所有文件都在那里,这样我就不需要在发布步骤中重建它,WindowsBuild 也是如此

\n
\n

答案是肯定的。

\n

要解决此问题,我们可以从 job\xef\xbc\x8c 获取代理名称,UnixBuild然后将其传递为demands

\n
  - job: UnixBuild\n    pool: \n      name: BuildMachinesUnix\n    steps:\n    - bash: echo "$(Agent.Name)"\n    - bash: |\n        echo "##vso[task.setvariable variable=someName;isOutput=true;]$(Agent.Name)"\n      name: setVariable\n\n  - job: UnixRelease\n    dependsOn:\n      - UnixBuild\n      - WinBuild\n    condition: and(succeeded('UnixBuild'), succeeded('WinBuild'))\n    variables: \n      TestsomeName: $[ dependencies.UnixBuild.outputs['setVariable.someName'] ]\n    pool: \n      name: BuildMachinesUnix\n      demands:\n      - Agent.Name -equals $(TestsomeName)\n    steps:\n    - bash: echo "$(TestsomeName)"\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这是可能的,但会导致排队问题,因为如果中间有东西插入,您的第二个作业将排在最后。这意味着如果您想通过更好的缓存来节省时间,这会困扰您。 (2认同)