tl;dr
2020/10/13時点 (GitHub Actions runner v2.273.5) では、標準出力 (STDOUT) と標準エラー出力 (STDERR) のどちらに出力してもよい
モチベーション
- テスト中にGitHub Actionsのworkflow commandを使いたい
- しかし、テストフレームワークが標準出力をcaptureしてしまう
実験
以下のようなworkflow YAMLを GitHub - utgwkk/sandbox-actions-stdout-stderr に用意して実験した。
name: test on: push: jobs: test: name: annotate runs-on: ubuntu-latest steps: - name: Issue error command with STDOUT run: python3 -c "print('::error file=.github/workflows/test.yml,line=1::from stdout')" - name: Issue error command with STDERR run: python3 -c "import sys; print('::error file=.github/workflows/test.yml,line=1::from stderr', file=sys.stderr)"
実験結果
Python · utgwkk/sandbox-actions-stdout-stderr@c6d0e09 · GitHub
actions/runner のコードを追う
GitHub Actionsのworkflow commandでアノテーションするときのmessageで改行したい - 私が歌川です で、改行文字をencodeする処理の実装を追いかけたので、これを起点にコードを追う。C# を読むのに慣れてないので間違ってたら教えてください。
- https://github.com/actions/runner/blob/c18c8746db0b7662a13da5596412c05c1ffb07dd/src/Runner.Worker/ActionCommandManager.cs#L63
- https://github.com/actions/runner/blob/c18c8746db0b7662a13da5596412c05c1ffb07dd/src/Runner.Worker/Handlers/OutputManager.cs#L87
OutputManager#OnDataReceived
でworkflow commandをパースしている
- https://github.com/actions/runner/blob/c18c8746db0b7662a13da5596412c05c1ffb07dd/src/Runner.Worker/Handlers/ScriptHandler.cs#L286-L287
- STDOUTとSTDERRの両方の
OnDataReceived
を使っている- STDOUT:
StepHost.OutputDataReceived += stdoutManager.OnDataReceived;
- STDERR:
StepHost.ErrorDataReceived += stderrManager.OnDataReceived;
- STDOUT:
- どちらも
OutputManager
のインスタンス
- STDOUTとSTDERRの両方の
- https://github.com/actions/runner/blob/c18c8746db0b7662a13da5596412c05c1ffb07dd/src/Runner.Worker/Handlers/StepHost.cs#L81
- https://github.com/actions/runner/blob/c18c8746db0b7662a13da5596412c05c1ffb07dd/src/Runner.Common/ProcessInvoker.cs#L296
- これが
ExecuteAsync
の本丸?
- これが
- https://github.com/actions/runner/blob/c18c8746db0b7662a13da5596412c05c1ffb07dd/src/Runner.Sdk/ProcessInvoker.cs#L197
- https://github.com/actions/runner/blob/c18c8746db0b7662a13da5596412c05c1ffb07dd/src/Runner.Sdk/ProcessInvoker.cs#L414
ErrorDataReceived
を呼んでいる
- https://github.com/actions/runner/blob/c18c8746db0b7662a13da5596412c05c1ffb07dd/src/Runner.Sdk/ProcessInvoker.cs#L427
OutputDataReceived
を呼んでいる
まとめ
- 2020/10/13時点 (GitHub Actions runner v2.273.5) では、GitHub Actionsのwofklow commandは、標準出力と標準エラー出力のどちらに出力してもよい
- コードを追った感じではそうなっている