- レビューアプリのE2Eテスト実行
- パフォーマンスメトリクス
- レビューアプリのサンプルデータ
- サンプル・プロジェクトの作成方法
- どのように動作しますか?
- クラスターの設定
- 不健全なレビューアプリのリリースの診断
- よくある質問
- その他のリソース
GitLab開発におけるレビューアプリの利用
レビューアプリはstart-review-app-pipeline ジョブを使ってデプロイします。このジョブは、レビューアプリのデプロイに必要なさまざまなタスクを実行する一連のジョブを含む子パイプラインをトリガーします。
以下のシナリオでは、start-review-app-pipeline のジョブが自動的に開始されます:
- CI 設定の変更を伴うマージリクエストの場合
- フロントエンドの変更を含むマージリクエストの場合
- への変更を含むマージリクエストの場合
{,ee/,jh/}{app/controllers}/**/* - への変更を含むマージリクエストの場合
{,ee/,jh/}{app/models}/**/* - への変更を含むマージリクエストの場合
{,ee/,jh/}lib/{,ee/,jh/}gitlab/**/* - QA 変更を含むマージリクエストの場合
- スケジュールパイプライン用
- MRは
pipeline:run-review-appラベルが設定されています。
レビューアプリのE2Eテスト実行
qa ステージ (review ステージの後) のすべてのパイプラインで、review-qa-smoke とreview-qa-blocking のジョブが自動的に開始されます。
qa ステージは以下のジョブで構成されています:
-
review-qa-smokeGitLabのコア機能を検証するための、小規模で迅速なテストのサブセット。 -
review-qa-blocking信頼できるテストのサブセット。これらのテストは安定しているとみなされ、失敗は許されません。 -
review-qa-non-blocking手動でトリガーできる残りの e2e テスト。
review-qa-* ジョブは、マージリクエストの変更に対するエンドツーエンドのテストが本番環境でパスすることを保証します。これは、GitLab.comの機能を壊したり、コストのかかるGitLab.comのデプロイ・ブロッカーを防いだりするために、e2eの失敗の特定を本番環境からマージリクエストにシフトします。必要であれば review-qa-*、エラーの根本的な原因を特定するために、SET(テスト中のソフトウェア・エンジニア)と一緒にエラーを調査する必要があります。
エンドツーエンドのテスト実行が終わると、e2e-test-report ジョブによってAllure レポートが生成・公開されます。レポートへのリンクを含むコメントがマージリクエストに追加されます。
エラーはgitlab-review-apps Sentry プロジェクトで見つけることができ、レビューアプリの URLやコミット SHAでフィルタリングできます。
失敗したレビューアプリのデプロイをバイパスして、壊れたmaster の修正をマージします。
レビューアプリのデプロイの失敗によってパイプラインがブロックされ、顧客にとって重要なマージリクエストがブロックされた場合、メンテナーはmaster](https://about.gitlab.com/handbook/engineering/workflow/#instructions-for-the-maintainer) が壊れている間のマージに[プロセスを使用することを選択できます。
パフォーマンスメトリクス
qa ステージのすべてのレビューアプリの子パイプラインで、browser_performance ジョブが自動的に開始されます。このジョブはSitespeed.io コンテナを使用して基本的なブラウザのパフォーマンステストを行います。
レビューアプリのサンプルデータ
レビューアプリをデプロイすると、sample-gitlab-project テンプレートプロジェクトからプロジェクトデータが作成されます。これは、手動テストや探索的テストを容易にするために、あらかじめ入力されたリソースをプロジェクトに提供することを目的としています。
サンプルプロジェクトはroot ユーザーネームスペースに作成され、そのユーザーの個人プロジェクトリストからアクセスできます。
サンプル・プロジェクトの作成方法
レビューアプリをまっさらな状態から再デプロイする方法
レビューアプリをリセットし、まっさらな状態から再デプロイするには、以下の手順を実行します:
-
review-stopジョブを実行します。 -
review-deployジョブを実行または再試行してデプロイを再実行します。
こうすることで、以前にデプロイされたレビューアプリから既存のデータがすべて削除されます。
GCPレビューアプリクラスターへのアクセスを取得します。
gcp-review-apps-dev GCPグループとロールのアクセスリクエスト(内部リンク)を開く必要があります。
これにより、以下の権限が付与されます:
-
ポッドログの取得。Viewer (
roles/viewer)によって許可されます。 -
Railsコンソールの実行。Kubernetes Engine Developer (
roles/container.pods.exec)によって許可されています。
私のレビューアプリにログインします。
GitLabチームメンバー専用です。レビューアプリにサインインしたい場合は、共有1PasswordアカウントのGitLabハンドブック情報をレビューしてください。
- デフォルトのユーザー名は
rootです。 - パスワードは、
GitLab EE Review Appという 1Password ログイン項目にあります。
レビューアプリの機能フラグを有効にします。
- レビューアプリを開き、上記の手順でサインインします。
- 個人アクセストークンを作成します。
- 機能フラグAPIを使用して機能フラグを有効にします。
レビューアプリのスラッグを探す
-
review-deployジョブを開きます。 -
** Deploying review-*を探してください。 - 例えば
** Deploying review-1234-abc-defg... **の場合、レビューアプリのスラッグはreview-1234-abc-defgになります。
Railsコンソールを実行します。
- まずクラスターへのアクセス権限と
container.pods.exec権限があることを確認してください。 -
レビューアプリのスラッグでワークロードをフィルタリングします。たとえば、
review-qa-raise-e-12chm0。 -
toolboxデプロイを見つけて開きます。たとえば、review-qa-raise-e-12chm0-toolbox。 - Managed pods」セクションでポッドを選択します。たとえば、
review-qa-raise-e-12chm0-toolbox-d5455cc8-2lsvz。 -
KUBECTLドロップダウンリストを選択し、Exec->toolbox. - デフォルトのコマンドから
-c toolbox -- lsを-it -- gitlab-rails consoleに置き換えるか、または-
kubectl exec --namespace review-qa-raise-e-12chm0 review-qa-raise-e-12chm0-toolbox-d5455cc8-2lsvz -it -- gitlab-rails consoleを実行し-
review-qa-raise-e-12chm0-toolbox-d5455cc8-2lsvzをあなたのポッドの名前に置き換えてください。
-
-
ポッドのログを調べる
- まずクラスターへのアクセス権限と
container.pods.getLogs権限があることを確認してください。 -
レビューアプリのスラッグでワークロードをフィルタリングします。たとえば、
review-qa-raise-e-12chm0。 -
migrationsデプロイを見つけて開きます。たとえば、review-qa-raise-e-12chm0-migrations.1。 - Managed pods」セクションでポッドを選択します。たとえば、
review-qa-raise-e-12chm0-migrations.1-nqwtx。 -
Container logsを選択します。
あるいは、ログを検索するためのより多くのユーティリティを提供するログエクスプローラを使用することもできます。ポッド名のクエリの例は次のとおりです:
resource.labels.pod_name:"review-qa-raise-e-12chm0-migrations"
どのように動作しますか?
CI/CDアーキテクチャ図
詳細説明
-
prepareステージ中のすべてのパイプラインで、compile-production-assetsジョブが自動的に開始されます。- それが完了すると、
review-build-cngジョブが開始します。これは、次のステップでトリガーされるCNG-mirrorパイプラインがそれに依存しているからです。
- それが完了すると、
-
compile-production-assetsが終了すると、review-build-cngジョブはCNG-mirrorプロジェクトのパイプラインをトリガーします。-
review-build-cngジョブは、MRにCIやフロントエンドの変更が含まれている場合にのみ自動的に開始されます。それ以外の場合、ジョブは手動です。 -
CNG-mirrorパイプラインは、GitLab パイプラインからのコミットに基づいて各コンポーネントの Docker イメージ(例えば、gitlab-rails-ee,gitlab-shell,gitalyなど)を作成し、レジストリに保存します。 -
CNG, (Cloud Native GitLab)のプロジェクトのレジストリに多くの一時的なDockerイメージが過負荷にならないように、CNG-mirrorプロジェクトを使用しています。
-
-
review-build-cngが完了すると、review-deployジョブは公式の GitLab Helm チャートを使ってレビューアプリを GCP 上のreview-appsKubernetes クラスターにデプロイします。- レビューアプリをデプロイするために使用される実際のスクリプトは
scripts/review_apps/review-apps.shにあります。 - これらのスクリプトは基本的に公式の Auto DevOps スクリプトで、デフォルトの CNG イメージがビルドされたイメージで上書きされ、
CNG-mirrorプロジェクトのレジストリに保存されます。 - 公式の GitLab Helm チャートを使っているので、本番環境に近いブランチ専用の環境を手に入れることができます。
- 各レビューアプリは独自のKubernetes名前空間にデプロイされます。名前空間は各ブランチに固有のレビューアプリのスラッグに基づいています。
- レビューアプリをデプロイするために使用される実際のスクリプトは
-
review-deployジョブが成功すると、MR ウィジェットからの直接リンクにより、レビューアプリを使用できるようになります。レビューアプリにログインするには、以下の “Log into my review app?” を参照してください。
その他の注意事項
-
review-deployジョブが失敗し続ける場合(手動で再試行してもうまくいかない場合)、#g_qe_engineering_productivityチャンネルにメッセージを投稿するか、マージリクエストへのリンクを含む~"Engineering Productivity"~"ep::review apps"~"type::bug"イシューを作成してください。デプロイの失敗によって、マージリクエストで導入された実際の問題が明らかになる可能性があります(つまり、これは必ずしも一過性の失敗ではありません)! -
review-qa-smokeまたはreview-qa-reliableのジョブが失敗し続ける場合 (すでに一度再試行しています)、ジョブのログを確認してください: あなたのマージリクエストで導入された実際の問題を発見できるかもしれません。失敗が発生したページのスクリーンショットを見るためにアーティファクトをダウンロードすることもできます。もし失敗の原因が見つからなかったり、あなたの変更と関係なさそうな場合は、#qualityチャンネルにメッセージを投稿するか、あなたのマージリクエストへのリンクを添えて ~Quality ~"type::bug" issue を作成してください。 - 手動
review-stopはレビューアプリを手動で停止するために使うことができます。また、マージリクエストのブランチがマージ後に削除されると、GitLab によって開始されます。 - Kubernetes クラスターは、GitLab Kubernetes インテグレーションを使って
gitlabプロジェクトに接続されています。これにより、基本的にマージリクエストウィジェットから直接レビューアプリへのリンクを持つことができます。
レビューアプリの自動停止
環境自動停止機能により、レビューアプリは最後のデプロイから2日後に自動的に停止します。
レビューアプリを長時間立ち上げておく必要がある場合は、その環境を固定するか、review-deploy ジョブを再試行して “latest deployed at” 時間を更新することができます。
スケジュールされたパイプラインで自動的に実行されるreview-cleanup ジョブは、5日後に古いレビューアプリを停止し、6日後にその環境を削除し、7日後にぶら下がっている Helm リリースと Kubernetes リソースをクリーンアップします。
クラスターの設定
クラスターはengineering-productivity-infrastructure プロジェクトの Terraform 経由で設定します。
GitLab RunnerのKubernetes Executorには既知のイシューがあるため、ノードプールのイメージタイプはContainer-Optimized OS with Containerd (cos_containerd) ではなくContainer-Optimized OS (cos) である必要があります。
Helm
使用される Helm のバージョンは、review-deploy とreview-stop のジョブで使用されるregistry.gitlab.com/gitlab-org/gitlab-build-images:gitlab-helm3.5-kubectl1.17 イメージ で定義されています。
不健全なレビューアプリのリリースの診断
レビューアプリの安定性が低下した場合、review-apps クラスタが不健全であることを示すシグナルかもしれません。レビューアプリのデプロイにおいて、再起動につながるヘルスチェックの失敗や過半数の失敗が先行指標となる可能性があります。
レビューアプリの概要ダッシュボードは、クラスターの負荷スパイクを特定し、ノードに問題がある場合、またはクラスター全体が不健全な傾向にある場合に役立ちます。
レビューアプリリリースのトラブルシューティングについては、Engineering Productivity Runbookのレビューアプリのページを参照してください。
よくある質問
テスト実行のたびにCNGイメージのビルドをトリガーするのはやりすぎではありませんか?これは何千もの未使用のDockerイメージを作成します。
どこかで始めて、後で改善しなければなりません。また、これらのDockerイメージを保存するためにCNG-mirrorプロジェクトを使用しているので、ある時点でレジストリを消去して、新しく空のものを使用することができます。
悪用されないためのセキュリティは?アプリは世界中に公開されているので、私たちだけに限定する方法を見つける必要があります。
これはフォークには有効ではありません。
