📝
フィーチャーフラグを使って安全に開発を進める
フィーチャーフラグを使う
「開発環境で検証したいけど、本番環境でリリースされると困る」
そんな時には、フィーチャーフラグ(または、フィーチャートグル)を使ってみるのが良さそう。
フィーチャーフラグにより、リリースの安全度を高められそう。
フィーチャーフラグとは、環境変数等の値を利用して、機能を環境毎に切り分けること。
例えば、「開発環境だけ、デバッグ用のコードを有効化したい」や、「開発とステージング環境で、新バージョンのAPIを有効化したい」などの時に使用。
以下では、APP_ENVを利用して、$values
と$characters
の値を変えている。
// sample.php
<?php
declare(strict_types=1);
function getAppEnv(): string
{
return $_ENV['APP_ENV'] ?? '';
}
function isDevelopment(): bool
{
return getAppEnv() === 'development';
}
function isStaging(): bool
{
return getAppEnv() === 'staging';
}
$values = [0, 1, 2, 3];
$characters = ['a', 'b', 'c'];
if (isDevelopment() || isStaging()) {
$values[] = 4;
}
if (isDevelopment()) {
$characters[] = 'd';
}
print_r([$values, $characters]);
# output: $values = [0, 1, 2, 3, 4], $characters = ['a', 'b', 'c', 'd']
docker run -it --rm -v "${PWD}/sample.php":/sample.php \
-e APP_ENV=development php:8.1.9-cli php /sample.php
# output: $values = [0, 1, 2, 3, 4], $characters = ['a', 'b', 'c']
docker run -it --rm -v "${PWD}/sample.php":/sample.php \
-e APP_ENV=staging php:8.1.9-cli php /sample.php
上記の例では、ただ値を追加しているだけですが、関数の処理内容や、呼び出す関数を変えることもできる。
APIのエンドポイントなどにも使用できる。
if (isDevelopment()) {
$router->get('/debug', DebugAction::class);
}
if (isDevelopment() || isStaging()) {
$router->get('/v2/items', GetItemsV2Action::class);
}
このようにして、環境毎に、機能や値の出し分けることができる。例に挙げたのは、APP_ENV
でリリース環境でまとめて変える方法。機能毎にフィーチャーフラグFEATURE_A
などを定義して、開発環境では、FEATURE_A: enable
といったことも可能。
フィーチャーフラグを使うことにより、mainブランチ(もしくはリリースブランチ)にコードを追加することができる。これは、開発者が安心して本番リリース前の変更をmainブランチに取り込め、そして、指定した環境でしか動作しないので、安全にリリースを行うことができそう。
本番環境に反映したい場合は、if
を取り除く。
開発環境で検証したいコードがある?
フィーチャーフラグを使おう。
開発環境でしか動作させたくないコードがある?
フィーチャーフラグを使おう。
開発、ステージング、本番環境と段階的に機能を表示させたい?
フィーチャーフラグを使おう。
まとめ
- フィーチャーフラグの利用により、開発環境(または、開発環境とステージング環境)のみ機能を表示させることができる
- フィーチャーフラグを使うことで、修正を積極的に、mainブランチに取り込むことができ、コーディングとリリースの安全度を高めることができそう
- フィーチャーフラグは便利!
Discussion