🧐
GitHub Actionsで複数行の文字列を扱う
概要
アクションを作成する中で複数行の文字列を扱いたいケースがあったので、メモとして残しておきます。
やり方
以下のようにEOFを区切り文字として使用することで、複数行の文字列を扱うことができます。
- name: Set multi-line string
run: |
echo "VAR_NAME<<EOF" >> $GITHUB_ENV
echo "1" >> $GITHUB_ENV
echo"2" >> $GITHUB_ENV
echo "EOF" >> $GITHUB_ENV
具体例
このようなGitHub Actionsのステップがあるとします。
name: fetch list of merged PRs since latest release
id: merged_prs
run: |
merged_prs=$(gh api --method POST /repos/{owner}/{repo}/releases/generate-notes -f "tag_name=tmp" -f "target_commitish=main" -f "previous_tag_name=v.1.0.0" | jq -r .body)
echo "merged_prs=$merged_prs" >> $GITHUB_OUTPUT
処理としては、v.1.0.0以降にmainブランチにマージされたPRのリリースノートを生成するというもので、api部分を実行するとこのような結果が得られます。
api出力結果
## What's Changed
* feat/test by @username in https://github.com/username/sample/pull/10
* feat/test2 by @username in https://github.com/username/sample/pull/11
**Full Changelog**: https://github.com/username/sample/compare/v1.0.0...tmp"
このように複数行の出力が得られますが、現状のアクションだとecho "merged_prs=$merged_prs" >> $GITHUB_OUTPUT
部分で一行の出力しか格納することができないためエラーが発生してしまいます。
- set-outputで行う
廃止される予定のset-outputを用いて実行すると、エラーは発生しなくなりますが、merged_prsの出力結果は一行目のものしか出力されません。name: fetch list of merged PRs since latest release id: merged_prs run: | merged_prs=$(gh api --method POST /repos/{owner}/{repo}/releases/generate-notes -f "tag_name=tmp" -f "target_commitish=main" -f "previous_tag_name=v.1.0.0" | jq -r .body) - echo "merged_prs=$merged_prs" >> $GITHUB_OUTPUT + echo "::set-output name=merged_prs::$merged_prs"
出力結果merged_prs=## What's Changed
そこで、EOFを区切り文字として複数行格納できるようにします。
name: fetch list of merged PRs since latest release
id: merged_prs
run: |
merged_prs=$(gh api --method POST /repos/{owner}/{repo}/releases/generate-notes -f "tag_name=tmp" -f "target_commitish=main" -f "previous_tag_name=v.1.0.0" | jq -r .body)
- echo "merged_prs=$merged_prs" >> $GITHUB_OUTPUT
+ echo "merged_prs<<EOF" >> $GITHUB_OUTPUT
+ echo "$merged_prs" >> $GITHUB_OUTPUT
+ echo "EOF" >> $GITHUB_OUTPUT
正しい出力結果が得られようになります。
参考
Discussion