ステップ 11: コードをブランチ運用する

5.0 version
Maintained

コードをブランチ運用する

プロジェクトにおいてコード変更のワークフローを整理する方法は数多く存在します。しかし、Git の master ブランチで直接作業し、テストすること無しにそのまま本番環境にデプロイする方法はおそらく最善策ではありません。

テストするということは、ユニットテストやファンクショナルテストを実行することだけでなく、アプリケーションの振る舞いを本番データを使って確認することも意味します。アプリケーションがエンドユーザーにデプロイされた時に、あなた自身や ステークホルダー がブラウザで確認できるのであれば、そのことは大きなアドバンテージであり、自信を持ってデプロイすることが可能となります。非技術者が新機能を検証できることはとても心強いことです。

次のステップでは、単純化と冗長な記述を避けるために Git の master ブランチ上で全ての作業を続けますが、どうやってより良くするか見ていきましょう。

Git のワークフローを取り入れる

ワークフローの一例として、新しいフィーチャーやバグ修正毎にブランチを作成する方法があります。これは単純で効果的なやり方です。

インフラストラクチャを記述する

まだピンと来ていないかもしれませんが、インフラストラクチャをコードと一緒にファイルに記述することは大いに役立ちます。Docker と SymfonyCloud はプロジェクトのインフラストラクチャを記述するために設定ファイルを利用します。新しいフィーチャーで追加のサービスが必要となった際には、コードの変更とインフラストラクチャの変更は同じパッチに含まれます。

ブランチを作成する

このワークフローは、Git ブランチの作成から始まります:

1
$ git branch -D sessions-in-redis || true
1
$ git checkout -b sessions-in-redis

このコマンドで master ブランチから sessions-in-redis ブランチを作成します。そうすることで、コードとインフラストラクチャの設定を "フォーク" します。

Redis にセッションを格納する

ブランチ名から推測できるかもしれませんが、セッションストレージをファイルシステムから Redis に変更したいと考えています。

それを実現するために必要な手順は典型的なものです:

  1. Git ブランチを作成します。
  2. 必要に応じて Symfony の設定を変更します。
  3. 必要に応じてコードの追加や編集を行います。
  4. PHP の設定を変更します(Redis PHP extension を追加します)。
  5. Docker と SymfonyCloud 上のインフラストラクチャを変更します(Redis サービスを追加します)。
  6. ローカルでテストします。
  7. リモートでテストします。
  8. master ブランチにマージします。
  9. 本番環境にデプロイします。
  10. ブランチを削除します。

手順2〜5で必要な変更は1つのパッチで実行できます。

patch_file
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
--- a/.symfony.cloud.yaml
+++ b/.symfony.cloud.yaml
@@ -15,8 +15,13 @@ runtime:
 build:
     flavor: none

+variables:
+    php-ext:
+        redis: 5.3.1
+
 relationships:
     database: "db:postgresql"
+    redis: "rediscache:redis"

 web:
     locations:
--- a/.symfony/services.yaml
+++ b/.symfony/services.yaml
@@ -2,3 +2,6 @@ db:
     type: postgresql:11
     disk: 1024
     size: S
+
+rediscache:
+    type: redis:5.0
--- a/config/packages/framework.yaml
+++ b/config/packages/framework.yaml
@@ -7,7 +7,7 @@ framework:
     # Enables session support. Note that the session will ONLY be started if you read or write from it.
     # Remove or comment this section to explicitly disable session support.
     session:
-        handler_id: null
+        handler_id: '%env(REDIS_URL)%'
         cookie_secure: auto
         cookie_samesite: lax

--- a/docker-compose.yaml
+++ b/docker-compose.yaml
@@ -8,3 +8,7 @@ services:
             POSTGRES_PASSWORD: main
             POSTGRES_DB: main
         ports: [5432]
+
+    redis:
+        image: redis:5-alpine
+        ports: [6379]

美しい ですよね?

Redis サービスを開始するために Docker を "再起動" します:

1
2
$ docker-compose stop
$ docker-compose up -d

Web サイトを閲覧してローカルでテストしてみてください。セッションをまだ利用しておらず見た目の変更がないので、全てこれまでと同じように機能するはずです。

ブランチをデプロイする

