
github actionsを使って共用サーバーにデプロイしたいんだけど、DB設定ファイルをどうしようかな

今はどうなっているの?

wordpressの wp-config.php みたいに define しているよ
<?php
define('DB_HOST', 'my.example.lan');
define('DB_NAME', '_example_dev');
define('DB_USER', '_example_dev');
define('DB_PASS', '********');
Code language: PHP (php)

環境変数から取ってくるのがベストプラクティスのようだけど

そうだね、AWSだったらParameter StoreやSecrets Managerで環境変数を設定しておいて、getenvで取ってくるんだけど
<?php
define('DB_HOST', getenv('DB_HOST'));
define('DB_NAME', getenv('DB_NAME'));
define('DB_USER', getenv('DB_USER'));
define('DB_PASS', getenv('DB_PASS'));
Code language: PHP (php)

共用サーバの管理画面に環境変数パネルはないんだよね

どうするの?

案1
環境変数から取ってくるのはあきらめる
production環境用のdatabase.php、develop環境用/database.phpをgitとは別管理しながら、各環境に手作業でFTPアップロードする

共用サーバーでは一般的な方法かしらね

このファイルの更新頻度は少ないから、この方法もアリだとは思うんだけど、担当者に属人化しがちなんだよね

production環境用のdatabase.php をgit管理しないから、担当者PCにしかファイルがないということを属人化しがちと言っているのね

案2
(1)github actionsのSecretsに database.php まるごと設定しておく
(2)workflowで Secretsからとってきて database.php に保存する
(3)共用サーバーにデプロイする

簡単そうだけど、Secrets からアプリケーションコードを注入できてしまうことが気になるわね

案3
まずアプリケーションコードを次のように修正しておく
(1).env ファイルにDB設定を記述する
(2)parse_ini_file関数で読み込んで環境変数に設定する
(3)database.php を環境変数バージョンに修正する
# .env gitコミットしないように
DB_HOST = my.example.lan
DB_NAME = _example_dev
DB_USER = _example_dev
DB_PASS = ********
Code language: PHP (php)
<?php // apply_dotenv.php
(function () {
$path = "/path/to/.env";
$vars = parse_ini_file($path);
foreach ($vars as $key => $value) {
putenv("$key=$value");
}
})();
Code language: PHP (php)
<?php
// ベター:可能ならdatabase.phpではなく、共通処理phpの先頭に置きたい
// よりベター:.htaccess で php_value auto_prepend_file /path/to/apply_dotenv.php を設定しておく
require_once __DIR__ . '/apply_dotenv.php';
define('DB_HOST', getenv('DB_HOST'));
define('DB_NAME', getenv('DB_NAME'));
define('DB_USER', getenv('DB_USER'));
define('DB_PASS', getenv('DB_PASS'));
Code language: PHP (php)

次に github actions で
(4)github actionsのSecretsに「.env」ファイルの内容をまるごと設定しておく
(5)workflowで Secretsからとってきて「.env」ファイルに保存する
(6)共用サーバーにデプロイする

「.env」ファイルは他の言語からも読めるし、よさそうね

production環境、develop環境ごとの「.env」ファイルはどのように振り分けるの?

github actionsのSecretsに保存するとき、
develop環境用の「.env」内容は、Secrets の DEVELOP_DOTENV に
production環境用の「.env」内容は、Secrets の PRODUCTION_DOTENV に保存するよ

workflowの develop環境デプロイは
・secrets.DEVELOP_DOTENV から取り出して「.env」ファイルに保存する
・develop環境にデプロイする

workflowの production環境デプロイは
・secrets.PRODUCTION_DOTENV から取り出して「.env」ファイルに保存する
・production環境にデプロイする
こんな感じかな

SecretsやVariables は Environment ごとに設定できるみたいね
参考記事
