この記事は公開されてから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つを同時に満たす方法がなかなか見当たらず苦労しました。
以上