本番環境にデプロイする前に、本番環境と同一のインフラストラクチャでこのブランチをテストすべきでしょう。また、 Symfony の prod 環境で全てが正常に動作することを検証すべきです(ローカルの Web サイトでは Symfony の dev 環境を利用していました)。

まず初めに、新しいブランチに変更箇所をコミットしたことを確かめましょう:

1
2
$ git add .
$ git commit -m'Configure redis sessions'

では、 Git ブランチ に基づいた SymfonyCloud 環境 を作成しましょう:

1
$ symfony env:delete sessions-in-redis --no-interaction
1
$ symfony env:create

このコマンドで以下の新しい環境を作成します:

  • このブランチは現在の Git ブランチ (sessions-in-redis) のコードとインフラストラクチャを引き継ぎます。
  • データベースやファイル(例えばユーザーがアップロードしたファイルです)を含む全サービスのデータについて一貫したスナップショットを取得することによりb、マスタ環境(本番環境)からデータが取得されます。
  • コード、データ、インフラストラクチャをデプロイするために専用のクラスターが新たに作成されます。

今回のデプロイは本番へのデプロイと同じ手順に従うため、データベースのマイグレーションも実行されます。これは本番のデータでマイグレーションが機能することを検証するための良い方法です。

master 環境は master 環境と非常に良く似ていますが、多少の差分が存在します。例えば、メールはデフォルトでは送信されません。

デプロイが完了したら、新しいブランチをブラウザで開きます:

1
$ symfony open:remote

すべての SymfonyCloud コマンドは現在の Git ブランチ上で動作することに気付きましたか?このコマンドを実行すると sessions-in-redis ブランチのデプロイ URL が開きます。URL は https://sessions-in-redis- xxx.eu.s5y.io/ となります。

新しい環境の Web サイトをテストしてみてください。マスタ環境で作成した全てのデータを確認できるはずです。

master 環境でさらにカンファレンスを追加した場合、sessions-in-redis 環境には表示されません。その逆の場合も同様です。各環境は独立しており、隔離されています。

もし master 上のコードが更新されていたら、コードとインフラストラクチャのコンフリクトを解消して、Git ブランチをリベースし、最新のバージョンをデプロイすることができます。

マスタ環境から sessions-in-redis 環境にデータを同期することも可能です:

1
$ symfony env:sync

デプロイ前に本番のデプロイをデバッグする

すべての SymfonyCloud 環境はデフォルトで master/prod 環境(Symfonyの prod 環境)と同じ設定を利用しています。これによって、実際の条件でアプリケーションをテストすることが出来ます。本番サーバー上で直に開発とテストを行っている感覚になりますが、リスクはありません。FTP経由でデプロイしていた古き良き時代を思い出させますね。

何か問題が起きた時に、Symfony の dev 環境に切り替えたくなるかもしれません:

1
$ symfony env:debug

問題が解決した後は、本番設定に戻しておきましょう:

1
$ symfony env:debug --off

警告

master ブランチ上では、決して dev 環境を有効化したり Symfony プロファイラを有効化したりしないでください。アプリケーションの動作がとても重たくなり、セキィリティ上の深刻な脆弱性が多く発生してしまいます。

デプロイ前に本番のデプロイをテストする

次期バージョンの Web サイトを本番データでアクセスすることで、見た目の回帰テストから性能テストに至るまで、多くの事を確認できます。Blackfire はこの仕事をやる上で完璧なツールです。

Blackfireを使ってデプロイ前にコードをテストする方法をもっと学ぶためには、"パフォーマンス" に関する手順を参照してください。

本番へマージする

ブランチの変更内容に問題が無ければ、コードとインフラストラクチャを Git の master ブランチにマージしてください:

1
2
$ git checkout master
$ git merge sessions-in-redis

そしてデプロイを実行します:

1
$ symfony deploy

デプロイされると、コードとインフラストラクチャの変更のみ SymfonyCloud にプッシュされます。データは一切影響を受けません。

クリーンアップする

最後に、Git ブランチ と SymfonyCloud 環境を削除してクリーンアップします:

1
2
$ git branch -d sessions-in-redis
$ symfony env:delete --env=sessions-in-redis --no-interaction

  • « Previous ステップ 10: ユーザーインターフェースを構築する
  • Next » ステップ 12: イベントをリッスンする

This work, including the code samples, is licensed under a Creative Commons BY-NC-SA 4.0 license.