はじめに
GitHub Actions使ってますか?私はめっちゃ使ってます。
ずっとstep間での 複数行の文字列の受け渡し方法 に悩んでいたのですが、オフィシャルドキュメントをゆっくり読んでいたら、めちゃくちゃ普通に書いてあることに気が付きました。
- https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#multiline-strings
- https://docs.github.com/ja/actions/using-workflows/workflow-commands-for-github-actions#setting-an-output-parameter
複数行の文字列の場合、次の構文で区切り文字を使用できます。
{name}<<{delimiter}
{value}
{delimiter}
えぇぇ、この記述って昔からあったっけ?
なんで俺は気が付かなかったんだ・・・
なんで俺は改行文字をエスケープしたりファイルを媒介したりする苦労をしていたんだ・・・
正確な情報は常に公式ドキュメントにありますが、また忘れる可能性が高いので、自分のための備忘としてQiitaに記録しておこうと思ってこの記事を書いてます。
※ この記事は2023/08/21現在の情報に基づいて書いています。
複数行の文字列の受け渡しの実装例
公式ドキュメントでは環境変数( $GITHUB_ENV
)を利用した受け渡しの例が書いてあります。
そして、公式ドキュメントに記載がありますが、同様に$GITHUB_OUTPUT
を利用して受け渡しすることも可能です。
その例を以下にSnippetとして書いておきます。
この例では、Slack通知を行うActionに対して、事前のstepで処理したレポートファイルの中身を渡しています。デリミタの乱数化は公式ドキュメントの例に従ってます。
jobs:
check-xxxxx:
name: Check xxxxx
runs-on: ubuntu-latest
defaults:
run:
shell: bash
working-directory: code/xxxxx-check
env:
REPORT_FILE: "/tmp/report-${{ github.run_id }}.txt"
- name: "前処理をしてREPORT_FILEに出力しましょう"
- name: Check report file
id: check-report-file
run: |
if [ -s ${{ env.REPORT_FILE }} ]; then
EOF=$(dd if=/dev/urandom bs=15 count=1 status=none | base64)
echo "report<<$EOF" >> "$GITHUB_OUTPUT"
cat ${{ env.REPORT_FILE }} | tee -a "$GITHUB_OUTPUT"
cat ${{ env.REPORT_FILE }} >> "$GITHUB_STEP_SUMMARY" # Workflowの概要ページに出力したい場合の処理
echo "$EOF" >> "$GITHUB_OUTPUT"
fi
exit 0
- name: Notificate to Slack
uses: rtCamp/action-slack-notify@v2
env:
SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK_URL }}
SLACK_CHANNEL: "xxxxx"
SLACK_USERNAME: GitHub Actions
SLACK_ICON_EMOJI: ":xxxxx:"
SLACK_COLOR: "#FF0000"
SLACK_TITLE: "xxxxxx"
SLACK_MESSAGE: "レポートは以下。\n```${{ steps.check-report-file.outputs.report }}```"
まとめ
公式ドキュメントをちゃんと読もう。
追記(2023/08/21 22:23)
もしかして set-output
がdeprecatedになって $GITHUB_OUTPUT
を使うようになったときに、この書式が増えたのかな。なるほどなー