Github Actions:设置输出似乎不起作用

mel*_*kes 6 github github-actions

我有一个工作流程,可以执行一堆模糊测试,最后计算所有crashers子目录中的文件总数。后来,在另一项工作中,我使用该号码向 Slack 发送通知。但是,由于某种原因,::set-output不会产生任何输出,最重要的是,即使数量crashers不为零,下一个作业也不会运行!

jobs:
  fuzz-nightly-test:
    runs-on: ubuntu-latest
    steps:
      ...
      - name: Set crashers count
        working-directory: test/fuzz
        run: echo "::set-output name=crashers-count::$(find . -type d -name 'crashers' | xargs -I % sh -c 'ls % | wc -l' | awk '{total += $1} END {print total}')"
        id: set-crashers-count

   outputs:
     crashers-count: ${{ steps.set-crashers-count.outputs.crashers-count }}

  fuzz-nightly-fail:
    needs: fuzz-nightly-test
    if: ${{ needs.set-crashers-count.outputs.crashers-count != 0 }}
    runs-on: ubuntu-latest
    steps:
      ...
Run Code Online (Sandbox Code Playgroud)

有人知道我做错了什么吗?谢谢你!

jid*_*ula 16

我用一个类似的最小示例做了很多测试,我想我已经解决了这个问题。最直接的是,在你的工作if指令中fuzz-nightly-fail,你需要访问needs.<job_id>.outputs.<job_output_id>而不是needs.<step_id>.outputs.<job_output_id>. 因此,该if指令将变为if: ${{ needs.fuzz-nightly-test.outputs.crashers-count != 0 }}.

此外,您可能应该创建一个与作业输出 ID 不同的步骤输出 ID,以避免对在何处引用哪个上下文对象感到困惑。因此,run您的第一份工作中的语句可能类似于run: echo "::set-output name=count::$(find . -type d -name 'crashers' | xargs -I % sh -c 'ls % | wc -l' | awk '{total += $1} END {print total}')",并且工作输出也将更改为crashers-count: ${{ steps.set-crashers-count.outputs.count }}. 把这些放在一起,我们得到

jobs:
  fuzz-nightly-test:
    runs-on: ubuntu-latest
    steps:
      ...
      - name: Set crashers count
        working-directory: test/fuzz
        run: echo "::set-output name=count::$(find . -type d -name 'crashers' | xargs -I % sh -c 'ls % | wc -l' | awk '{total += $1} END {print total}')"
        id: set-crashers-count

   outputs:
     crashers-count: ${{ steps.set-crashers-count.outputs.count }}

  fuzz-nightly-fail:
    needs: fuzz-nightly-test
    if: ${{ needs.fuzz-nightly-test.outputs.crashers-count != 0 }}
    runs-on: ubuntu-latest
    steps:
      ...
Run Code Online (Sandbox Code Playgroud)

仅从文档来看,其原因并不是显而易见的,但这里的示例暗示它<step_id>.outputs.foo不同于<job_id>.outputs.foo-jobs.job1.outputs.output1被定义为该作业的steps.step1.outputs.test.

您可以在此处查看一个(非常)简单的示例,并在此处运行相应的工作流程。

  • 哇,谢谢你指出我的错误!也应该注意到这一点。 (2认同)