如何在Azure Pipelines中条件性使用容器运行作业?
问题根因
你配置中使用的${{ if variables['CONTAINER'] }}属于编译时模板表达式,会在管道启动初期、矩阵策略还未展开的时候就执行判断。此时矩阵内定义的CONTAINER变量还没有被注入到作业上下文,因此这个条件永远判定为假,container配置永远不会生效,自然不会启动容器。
解决方案
这里提供两种常用的实现方式:
方案1:直接使用运行时变量(最简写法)
Azure Pipelines的container.image属性原生支持运行时变量解析,你不需要额外加条件判断,不需要容器的矩阵项不定义CONTAINER变量即可。如果CONTAINER为空,管道会自动跳过容器初始化,直接在宿主VM上执行作业。
修正后的配置示例:
stages: - stage: Test jobs: - job: 'Linux' strategy: matrix: GCC_10: CXX: g++-10 VM_IMAGE: ubuntu-20.04 GCC_9: CXX: g++-9 VM_IMAGE: ubuntu-20.04 Clang_3_7: CXX: clang++-3.7 VM_IMAGE: ubuntu-20.04 CONTAINER: ubuntu:16.04 pool: vmImage: $(VM_IMAGE) container: image: $(CONTAINER) options: "--name ci-container -v /usr/bin/docker:/tmp/docker:ro"
方案2:拆分矩阵为两个作业(兼容性最好)
如果担心低版本AzP不支持方案1的空镜像逻辑,可以把需要容器和不需要容器的矩阵项拆分为两个独立作业,公共测试步骤可以抽为模板复用,避免重复代码:
stages: - stage: Test jobs: # 不需要容器的作业,跑GCC版本 - job: Linux_GCC strategy: matrix: GCC_10: CXX: g++-10 VM_IMAGE: ubuntu-20.04 GCC_9: CXX: g++-9 VM_IMAGE: ubuntu-20.04 pool: vmImage: $(VM_IMAGE) steps: # 你的测试步骤,可抽为模板复用 - script: echo "Testing with CXX = $(CXX)" # 需要容器的作业,跑旧版本Clang - job: Linux_Clang_Old strategy: matrix: Clang_3_7: CXX: clang++-3.7 VM_IMAGE: ubuntu-20.04 CONTAINER: ubuntu:16.04 pool: vmImage: $(VM_IMAGE) container: image: $(CONTAINER) options: "--name ci-container -v /usr/bin/docker:/tmp/docker:ro" steps: # 复用和上面相同的测试步骤即可 - script: echo "Testing with CXX = $(CXX)"
内容的提问来源于stack exchange,提问作者Flamefire
相关产品推荐
相关产品推荐

