Slide 1

Slide 1 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey #phpcon2021 @glassmonekey PHP Conference Japan 2021 永野 峻輔 ( @glassmonkey ) これでリリースも怖くない! フィーチャートグルを導入入門

Slide 2

Slide 2 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey #phpcon2021 @glassmonekey 皆さんリリース頻度は どのくらいですか? 2

Slide 3

Slide 3 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey 毎週?毎日?毎秒? 頻度向上に寄与できたら幸いです 3

Slide 4

Slide 4 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey 今北産業 1 2 3 フィーチャートグルとは? なぜ使うのか? 導入例と感想 4

Slide 5

Slide 5 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey 自己紹介 所属 BASE BANK株式会社 Software Developer Go, PHP, Pythonあたりをよく書いています 趣味 Flutterアプリ開発 hasura.ioやsupabaseがマイブーム SNS Twitter: @glassmonekey  Github: https://github.com/glassmonkey 永野 峻輔 (ながの しゅんすけ) 去年のLT▼

Slide 6

Slide 6 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey (CM)BASEカードをリリースしました 6 順次開放予定!! https://cp.thebase.in/basecard

Slide 7

Slide 7 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey 7 BASEから4人目の刺客です

Slide 8

Slide 8 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey #phpcon2021 @glassmonekey フィーチャートグルとは? 8

Slide 9

Slide 9 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey フィーチャートグルとは? コードを書き換えずに機能を 変更する機構 9 https://www.atlassian.com/continuous-delivery/principles/feature-flags

Slide 10

Slide 10 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey 実装イメージ ● 主に条件分岐の制御を動的に行うことで実現 ex) 環境変数、RemoteConfig、 etc… ● 環境ごと、ユーザーごと、権限ごと、etc… あるフィーチャトグル設定があるとき 10 function func() { if(フィーチャートグルがON) { return hoge(); } return piyo(); }

Slide 11

Slide 11 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey 使用例 カナリア リリース A/Bテスト 管理者機能 11

Slide 12

Slide 12 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey フィーチャートグルの分類 12 https://martinfowler.com/articles/feature-toggles.html#OpsToggles 生存期間と動的さで分類 ● リリーストグル (Release Toggle) ○ カナリアリリースなどで使うとき ○ 弊社ではこれを活用している ● オプストグル (Ops Toggle) ○ 高負荷時などのシステム要件で短時間切り替わ る。 ○ いわゆるサーキットブレーカー ● パーミッショントグル (Permission Toggle) ○ 管理者機能や有料会員限定機能など ○ 恒久的にある機能。 ● 実験トグル(Expereiment Toggle) ○ A/Bテストの実現など ○ 開発者以外も制御できるように

Slide 13

Slide 13 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey #phpcon2021 @glassmonekey なぜ使うのか? 13

Slide 14

Slide 14 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey 使う理由 (特にリリーストグル) ● 開発のリズムが作られる ○ デザインチェックがリリースブロックになることを避けることができる ○ コンフリクト防止につながる ○ リリース頻度が向上する ● 本番環境で開発途中のものの動作確認が可能 ○ ex) 社内限定リリース ○ 心理的ハードルが下がる。リリースが身近になる。 ○ 影響範囲を最小限に失敗ができる安心感。 ○ 本番DBの接続など本番環境でしか試せないものを気軽に確認できる。 ○ リリース頻度が向上する 14

Slide 15

Slide 15 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey 注意点(特にリリーストグル) ● コードが煩雑になる ○ コード上がif文などが増えるので ■ トグル制御のレイヤーに気をつけることで対処は可能 ■ トグルon/offのテストコードも書いておくとより良い ● トグルを外すときのリスク ○ 特に部分公開 -> 全体公開の制御 ○ トグルの消し漏れで一部apiが403など ■ トグル制御を最小限にしておく ■ トグル上で全体公開設定にしてから、削除するなど段階を踏むのもおすすめ 15

Slide 16

Slide 16 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey #phpcon2021 @glassmonekey 導入例 16

Slide 17

Slide 17 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey 例: ylsideas/feature-flags  17 https://github.com/ylsideas/feature-flags Laravelでの実装例。 以下で永続化可能 ● config(ストレージ) ● redis (未確認) ● DB (未確認) ● 上記の複合(未確認)

Slide 18

Slide 18 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey configで設定(DBなどでも設定可能) 18 |-------------------------------------------------------------------------- | Config Feature Switches |-------------------------------------------------------------------------- | | This is a set of features to load into the config features repository. | */ 'feature' => [ 'my-feature' => true, //実際は環境変数経由などに ] config/features.php

Slide 19

Slide 19 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey アプリケーションコード例 19 if(Features::accessible('my-feature')) { return newAlgorithm(); } return oldAlgorithm();

Slide 20

Slide 20 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey bladeテンプレート例 20 @feature('my-feature')

Your feature flag is turned on.

@endfeature @feature('my-feature', false)

Your feature flag is turned off.

@endfeature

Slide 21

Slide 21 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey ミドルウェアの例 Route::get('/', 'SomeController@get')->middleware('feature:my-feature'); Route::get('/', 'SomeController@get')->middleware('feature:my-feature,on'); // OFFの状態だと403 Route::get('/', 'SomeController@get')->middleware('feature:my-feature,off,404'); // ONの状態だと404 21 protected $routeMiddleware = [ 'feature' => \YlsIdeas\FeatureFlags\Middleware\FeatureFlagState::class, ]; フラグによる制御は以下 app/Http/Kernel.php に以下を追加

Slide 22

Slide 22 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey まとめと感想 ● if文が設定ファイルなどで制御できれば何でも良いと思われる ● 弊社の場合だと主にリリーストグルとパーミッショントグルを活用している ○ カナリアリリースや社内限定公開など ○ 拡張機能(Apps)による機能のふるまい変更 ● 本番で実際に試せるのはリリースのハードルが下がって良い ○ 他チームとのコンフリクトも最小限に抑えられているはず ● フラグの制御ミスでインシデントにつながるので乱用は厳禁 ● 実はフィーチャーフラグ=リリーストグルの認識だったので、分類があるのは学びだった 22

Slide 23

Slide 23 text

© 2012-2019 BASE, Inc. © 2012-2021 BASE, Inc. #phpcon2021 @glassmonekey それでは良き リリースライフを!! 一緒にいい感じに開発する 仲間も募集中です https://herp.careers/v1/base 23