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
相关产品推荐
相关产品推荐

