GitHub Actionsで複数行の文字列(変数展開あり、バッククォート含む)を扱う方法を確認してみた

2022.05.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、CX事業本部 IoT事業部の若槻です。

GitHub ActionsからIssueにこんなコメントを投稿したいという私的需要がありました。Markdownのコードブロック内にコマンドを記載しているというものです。

そこで今回は、GitHub Actionsで複数行の文字列(変数展開あり、バッククォート含む)を扱う方法を確認してみました。

確認してみた

いくつか確認してみたうちの3つの方法を紹介します。

ヒアドキュメントで複数行をファイルにリダイレクトする(できた)

まずヒアドキュメントの出力をファイルにリダイレクトする方法です。バッククォートをエスケープするために\\\を使わないといけません。

.github/workflows/add-comment.yml

on:
  push

jobs:
  add-comment:
    runs-on: ubuntu-latest
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      ISSUE_NUM: 1393
      NEW_BRANCH: 1393-20220531
    steps:
      - name: Checkout
        uses: actions/checkout@v3
      - name: Add comment
        run: |
          `cat <<EOT > temp
          \\\`\\\`\\\`shell
          git fetch origin ${NEW_BRANCH}
          git checkout ${NEW_BRANCH}
          code --reuse-window ${ISSUE_NUM}/article.md ${ISSUE_NUM}/config.json
          \\\`\\\`\\\`
          EOT`
          gh issue comment ${ISSUE_NUM} -b "$(cat temp)"

GitHub Actionsで実行すると、コメント投稿できました。

バッククォートが多かったり、不規則に使われていたりしない限りコードとしての可読性は低くはならないと思います。

1行ずつファイルにリダイレクトする(できた)

文字列を1行ずつファイルにリダイレクトする方法です。

.github/workflows/add-comment.yml

      - name: Add comment
        run: |
          echo '```shell' > temp
          echo "git fetch origin ${NEW_BRANCH}" >> temp
          echo "git checkout ${NEW_BRANCH}" >> temp
          echo "code --reuse-window ${ISSUE_NUM}/article.md ${ISSUE_NUM}/config.json" >> temp
          echo '```' >> temp
          gh issue comment ${ISSUE_NUM} -b "$(cat temp)"

GitHub Actionsで実行すると、コメント投稿できました。

コードとしての可読性は可もなく不可もなくと言った感じですが、やっていることは単純明快です。

複数行を変数に格納する(できなかった)

最後に出来そうでできなかった方法ですが、複数行の文字列をそのまま変数に格納する方法です。

.github/workflows/add-comment.yml

      - name: Add comment
        run: |
          body='```shell
git fetch origin '${NEW_BRANCH}'
git checkout '${NEW_BRANCH}'
code --reuse-window '${ISSUE_NUM}'/article.md '${ISSUE_NUM}'/config.json
```'
          gh issue comment ${ISSUE_NUM} -b "${body}"

ローカル環境では動きはします。YAML構文としては崩れていますが、コードとしての可読性も高いです。

$ body='```shell
git fetch origin '${NEW_BRANCH}'
git checkout '${NEW_BRANCH}'
code --reuse-window '${ISSUE_NUM}'/article.md '${ISSUE_NUM}'/config.json
```'

$ echo $body
git fetch origin 1393-20220531
git checkout 1393-20220531
code --reuse-window 111/article.md 111/config.json

しかしGithub Actions上で実行すると、そもそもYAML構文として不正であると怒られてしまいエラーとなりました。

おわりに

GitHub Actionsで複数行の文字列(変数展開あり、バッククォート含む)を扱う方法を確認してみました。

複数行、変数展開あり、バッククォート含むの3つを同時に満たす方法がなかなか見当たらず苦労しました。

以上