スタディサプリ Product Team Blog

株式会社リクルートが開発するスタディサプリのプロダクトチームのブログです

SRE と Developer のコラボレーションを支える仕組み

こんにちは。SRE の @int128 です。

Quipper の SRE チームでは、Platform の安定運用や改善だけでなく、Platform を利用する Developer のサポートも重要な仕事と位置付けています。 SRE チームで工夫していることを紹介します。

Issue に記録を残す

SRE チームでは課題や疑問などを気軽に相談してほしいと考えています。 そのため、Slack で気軽に SRE にメンションしてもらえる文化を作るように心がけています。

f:id:int128:20210625143439p:plain
Slack で相談している例

一方で、同時に多くのメンションを受け取った場合、経緯の把握に時間がかかる、対応状況が分からなくなるといった課題があります。 例えば、Slack のやり取りを通して、ちょっと設定変更すればできるかも、検証してみようという話になることがよくあります。 Slack のスレッドだけでは、具体的な検証作業に着手する時に目的や経緯を把握するのに時間がかかってしまいます。 また、Slack のやり取り自体を忘れてしまい、対応が後回しになってしまう可能性もあります。

そこで、Slack での対応が長くなりそうな場合は Developer に Issue を書いてもらっています。 場合によっては SRE が一緒に Issue を書くこともあります。 Issue Template を用意することで、必要事項を簡潔にまとめられるように工夫しています。 また、Slack のカスタムレスポンスですぐに Issue Template を呼び出せるようになっています。

f:id:int128:20210625143545p:plain
SRE で用意している Issue Template

このような円滑なサポートを支える一連の仕組みは @chaspy が整備してくれました。

すべてのコミュニケーションで Issue を要求するのはアンチパターンです。 相談のハードルが上がってしまい、本質的な課題解決が難しくなるおそれがあります。 そのため、まずは気軽に相談してもらい、経緯を残す必要があると考えた場合に Issue を書いてもらうことにしています。

まとめると、以下の目的で Issue を残しています。

  • チームで対応することで広く知見を共有する
  • チームで対応することで対応の漏れや忘れを防ぐ
  • Developer Support の内容や量を振り返りに生かす
  • 課題解決の経緯を後世に残す

みんなで Kanban を見る

せっかく Issue を残しても定常的に確認するサイクルがなければ無駄になってしまいます。 そこで、SRE チームでは Daily Standup で Kanban を見ながら Issue を確認しています。 何か課題をがある場合や誰もアサインされていない Issue にチームとして対応するようにしています。

SRE チームでは GitHub Project や ZenHub を利用しています*1。 手作業で Issue を GitHub Project に追加すると漏れが発生するため、Issue に特定のラベルが付いている場合は自動的に GitHub Project に追加される仕組みにしています。 具体的には GitHub Actions の github-script を利用して、以下の Workflow を定義しています。

on:
  issues:
    types:
      - opened
      - labeled

jobs:
  sre-kanban:
    if: contains(github.event.issue.labels.*.name, 'SRE')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@v4
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}  # Organization Project に追加する場合は Personal Access Token が必要です
          script: |
            const mutation = `mutation($projectColumnId: ID!, $issueID: ID!) {
              addProjectCard(input: {projectColumnId: $projectColumnId, contentId: $issueID}) {
                projectColumn {
                  name
                }
              }
            }`
            const variables = {
              projectColumnId: 'GitHub Project のカラム ID',
              issueID: context.payload.issue.node_id,
            }
            await github.graphql(mutation, variables)

なお、GitHub Project のカラム ID は GitHub GraphQL Explorer で以下のクエリを実行すると確認できます。

query { 
  organization(login: "YOUR-ORG") {
    project(number: 26) {    # Project の URL に含まれる番号です
      columns(first: 1) {
        nodes {
          name
          id
        }
      }
    }
  }
}

メンションを拾う

Quipper では基本的にバックログを Issue で管理しています。 Issue の本文やコメントでメンションを受け取った場合も確実に対応するため、SRE ラベルを自動的に付与するようにしています。 前項の Workflow と組み合わせることで GitHub Project に自動的に追加される仕組みになっています。 また、ZenHub では SRE ラベルの付いた Issue を確認しているので漏れなくメンションを確認できます。

具体的には GitHub Actions で以下の Workflow を定義しています。

on:
  # mention in an issue
  issues:
    types:
      - opened
  # mention in an issue comment
  issue_comment:
    types:
      - created
      - edited

jobs:
  sre-mention-issue:
    if: github.event_name == 'issues' && contains(github.event.issue.body, '@quipper/sre')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@v4
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}  # 前項と組合せる場合は Personal Access Token が必要です
          script: |
            github.issues.addLabels({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              labels: ['SRE']
            })

  sre-mention-comment:
    if: github.event_name == 'issue_comment' && contains(github.event.comment.body, '@quipper/sre')
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@v4
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}  # 前項と組合せる場合は Personal Access Token が必要です
          script: |
            github.issues.addLabels({
              issue_number: context.issue.number,
              owner: context.repo.owner,
              repo: context.repo.repo,
              labels: ['SRE']
            })

まとめ

SRE チームでは Developer と協力して課題を解決していくために、Issue Template の整備や Kanban による毎日の確認といった工夫を取り入れています。 また、気軽に相談しやすい文化を形成するように心がけています。

このような文化に興味を持たれた方は Quipper で一緒に働いてみませんか。 Web Engineer 向けのスタディサプリ/Quipper オンラインミートアップ を7月14日に開催します。 また、iOS, Android, SRE, Frontend Engineer を対象としたミートアップも今後開催します。 みなさまのご参加をお待ちしています。

quipper.connpass.com

*1:正確には、GitHub Project から ZenHub への移行を進めています