📝

フィーチャーフラグを使って安全に開発を進める

2023/01/16に公開

フィーチャーフラグを使う

「開発環境で検証したいけど、本番環境でリリースされると困る」
そんな時には、フィーチャーフラグ(または、フィーチャートグル)を使ってみるのが良さそう。
フィーチャーフラグにより、リリースの安全度を高められそう。

フィーチャーフラグとは、環境変数等の値を利用して、機能を環境毎に切り分けること。
例えば、「開発環境だけ、デバッグ用のコードを有効化したい」や、「開発とステージング環境で、新バージョンの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