36
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

GitHub Actionsのset-outputに複数行の標準出力を代入する場合は改行コードをエスケープしてあげる必要がある

Last updated at Posted at 2020-10-10

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"NAMEVALUEを代入することができます。
利用する際は${{ 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行目しか代入されません

test_·_yhamano0312_github-actions-test_51fb2a8.png

test2_·_yhamano0312_github-actions-test_51fb2a8.png

改行コードをエスケープする

出力パラメータに代入する前に改行コードをエスケープすることで複数行を出力パラメータに代入することができます。

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 }}"

test3_·_yhamano0312_github-actions-test_9d37e55.png

こちらはGitHubのサポートケースに上がってますが、エスケープ処理を入れろが公式回答となってます。。いちいちエスケープ処理を入れるのは面倒だし、使いずらいと思うので、修正して欲しいですね。
https://github.community/t/set-output-truncates-multiline-strings/16852

36
11
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?