Secret Ninja Blog

Support Engineering Director してます

Zendesk Guideの記事更新を定期的にSlackに通知するGithub Actions

Zendesk Guideには記事の新規作成時や更新時に、自動で任意の場所に通知したりということができない。 (ワークフローの機能で、特定のユーザにレビューを依頼とかは可能)

そこでZendesk Guide APIを定期的に実行して、60分毎に記事更新があるかどうかのチェックをして、更新があればSlackに通知するGithub Actionsを作った。

github.com

事前準備

利用手順

  1. リポジトリにアクセスして、Forkボタンをクリック GitHub - toru-takahashi/actions-zendesk-guide-subscriber
  2. Fork後に、Settings -> Secretsに移動し、New Repository Secretsより下記の大文字パラメータ名とその値を設定する
    • SLACK_WEBHOOK: 事前準備で作成しておいたSlack Incoming WebhookのURL
    • ZENDESK_EMAIL: ZendeskのAPIアクセスに利用するメールアドレス
    • ZENDESK_SUBDOMAIN: Zendeskのサブドメイン Ex. https://ZENDESK_SUBDOMAIN.zendesk.com/ zendesk.comなどは入力せずにサブドメインだけで大丈夫
    • ZENDESK_TOKEN: 事前準備で作成したZendesk API Token
  3. デフォルトでは60分に1回実行されるようになっている。Github Actionsはその辺りは厳密ではないのでゆるふわっと待っておくと、下図のように実行される。前回実行から現在の時間まででの記事更新をチェックするため、初回実行分は失敗する。

最終的なアウトプットとしてはこんな感じ。APIの返り値のtitle, updated_at, html_urlの三つを返すようにしている。(Ref. Articles - Help Center API - Zendesk Developer Portal

f:id:toru-takahashi:20210516102159p:plain

やってること

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が便利だった。