set-outputの使用は非推奨になりました
https://github.blog/changelog/2022-10-11-github-actions-deprecating-save-state-and-set-output-commands/
今後はEnvironment filesを使用した方が良さそうです
https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#environment-files
Environment filesを使用した場合の複数行の代入はdelimiterを使用するとできるようです
https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings
結論
set-outputに複数行の標準出力を代入する場合は改行コードをエスケープしておくこと
hoge="${hoge//$'\n'/\\n}"
echo "::set-output name=hoge::$hoge"
set-outputとは
GitHub Actionsではset-outputコマンドを利用することで出力パラメータに値を代入することができます。
echo "::set-output name=NAME::VALUE"
でNAME
にVALUE
を代入することができます。
利用する際は${{ steps.ID.outputs.NAME }}
で利用します。id値を指定する必要があるため、代入時は必ずidを設定してください。
例えば以下のように使います。
steps:
- id: test_id
name: test_name
run: echo "::set-output name=test::hoge"
- run: echo "${{ steps.test_id.outputs.test }}"
こうすることで${{ steps.test_id.outputs.test }}
にはhoge
が代入されます。
どういう時に使う?
後のステップに値を渡したい時などに使います。例えばAステップでコマンド実行を行い、BステップでAステップで実行したコマンドの標準出力をslackに通知する時とかに使いたくなります。
複数行の標準出力だと1行目しか代入されない
steps:
- id: test_id
name: test_name
run: |
user_list=$(cat /etc/passwd)
echo $user_list
echo "::set-output name=std_out::$user_list"
- run: echo "${{ steps.test_id.outputs.std_out }}"
上記のマニフェストはOSユーザの一覧を出力するcat /etc/passwd
コマンドを実行し、その標準出力を出力パラメータstd_out
に代入し、後のステップで出力パラメータをechoで表示させています。複数ユーザが存在するため、出力パラメータには複数行の標準出力が代入されるはずなのですが、実際は1行目しか代入されません
改行コードをエスケープする
出力パラメータに代入する前に改行コードをエスケープすることで複数行を出力パラメータに代入することができます。
steps:
- id: test_id
name: test_name
run: |
user_list=$(cat /etc/passwd)
# エスケープ処理
user_list="${user_list//$'\n'/\\n}"
echo $user_list
echo "::set-output name=std_out::$user_list"
- run: echo "${{ steps.test_id.outputs.std_out }}"
こちらはGitHubのサポートケースに上がってますが、エスケープ処理を入れろが公式回答となってます。。いちいちエスケープ処理を入れるのは面倒だし、使いずらいと思うので、修正して欲しいですね。
https://github.community/t/set-output-truncates-multiline-strings/16852