You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Github Actions中always()组合条件在次级流水线不生效原因咨询

问题描述

在GitHub Actions工作流中,核心流水线的条件if: always() && needs.secondary-workflow.outputs.boolean == 'true'能正常工作——次级工作流失败时,三级工作流仍会在次级工作流输出为true时运行。但次级流水线中的job-4,当条件改为if: always() && inputs.boolean == 'true'时会被跳过,仅保留always()时才能正常运行。

核心流水线代码:

name: Core Pipeline
on: 
  workflow_dispatch:
    inputs: 
      boolean: 
        description: 'boolean'
        required: false
        default: true
        type: boolean 

jobs:
  secondary-workflow:
    uses: ./.github/workflows/secondary-workflow.yaml
    with:
      boolean: true 
  tertiary-workflow:
    needs: secondary-workflow
    uses: ./.github/workflows/tertiary-workflow.yaml
    if: always() && needs.secondary-workflow.outputs.boolean == 'true'

次级流水线代码:

on: 
  workflow_call:
    inputs: 
      boolean: 
        description: 'Boolean'
        required: false
        default: true
        type: boolean 
    outputs: 
      boolean: 
        description: "Test Output"
        value: ${{ jobs.job-4.outputs.boolean }}

jobs:
  job-1:
    runs-on: ubuntu-latest
    steps:
      - name: job 1 
        run: echo 'This job runs'
  job-2:
    runs-on: ubuntu-latest
    needs: job-1
    steps:
      - name: job 2
        run: echo 'This job runs'
  job-3:
    runs-on: ubuntu-latest
    needs: [job-1, job-2]
    steps:
      - name: Exit 
        run: echo "This job fails"; exit 1 
  job-4:
    runs-on: ubuntu-latest
    needs: [job-1, job-2, job-3]
    if: always() && inputs.boolean == 'true' # 添加&&后任务被跳过
    steps:
      - id: setOutput
        run: echo "boolean=true" >> $GITHUB_OUTPUT; echo "OUTPUT_SET"
    outputs:
      boolean: ${{ steps.setOutput.outputs.boolean }}

原因分析

核心问题是数据类型不匹配:

  • 核心流水线中,needs.secondary-workflow.outputs.boolean是字符串类型(由次级流水线job-4通过echo "boolean=true" >> $GITHUB_OUTPUT输出,本质是字符串'true'),所以用== 'true'比较可以得到true。
  • 次级流水线中,inputs.boolean是布尔类型(定义时type: boolean),GitHub Actions的表达式严格区分布尔值和字符串,true(布尔)≠'true'(字符串),因此inputs.boolean == 'true'会返回false。

当你添加&& inputs.boolean == 'true'时,整个条件变为always() && false,最终结果为false,所以job-4被跳过;而仅保留always()时,条件为true,job-4正常运行。

解决方案

将次级流水线job-4的条件改为直接判断布尔值,无需字符串比较:

if: always() && inputs.boolean

若需兼容字符串写法,也可将布尔值转为字符串后比较:

if: always() && format('{0}', inputs.boolean) == 'true'

内容的提问来源于stack exchange,提问作者floaty39

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:15:53