🧐

GitHub Actionsで複数行の文字列を扱う

2024/05/25に公開

概要

アクションを作成する中で複数行の文字列を扱いたいケースがあったので、メモとして残しておきます。

やり方

以下のように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

正しい出力結果が得られようになります。

参考

https://docs.github.com/en/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings

Discussion