Zendesk Guideには記事の新規作成時や更新時に、自動で任意の場所に通知したりということができない。 (ワークフローの機能で、特定のユーザにレビューを依頼とかは可能)
そこでZendesk Guide APIを定期的に実行して、60分毎に記事更新があるかどうかのチェックをして、更新があればSlackに通知するGithub Actionsを作った。
事前準備
- Githubのアカウント
- ZendeskのAPI Token
- 取得方法はこちら APIトークンの生成 – Zendeskヘルプ
- SlackのIncoming Webhook URL
- Slack API: Applications | SlackからCreate New Appで名前などを適当に決める。
- Incoming WebhookのメニューからURLを生成する。またその際に通知したいChannelを決める
利用手順
- リポジトリにアクセスして、Forkボタンをクリック GitHub - toru-takahashi/actions-zendesk-guide-subscriber
- Fork後に、Settings -> Secretsに移動し、New Repository Secretsより下記の大文字パラメータ名とその値を設定する
SLACK_WEBHOOK
: 事前準備で作成しておいたSlack Incoming WebhookのURLZENDESK_EMAIL
: ZendeskのAPIアクセスに利用するメールアドレスZENDESK_SUBDOMAIN
: Zendeskのサブドメイン Ex. https://ZENDESK_SUBDOMAIN.zendesk.com/ zendesk.comなどは入力せずにサブドメインだけで大丈夫ZENDESK_TOKEN
: 事前準備で作成したZendesk API Token
- デフォルトでは60分に1回実行されるようになっている。Github Actionsはその辺りは厳密ではないのでゆるふわっと待っておくと、下図のように実行される。前回実行から現在の時間まででの記事更新をチェックするため、初回実行分は失敗する。
最終的なアウトプットとしてはこんな感じ。APIの返り値のtitle, updated_at, html_urlの三つを返すようにしている。(Ref. Articles - Help Center API - Zendesk Developer Portal)
やってること
Github Actionsでやってることは大したことなく、前回実行分の実行時刻を取得し、その時刻以降で更新された記事をGuide APIを使って取得、JSONをパースして必要なものを取ってきて、SlackにPostしている。
name: Notify Zendesk Guide Update to Slack on: schedule: - cron: '*/60 * * * *' jobs: zendesk_guide_slack_job: runs-on: ubuntu-latest name: Zendesk Guide to Slack steps: - id: last-execution name: Get the last execution time run: | curl -fsSL -O https://api.github.com/repos/${{ github.actor }}/action-slack-zendesk-guide-updates/actions/workflows/main.yml/runs LAST_RUN=$(jq -r '.workflow_runs | map(select(.status == "completed"))[0].created_at' runs) LAST_RUN=$(date -d $LAST_RUN +%s) echo "::set-output name=last_run_time::$LAST_RUN" - id: guide name: Pull Guide update run: | ARTICLES=`curl -X GET -H 'Content-type: application/json; charset=utf-8' -u ${{ secrets.ZENDESK_EMAIL }}/token:${{ secrets.ZENDESK_TOKEN }} 'https://${{ secrets.ZENDESK_SUBDOMAIN }}.zendesk.com/api/v2/help_center/incremental/articles?start_time= ${{ steps.last-execution.outputs.last_run_time }}' | jq -r '.articles[] | [.title, .updated_at, .html_url] | @json'` ARTICLES="${ARTICLES//$'\n'/\\n}" ARTICLES=${ARTICLES//$'"'/} echo "::set-output name=articles::$ARTICLES" - id: slack name: Notify Slack run: | if [ -z "${{ steps.guide.outputs.articles }}" ]; then echo "No update" exit 0 fi curl -X POST -H "Content-type: application/json; charset=utf-8" -d "{'text': 'Recent Article Updates:\n${{ steps.guide.outputs.articles }}'}" ${{ secrets.SLACK_WEBHOOK }}
そのほか
簡易なスケジューラとしてGithub Actionsが便利だった。