GitHub Actions:workflow_call输入致任务因if条件跳过的排查与解决
GitHub Actions工作流条件判断问题排查与修复
问题场景
我有一套GitHub Actions工作流,定义了一个默认值为false的布尔型输入参数called_via_workflow_call,通过workflow_call调用工作流时将其设为true。为dependency-build任务设置的条件在依赖变更且输入参数为默认值时,任务仍被跳过,具体情况如下:
相关工作流代码
dependency-build.yaml
name: Dependency-Build1 on: workflow_call: inputs: called_via_workflow_call: type: boolean default: false # Default value if not triggered by workflow_call push: branches: - master jobs: check-changes: runs-on: ubuntu-latest outputs: dependency_changed: ${{ steps.changes.outputs.dependency }} steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - name: Filter changes id: changes uses: dorny/paths-filter@v3 with: filters: | dependency: - 'dependency-project01/**' - name: Debug Changes Output run: | echo "Changes Output: ${{ steps.changes.outputs.dependency }}" dependency-build: needs: check-changes if: needs.check-changes.outputs.dependency_changed == true && ${{ inputs.called_via_workflow_call == false }} runs-on: ubuntu-latest steps: - name: Debug Job Start run: | echo "Dependency-build job started" - name: Output Dependency Changed run: | echo "Dependency Changed: ${{ needs.check-changes.outputs.dependency_changed }}" - name: Debug Workflow Call Input run: | echo "Called via Workflow: ${{ inputs.called_via_workflow_call }}" - name: Checkout Repository uses: actions/checkout@v4 - name: Build Dependency Project run: | echo "Building Dependency Project..."
shared-build.yaml
name: Shared-Build01 on: push: paths: - 'shared-project01/**' branches: - master jobs: complete-job: runs-on: ubuntu-latest steps: - name: Say Hello run: echo "The Shared-Build01 job has been completed successfully!" - name: Sleep for 30 seconds run: sleep 30s shell: bash call_dependency_build1: needs: complete-job uses: ./.github/workflows/dependency-build1.yml with: called_via_workflow_call: true
测试情况
- 仅使用
if: needs.check-changes.outputs.dependency_changed == true时,dependency-project01有变更时dependency-build任务可正常运行。 - 使用包含
inputs.called_via_workflow_call的完整条件时,即使dependency-project01有变更且输入参数为默认false,任务仍会被跳过。
原因分析
类型不匹配:字符串 vs 布尔值
dorny/paths-filter输出的dependency是字符串类型的'true'或'false',而非布尔值。原条件中needs.check-changes.outputs.dependency_changed == true是将字符串与布尔值比较,结果为false。inputs.called_via_workflow_call定义为布尔类型,原条件中inputs.called_via_workflow_call == 'false'是将布尔值与字符串比较,结果同样为false。
两者逻辑与后整体条件为false,导致任务被跳过。
表达式语法混合问题
原条件混合了直接书写的逻辑和${{ }}表达式,容易引发类型判断混乱,不符合GitHub Actions表达式的规范写法。
解决方案
修改dependency-build任务的if条件,统一类型比较并规范表达式写法:
if: ${{ needs.check-changes.outputs.dependency_changed == 'true' && !inputs.called_via_workflow_call }}
说明
- 将
needs.check-changes.outputs.dependency_changed与字符串'true'比较,匹配paths-filter的输出类型。 - 使用
!inputs.called_via_workflow_call直接判断布尔值是否为false,避免类型转换问题。 - 整个条件包裹在
${{ }}中,符合GitHub Actions表达式的规范写法。
修改后,当工作流被push触发(依赖变更且called_via_workflow_call为默认false)时,条件成立,任务正常运行;当通过workflow_call调用时(called_via_workflow_call为true),条件不成立,任务被跳过,完全符合预期逻辑。
内容的提问来源于stack exchange,提问作者Coffee_addict
相关产品推荐
相关产品推荐

