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 より簡潔な表現を使うことができます。
処理フロー
以下のようなフローで実現しようとしました。
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 }}
実際の挙動
実装した感想
GitHub CLI は、curl と比較して、簡潔な表現で操作ができたので、良かったです。
また、こういった再発防止のためにとった議事録を資産として活用できたので、個人的な満足感がありました。
事故を防止できるよう、やれることを地道にやっていきたい所存です。