繁体   English   中英

Github 操作“always()”条件未按预期工作?

[英]Github actions "always()" condition not working as expected?

我感兴趣的是为什么这个 always() 条件在 Github 工作流中没有按预期运行。

我有一个核心管道,它工作得很好。 如果二级工作流失败,三级工作流仍然运行,但前提是二级工作流中的 boolean output == true。

在辅助管道中,output 步骤应该仅在 boolean 输入设置为 true 时运行。 尽管我使用了完全相同的语法,但它似乎只在条件为 always() 而不是 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' (ADDING THE && CAUSES THE JOB TO BE SKIPPED) 
    steps:
      - id: setOutput
        run: echo "boolean=true" >> $GITHUB_OUTPUT; echo "OUTPUT_SET"
    outputs:
      boolean: ${{ steps.setOutput.outputs.boolean }}

我的问题是,为什么在 always() 之外添加第二个条件对核心管道有效,但对辅助管道无效?

谢谢!

当你比较

if: always() && inputs.boolean == 'true'

您正在将 boolean 与字符串进行比较。 在类型不匹配时, 操作将操作数强制转换为数字 true变为1 ,并且'true' (字符串)变为NaN ,并且1 == NaN为 false。 要修复,您可以与 boolean 文字而不是字符串进行比较:

if: always() && inputs.boolean == true

或者您应该能够自己检查 boolean:

if: always() && inputs.boolean

至于为什么看似相同的条件在一个地方起作用而在另一个地方不起作用,我的猜测是可重用工作流中的输入参数类型为 boolean,而needs.secondary-workflow.outputs.boolean是一个字符串,所以比较到'true'作品。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM