ワークフロー#
Lagoonは、可能な限り多様な開発ワークフローをサポートしようとしています。特に、チームに対して特定のワークフローを強制することなく、各開発チームが自分たちのコードをどのように開発しデプロイするかを定義できます。
固定ブランチ#
最も直接的なワークフローは、いくつかの固定ブランチに基づいたデプロイメントです:
Lagoonがデプロイすべきブランチ(例えば develop
、staging
、main
など、これらは正規表現で ^(develop|staging|main)$
となります)を定義し、それを実行します。それで完了です!
新しい機能をテストしたい場合は、ローカルで設定したブランチにそれらをマージしてプッシュし、Lagoonがその機能をデプロイします。問題がなければ、そのブランチをあなたの本番ブランチにマージしてプッシュします。
フィーチャーブランチ#
もう少し高度なものになると、フィーチャーブランチがあります。Lagoonは、デプロイしたいブランチを正規表現で定義する能力をサポートしているので、上記の正規表現をこのように拡張することもできます:^feature\/|^(staging|main)$
。これにより、Lagoonはfeature/
で始まるすべてのブランチ、およびstaging
とmain
という名前のブランチをデプロイするよう指示します。私たちの開発ワークフローは以下のようになるかもしれません:
- 新しいブランチを作成する
main
からfeature/myfeature
を呼び出し、feature/myfeature
をプッシュします。 - Lagoonは、
feature/myfeature
ブランチを新しい環境としてデプロイし、他の機能とは独立して機能をテストできます。 feature/myfeature
をmain
ブランチにマージすると、それはあなたの本番環境にデプロイされます。
もしご希望であれば、feature/myfeature
や他のフィーチャーブランチを最初にstaging
にマージして、複数の機能を一緒にテストすることもできます。その後、mainにマージできます。
このワークフローは、Gitリポジトリのブランチの整理とクリーンさが非常に重要です。各フィーチャーブランチは自身のLagoon環境を作成するため、非常に速く大量の環境を生成することができ、それら全てがリソースを消費します。未使用のブランチは必ずマージするか削除してください。
このため、プルリクエストベースのワークフローを考えることが理にかなっているかもしれません。
プルリクエスト#
さらに高度なワークフローはプルリクエストによるものです。このようなワークフローは、プルリクエスト(またはマージリクエストとも呼ばれます)をサポートするGitホスティングのサポートが必要です。プルリクエストベースのワークフローのアイデアは、ビルド中にLagoonがマージを行ってくれるので、実際にマージする必要はなく、ターゲットブランチと一緒に機能をテストできるというアイデアの背景にあります。
私たちの例では、Lagoonを設定して、ブランチ^(staging|main)$
とプルリクエストを.*
(すべてのプルリクエストをデプロイする)にデプロイさせます。 これでワークフローは次のようになります:
main
から新しいブランチfeature/myfeature
を作成し、feature/myfeature
をプッシュします(デプロイされるブランチはstaging
とmain
のみのため、今はデプロイは行われません)。- あなたのGitホスティングで
feature/myfeature
からmain
へのプルリクエストを作成します。 - Lagoonは今、
feature/myfeature
ブランチをmain
ブランチの上にマージし、その結果のコードをデプロイします。 - これで、
feature/myfeature
ブランチの機能をテストできます。まるでmain
にマージされたかのように、feature/myfeature
ブランチを作成してからmain
で起こったすべての変更がそこにありますので、main
ブランチの古いバージョンを持っているかもしれないと心配する必要はありません。- マージの競合がある場合、ビルドが失敗し、Lagoonは停止してあなたに通知します。
- あなたがプルリクエストのテストを終えた後 リクエストブランチでは、Gitホスティングに戻って実際にコードを
main
にマージすることができます。これにより、main
のデプロイがトリガーされます。 - プルリクエストがマージされると、自動的にクローズされ、Lagoonはプルリクエストの環境を自動的に削除します。
一部のチームでは、共有のstaging
ブランチに対してプルリクエストを作成し、その後、別のプルリクエストを介してstaging
ブランチをmain
ブランチにマージすることを選択するかもしれません。これは、使用しているGitのワークフローの種類によります。
また、Lagoonでは、タイトルに特定のテキストがあるプルリクエストのみをデプロイするように設定することができます。正規表現として定義された[BUILD]
は、タイトルが[BUILD] My Pull Request
のようなプルリクエストのみをデプロイし、タイトルがMy other Pull Request
のようなプルリクエストは自動的にデプロイされません。これにより、環境の数を少なく保つことができ、まだ環境が必要でないプルリクエストを保持すること可能にします。
プルリクエストの自動データベース同期#
自動的なプルリクエストの環境は素晴らしいことです。しかし、それらの環境が作成されたときに別の環境からデータベースが同期されると便利だろうとも思います。Lagoonはそれを扱うことができます!
次の例は、プルリクエスト環境の最初のロールアウトでステージングデータベースを同期します:
tasks:
post-rollout:
- run:
name: IF no Drupal installed & Pullrequest = Sync database from staging
command: |
if [[ -n ${LAGOON_PR_BASE_BRANCH} ]] && tables=$(drush sqlq 'show tables;') && [ -z "$tables" ]; then
drush -y sql-sync @staging default
fi
service: cli
shell: bash
プロモーション#
環境にコードをデプロイする別の方法は、プロモーションワークフローです。
プロモーションワークフローの考え方は、例としてここから来ています。
staging
ブランチをmain
ブランチにマージし、main
に変更がなければ、つまりmain
とstaging
がGitでまったく同じコードを持っている場合でも、結果として得られるDockerイメージがわずかに異なる可能性があります。これは、最後のstaging
デプロイメントと現在のmain
デプロイメントの間に、いくつかの上流Dockerイメージが変更されたか、またはさまざまなパッケージマネージャーによってロードされた依存関係が変更された可能性があるためです。これは非常に小さい確率ですが存在します。
そのため、 この状況ではLagoonは一つの環境から別の環境へのLagoonイメージのプロモーションという概念を理解しています。これは基本的に、すでに構築されデプロイされたDockerイメージを一つの環境から取り出し、それらのまったく同じDockerイメージを別の環境で使用するということを意味します。
私たちの例では、main
環境からproduction
環境へDockerイメージをプロモートしたいと思っています:
- 最初に、
main
という名前の通常のデプロイ環境が必要です。環境が正常にデプロイされていることを確認してください。 - また、Gitリポジトリに
production
という名前のブランチがないことを確認してください。これがあると、人々がこのブランチにプッシュするなど、奇妙な混乱を引き起こす可能性があります。 - 次に、lagoon cliを使用してプロモーションデプロイメントをトリガーします:
lagoon deploy promote --project="myproject" --source="main" --destination="production"
これは、ソースmain
からデスティネーションproduction
へのプロモーションを希望することをLagoonに伝えます。
Lagoonは次のことを行います:
.lagoon.yml
とdocker-compose.yml
ファイルをロードするために、Gitブランチmain
をチェックアウトします(Lagoonが 完全に動作するにはこれらがまだ必要です)。docker-compose.yml
で定義されたサービスに対して、すべてのKubernetes/OpenShiftオブジェクトを作成しますが、環境変数としてLAGOON_GIT_BRANCH=production
を使用します。main
環境から最新のイメージをコピーし、それらを使用します(イメージをビルドしたり、上流からタグ付けしたりする代わりに)。- 通常のデプロイメントのように、すべてのポストロールアウトタスクを実行します。
他のデプロイメントと同様に、成功または失敗の通知を受け取ります。