GitHub Actionsのworkflow commandという機能を使って、workflowの中からリポジトリのファイルの特定の行に対してアノテーションを付けることができる。CIが落ちたときのスタックトレースやexpected, actualなど表示できて便利。
スタックトレースを出すときは当然複数行で表示したいと思う。こういうときに、
echo "::error file=test.txt,line=2::hoge\nfuga\npiyo\nuooo"
のように直接改行文字を入れても、messageには hoge
しか入らない。
改行するには、改行文字をURLエンコードすればよい。たとえば \n
を %0A
にすると改行できる。
echo "::error file=test.txt,line=2::hoge%0Afuga%0Apiyo%0Auooo"
GitHub Actionsのドキュメントを探してもうまく見つけられなかったけど、なんで分かったのかというと、@actions/coreにそういう変換をしてるコードがあったから。JS (TS) を使うworkflowからだと @actions/core を使えばよいと思うけど、JSじゃないときはこういう変換を自分でやっていく必要がある?
副産物として、workflow commandで改行できることをテストするリポジトリができた。
追記
このあたりでURLエスケープを解釈してそうだなというのが分かった。パーセントエンコーディングを完全にデコードしているわけではなくて、ほんとうに改行する用とかに使っていそう?
runner/ActionCommandManager.cs at a246b3b29d853e73db4f7be04cb25f85b3d98e27 · actions/runner · GitHub
runner/ActionCommand.cs at a246b3b29d853e73db4f7be04cb25f85b3d98e27 · actions/runner · GitHub
runner/ActionCommand.cs at a246b3b29d853e73db4f7be04cb25f85b3d98e27 · actions/runner · GitHub