CircleCI流水线跨Job传参后when条件不生效的解决方案咨询
CircleCI 基于前Job结果条件执行后续步骤的问题
我在CircleCI流水线里想根据前一个Job的执行结果,条件执行后续步骤。试了好几种方法把Step1的变量暴露成全局变量,在Step2里能读取到——能查看、打印这个变量,但when块的条件始终被判定为空。查了资料知道CircleCI的逻辑条件是在Job运行前就评估完的,现在求替代方案实现基于前Job的条件执行第二个Job里的步骤。
问题示例代码:
version: 2.1 orbs: workflows: test-and-deploy: jobs: - set-data: context: my-context - read-data: context: my-context requires: - set-data definitions: node_image: &node-image docker: - image: cimg/node:14.15.5 executors: base-12-14-0: description: | Single Docker container with Node 12.14.0 and Cypress dependencies see https://github.com/cypress-io/cypress-docker-images/tree/master/base. Use example: `executor: cypress/base-12-14-0`. docker: - image: cypress/base:12.14.0 jobs: set-data: <<: *node-image description: Sets the data steps: - run: echo "VAR=app" > global-vars - persist_to_workspace: root: . paths: - global-vars read-data: <<: *node-image description: read the data steps: - attach_workspace: at: . - run: ls - run: cat global-vars # 这里能看到global-vars里的正确变量 - run: cat global-vars >> $BASH_ENV - run: echo "Test $VAR" # 能成功打印变量 - when: condition: matches: { pattern: "app", value: $VAR } steps: - run: echo "Condition Executed"
替代方案
方案1:用Shell脚本内置逻辑替代when块
因为CircleCI的when条件在Job启动前就完成评估,无法读取运行时生成的变量,直接在run步骤里用Shell的if判断即可实现条件执行:
jobs: read-data: <<: *node-image description: read the data steps: - attach_workspace: at: . - run: ls - run: cat global-vars >> $BASH_ENV - run: | if [[ "$VAR" == "app" ]]; then echo "Condition Executed" # 在这里添加需要条件执行的所有命令 fi
方案2:通过流水线参数传递实现工作流层面的条件判断
将set-data的结果写入CircleCI流水线参数,这样read-data的条件可以在工作流层面评估:
- 修改
set-dataJob,把变量写入流水线参数:
jobs: set-data: <<: *node-image description: Sets the data steps: - run: echo "VAR=app" > global-vars - persist_to_workspace: root: . paths: - global-vars - run: | export VAR_VALUE=$(cat global-vars | cut -d= -f2) circleci config set pipeline.parameters.VAR "$VAR_VALUE"
- 在工作流中使用参数控制
read-data的步骤或Job执行:
workflows: test-and-deploy: jobs: - set-data: context: my-context - read-data: context: my-context requires: - set-data # 可以控制整个Job是否执行 when: matches: pattern: "app" value: << pipeline.parameters.VAR >>
如果不需要控制整个Job,也可以在read-data的run步骤中直接引用<< pipeline.parameters.VAR >>做判断。
方案3:拆分条件逻辑为独立Job
如果条件执行的步骤可以独立,直接在工作流层面控制这个独立Job是否启动:
workflows: test-and-deploy: jobs: - set-data: context: my-context - read-data: context: my-context requires: - set-data - conditional-execution: context: my-context requires: - set-data when: matches: pattern: "app" value: << pipeline.parameters.VAR >> jobs: conditional-execution: <<: *node-image steps: - run: echo "Condition Executed" # 添加其他需要条件执行的步骤
内容的提问来源于stack exchange,提问作者khaled Mohamed
相关产品推荐
相关产品推荐

