GitHub Actionsでテスト落ちた & 別のstepのoutputがtrue のときだけ走るstepを定義しようとしたけどできなかった - 私が歌川です の続きです。表題のようなworkflowを書こうとして結局やり方が分からなかったので、フォーラムに投稿したところ、回答をいただけました。
if: failure() && (steps.foo.outputs.exists == 'true')
のように条件を指定すればよい、とのことです。確かにこの方法で実現できました。
前回の記事にあったworkflow YAMLを修正すると以下のようになります。
name: test on: push: jobs: test: name: annotate runs-on: ubuntu-latest steps: # 実際のテストの代わりに、ファイルを出力して non-zero status を返している - id: do_test run: | echo hello > hello.txt false - id: foo run: | if [ -e 'hello.txt' ]; then echo "::set-output name=exists::true" fi if: failure() - name: check steps.foo.outputs.exists run: echo ${{ steps.foo.outputs.exists }} if: always() - uses: actions/upload-artifact@v2 with: name: hello path: hello.txt if: failure() && (steps.foo.outputs.exists == 'true')
failure()
とか always()
がない場合、そもそも条件式が評価されないみたいです。ということは、逆に failure()
などは評価規則がちょっと変わってくる?
追記
If your
if
expression does not contain any of the status functions it will automatically result withsuccess()
. Context and expression syntax for GitHub Actions - GitHub Docs
ドキュメントに書いてありました。やはり failure()
や always()
が含まれない場合、自動的に if: success() && ...
だと解釈されるようです。