GitHub Actionsで複数行の文字列(変数展開あり、バッククォート含む)を扱う方法を確認してみた
こんにちは、CX事業本部 IoT事業部の若槻です。
GitHub ActionsからIssueにこんなコメントを投稿したいという私的需要がありました。Markdownのコードブロック内にコマンドを記載しているというものです。
そこで今回は、GitHub Actionsで複数行の文字列(変数展開あり、バッククォート含む)を扱う方法を確認してみました。
確認してみた
いくつか確認してみたうちの3つの方法を紹介します。
ヒアドキュメントで複数行をファイルにリダイレクトする(できた)
まずヒアドキュメントの出力をファイルにリダイレクトする方法です。バッククォートをエスケープするために\\\
を使わないといけません。
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行ずつファイルにリダイレクトする方法です。
- 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で実行すると、コメント投稿できました。
コードとしての可読性は可もなく不可もなくと言った感じですが、やっていることは単純明快です。
複数行を変数に格納する(できなかった)
最後に出来そうでできなかった方法ですが、複数行の文字列をそのまま変数に格納する方法です。
- 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つを同時に満たす方法がなかなか見当たらず苦労しました。
以上