こんにちは、HRBrainのPlatformチームのほしいです。
弊社では開発者の相談・雑談をする場として、GitHub Discussionsを利用しています。
この機能を使い始めた当初、GitHub Discussionsからの通知を受け取る方法がなく、話題に気付けない人が結構いました。
みんなが頻繁に見るSlackに通知が来れば、GitHub Discussionsでの議論も活発になるのではないかと思い、Slackで通知させる方法を考えました。
公式の通知はまだ?
we hit some unexpected snags in the process, but we're still actively working on it! you'll be able to start testing it in the next couple of weeks :) i'll keep you updated!
— Evi Liu (@tweetsbyevi) 2021年10月4日
現状、SlackのGitHub連携ではGitHub Discussionsの機能がリリースされておらず、こちらを利用することはできません。
GitHub Actionsを使って通知できるようにする
SlackのGitHub連携に先立って、GitHub Actionsの機能がリリースされていたため、今回はGitHub Actionsを利用して通知を送ることにしました。 GitHub ActionsからSlackに通知を送るには、rtCamp/action-slack-notifyのようなアクションを使うと便利そうなのですが、今回はリンクやプレビュー表示なども付けたかったので、curlを使います。
name: Discussions Notification on: discussion: types: [created] discussion_comment: types: [created] jobs: discussion_created: runs-on: ubuntu-20.04 if: ${{ github.event.discussion && !github.event.comment }} steps: - name: Send GitHub Discussion Notification to Slack # Note: # - 一度変数に入れることで、$や`をエスケープしている # - https://stackoverflow.com/questions/69982822/is-there-a-way-to-escape-and-single-quotes-together-in-bash # - printfしないといい感じに"\n"が変換されない run: | title=$( cat <<"EOF" ${{ env.DISCUSSION_TITLE }} EOF ) body=$( cat <<"EOF" ${{ env.DISCUSSION_BODY }} EOF ) printf -v markdown_message_unescaped %b "<${{ env.DISCUSSION_URL }}|*$title*>\n$body" jq -n -r --arg text "$markdown_message_unescaped" '{"token":"${{ secrets.SLACK_BOT_TOKEN }}","channel":"${{ env.CHANNEL_ID }}","blocks":[{"type":"section","text":{"type":"mrkdwn","text":"New Discussion by <${{ env.USER_URL }}|${{ env.USER_NAME }}>"}}],"attachments":[{"blocks":[{"type":"section","text":{"type":"mrkdwn","text":$text}}]}]}'|curl -X POST -H 'Authorization: Bearer ${{ secrets.SLACK_BOT_TOKEN }}' -H "Content-Type: application/json" -d @- https://slack.com/api/chat.postMessage env: CHANNEL_ID: <slackのチャンネルID> DISCUSSION_URL: ${{ github.event.discussion.html_url }} DISCUSSION_TITLE: ${{ github.event.discussion.title }} DISCUSSION_BODY: ${{ github.event.discussion.body }} USER_URL: ${{ github.event.discussion.user.html_url }} USER_NAME: ${{ github.event.discussion.user.login }} discussion_commented: runs-on: ubuntu-20.04 if: github.event.comment steps: - name: Send GitHub Discussions Comments to Slack run: | title=$(cat << "EOF" ${{ env.DISCUSSION_TITLE }} EOF ) body=$(cat << "EOF" ${{ env.COMMENT_BODY }} EOF ) printf -v markdown_message_unescaped %b "*<${{ env.COMMENT_URL }}|Comment on $title>*\n$body" jq -n -r --arg text "$markdown_message_unescaped" '{"token":"${{ secrets.SLACK_BOT_TOKEN }}","channel":"${{ env.CHANNEL_ID }}","blocks":[{"type":"section","text":{"type":"mrkdwn","text":"New comment by <${{ env.USER_URL }}|${{ env.USER_NAME }}>"}}],"attachments":[{"blocks":[{"type":"section","text":{"type":"mrkdwn","text":$text}}]}]}'|curl -X POST -H 'Authorization: Bearer ${{ secrets.SLACK_BOT_TOKEN }}' -H "Content-Type: application/json" -d @- https://slack.com/api/chat.postMessage env: CHANNEL_ID: <slackのチャンネルID> DISCUSSION_TITLE: ${{ github.event.discussion.title }} COMMENT_URL: ${{ github.event.comment.html_url }} COMMENT_BODY: ${{ github.event.comment.body }} USER_URL: ${{ github.event.comment.user.html_url }} USER_NAME: ${{ github.event.comment.user.login }}
SLACK_BOT_TOKENはリポジトリのシークレットに登録してください。
こんな感じでSlackに通知することができます。
やってみてどうだったか
Slackに通知が来て、GitHub Discussionsの投稿やコメントに気付けるようになったので、ツールの選定など開発者の議論やトラブルシューティングのナレッジがたまる場所としてGitHub Discussionsを使う人が増えました。
難しかったこと
${{ github.event.discussion.body }}
等に$
や'
がそのまま入ってくるのが厄介で、結構苦戦しました。
bashのいい勉強になりました。