MSとGitHubが機能リリースの舞台裏

MSとGitHubが機能リリースの舞台裏

​- デブサミの話

概要

自己紹介

  • GitHubとAzureDevOpsは同じチームが開発している
  • GitHubActions2.0がこないだGA
  • 裏ではAzureDevOpsのツールをフォークしたものが動作している
  • MS内部でもAzureDevOps中心だったがGitHubを使っている
  • 5年で2千人から2万に増加 ​

    統合認証

  • GitHub資格情報でAzureにログインできるようになった ​

    MSの機能リリース舞台裏

    カルチャー

    開発の文化

  • CustomerObsessionー>好きで好きで仕方ないという意味
  • プロダクト成長を中心とするために、5000ユーザオブザーベーション・インタビューを1年にかこなす
  • リーン開発カルチャーを社内で実勢するため、UXチームがカルチャールームを使用
  • Hypothesis Driven Frameworkなどの各種プラクティスを社内復旧 ​

    今までの組織

  • 柔軟でない組織、コラボレーション低下、モノリスになりすぎた ​

    インナーソースという文化

  • OSSの活動を社内でやる
  • 組織内におけるOSSとベストプラクティスの実現
  • インナーソース実現の4つポイントー>発見可能性、実行可能、貢献、操作性
  • GitHubマイクロソフトリポジトリをみると、最初コミット履歴にインナーソースの取り組みがある
  • 社外のコラボレータを採用したりもしている ​

    開発

    ラクティス

  • MSはなるべく自動化
  • ただしデプロイするなら完全自動化をめざす
  • 部分的な自動は避ける
  • 理由は、インナーソースを公開した時に、単純なミスがあると、コラボレーションが加速しないから
  • 負債を背負い続けないためのバグキャップという単純なルール
  • エンジニア数 X 4以上のバグ数を抱えてしまうと、良いチームでないと判断される ​

    統合テストから単体テストへのシフトレフト

  • 今まで統合テスト量が多かった
  • 統合テストが多いと何が起こるかというと、エンジニアが小さい機能追加もしてもレスポンスまで長い時間がかかる
  • 5年で統合テストを減らし単体テストを増やした ​

    リリース、ライブサイト

    本番環境へのデプロイメントの順番

  • カナリアリリース(内部リリース)
  • 最小の外部データセンター
  • 最大の外部データセンター
  • 国際データセンター
  • 残り全て ​

    フィーチャーフラグ

  • コードをがあらかじめデプロイされフィーチャーフラグが公開を制御する仕組み
  • フラグはユーザレベルでの制御を提供 ​

    ライブサイト

  • フィーチャーチームの最優先事項をカンバンで管理
  • ライブサイトにおけるステータス確認 ​

    GitHubの機能リリース舞台裏

    GitHubFlow

    GitHubFlow説明

  • GitHubでもGitHubFlowを使って開発している
  • 性能ベンチマークアクセシビリティなどあらゆる観点でCIを行う
  • 3つのデプロイ環境。Review lab production/canary production
  • Review labはレビューした内容をデプロイする。CIもここで回す
  • production/canaryへデプロイする意味はサーバリソースやユーザリクエストなどのリグレッション確認する環境
  • productionは全ユーザに配布 ​

    ChatOps

    Slack上

  • .deplyをすると、Hubotがデプロイ処理をする
  • デプロイしたら次に、Hubotからエラーレートとリスースの使用率を確認するよう指示される
  • 余計な処理がなく自動化されているので、すぐにデプロイできる
  • ほぼオペレーションはChatOpsを使っている
  • オンコール対応もHubotでわかるので、Slackにコマンド叩いてすぐにメンションできる
  • 過去にやったことはSlackに残っているのですぐに終える ​

    GitHubFlowを使っていった中で起こった問題

  • GitHubFlowとChatOpsは2015年からずっと続けている
  • どんどんデプロイできるので、人が増えたら機能開発がどんどんできる
  • ただモノリスなサービスなので、人が増えてしまい、Hubotのデプロイロックが起きてしまうことがあった ​

    対策1

  • そのためデプロイキューを作った
  • 2016年にそれでもキューが溜まりまくって、待ち時間が3時間から6時間待ちという状況になった ​

    対策2

  • 2018年にリリーストレインという仕組みを作った(電車のこと)
  • 同じプルリク内容のものはまとめて1つのプルリクにした
  • Entrainコマンド
  • トレイン用のブランチのプルリクをHubotが作るようにした
  • フィーチャーブランチのトレインに乗せると、トレイン用ブランチにマージされる
  • トレインが満席になったら、トレインのブランチをマスターにマージするようにして、デプロイサイクルを改善
  • そのおかげでデプロイの数が400くらいのものが300に減った
  • 去年から全プルリクがリリーストレインになった
  • 裏話で、これが発案された経緯は、デプロイ遅くて自分たちのチーム向けにトレインという仕組みを作った
  • 今はHubotが、Developブランチにプルリクを出したのを検知すると、トレインに乗せたらというサジェストをする
  • 言いたいのは、デプロイサイクルを早くする意識が全メンバにあるので、このようなことが仕組みができたということ