簡體   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