<-- mermaid -->

GitHub Actions / GitHub CLI を使った PR レビューをサポートする取り組み

NewsPicks でサーバーサイドエンジニアを務めている池川です。

サービス運営をされている会社さんであれば、どの会社さんでも何らかの障害を起こし、その対策のための MTG を実施されていると思います。
が、サービスを長く運営していると、過去に発生してしまった事故と似た事故を発生させてしまうということが往々にしてあります。

NewsPicks でも、そのような事故が発生し、どうしたものかということが MTG での話題にのぼりました。
そこで、 NewsPicks ではそのような事故を風化させないための取り組みとして、事故が発生しそうな PR に対して、 GitHub Actions を用いて注意をうながすメンションを投げるワークフローを設定しました。

簡単な取り組みとなっているので、ご参考になれば幸いです。

背景

ALTER TABLE を含んだスクリプトの本番リリースにて、 NewsPicks が一時起動しなくなる障害が発生しました。
再発防止 MTG にて、同様の障害を起こしうるスクリプトを機械的に弾くことが難しいと話題にのぼりました。
そこで、次善の案として、 ALTER TABLE を含んだ PR に、過去の障害対策 MTG の議事録を post し、注意喚起を促すことにしました。

使用したツール

GitHub Actions

GitHubのPRにてレビューが集約されていることと、実装の簡単さから、GitHub Actions にてワークフローを作成することにしました。

GitHub CLI

GitHub REST API を curl で叩いていたのですが、便利なコマンドが作られていたので、そちらを利用することにしました。
curl より簡潔な表現を使うことができます。

cli.github.com

処理フロー

以下のようなフローで実現しようとしました。

アクティビティ図

GitHub Actions での実装

on:
  pull_request:
    types: [opened, reopened, synchronize]
    paths:
      - 'path/to/scripts/**'

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
    - name: post comment
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
      run: |
        shopt -s nocasematch

        CHANGES="$(gh pr diff ${{ github.event.pull_request.number }} --repo ${{ github.repository }})"

        if [[ ! "$CHANGES" =~ "alter table" ]]; then
          # alter tableがない場合はコメント不要
          exit 0
        fi

        PR_INFO="$(gh pr view ${{ github.event.pull_request.number }} -c --repo ${{ github.repository }})"

        if [[ "$PR_INFO" =~ "Alter Tableを不用意に実行すると、NewsPicksサービスが停止する可能性があります" ]]; then
          # すでにPRへコメント済みの場合、追加のコメント不要
          exit 0
        fi

        cat << EOF > ./body.txt
        :mega: Alter Tableを不用意に実行すると、NewsPicksサービスが停止する可能性があります :mega:

        下記の障害事例を参考に、慎重に実行してください。
        (リリースに悩んだら、SREに相談してください。)

        - [2000/04/01 第1回 障害撲滅委員会 - NewsPicksが起動できなかった問題その1](https://docs.google.com/document/d/hogehoge)
        - [2010/04/01 第10回 障害撲滅委員会 - NewsPicksが起動できなかった問題その2](https://docs.google.com/document/d/fugafuga)
        - [2020/04/01 第100回 障害撲滅委員会 - NewsPicksが起動できなかった問題その3](https://docs.google.com/document/d/piyopiyo)
        EOF

        gh pr comment ${{ github.event.pull_request.number }} -F ./body.txt --repo ${{ github.repository }}

実際の挙動

このようなメッセージが PR へ通知されます。

実装した感想

GitHub CLI は、curl と比較して、簡潔な表現で操作ができたので、良かったです。
また、こういった再発防止のためにとった議事録を資産として活用できたので、個人的な満足感がありました。

事故を防止できるよう、やれることを地道にやっていきたい所存です。

参考文献

GitHub Actionsのドキュメント - GitHub Docs

GitHub CLI | Take GitHub to the command line

Page top