- レビューアプリの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-smoke
GitLabのコア機能を検証するための、小規模で迅速なテストのサブセット。 -
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-apps
Kubernetes クラスターにデプロイします。- レビューアプリをデプロイするために使用される実際のスクリプトは
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プロジェクトを使用しているので、ある時点でレジストリを消去して、新しく空のものを使用することができます。
悪用されないためのセキュリティは?アプリは世界中に公開されているので、私たちだけに限定する方法を見つける必要があります。
これはフォークには有効ではありません。