Auto DevOps

Auto DevOpsは、事前に定義されたCI/CD構成を提供し、アプリケーションの自動検出、ビルド、テスト、デプロイ、および監視を可能にします。 CI/CDのベストプラクティスとツールを活用することで、Auto DevOpsは、成熟した最新のソフトウェア開発ライフサイクルのセットアップと実行を簡素化することを目的としています。

概要

プロジェクトのビルド、デプロイ、モニタリングに必要なワークフローやプロセスを設定するために、多くの労力を費やすことになります。 会社にメンテナーすべきプロジェクトが何百、何千とある場合は、さらに悪化します。 新しいプロジェクトが絶えず立ち上がるため、ソフトウェア開発プロセス全体を管理するのは不可能なほど複雑になります。

Auto DevOps は、最小限の設定ですべてのプロジェクトのテスト、ビルド、パッケージ、デプロイ、監視に必要なすべての依存関係と言語テクノロジーを自動的に検出することで、シームレスなソフトウェア開発プロセスを提供します。 自動化により、プロジェクト全体の一貫性、プロセスのシームレスな管理、新しいプロジェクトの迅速な作成が可能になります。コードをプッシュすると、あとは GitLab が作業を行い、生産性と効率を向上させます。

Auto DevOpsの紹介については、GitLab 11.0のAutoDevOpsをご覧ください。

要件については、「Auto DevOpsの要件」を参照してください。

デフォルトで有効

GitLab 11.3で導入されました

Auto DevOpsは、すべてのプロジェクトでデフォルトで有効になっており、各プロジェクト内のすべてのパイプラインで実行しようとします。 インスタンス管理者は、Auto DevOps設定でこのデフォルトを有効または無効にすることができます。 Auto DevOpsは、プロジェクトで明示的に有効になっていない場合、最初のパイプラインの失敗時に個々のプロジェクトで自動的に無効になります。

GitLab 12.7以降、Auto DevOps はDockerfile または一致する buildpackが存在する場合のみ、パイプライン上で自動的に実行されます。

プロジェクトにCI/CD設定ファイルが存在する場合、Auto DevOpsが有効になっているかどうかにかかわらず、CI/CD設定ファイルは引き続き使用されます。

クイックスタート

GitLab.comを使用している場合は、Google Kubernetes Engine(GKE)でGitLab.comとKubernetesクラスターを使用してAuto DevOpsを設定するためのクイックスタートガイドを参照してください。

GitLab のセルフマネージドインスタンスを使用する場合は、GKE にクラスターを設定する前に GoogleOAuth2 OmniAuth Providerを設定する必要があります。 プロバイダーを設定した後は、クイックスタートガイドの手順に従って作業を開始できます。

GitLab13.0以降では、Auto DevOpsを活用してAWS ECSにデプロイすることが可能です。

アプリケーション・プラットフォームやPaaSとの比較

Auto DevOpsは、アプリケーションプラットフォームやPlatform as a Service (PaaS)によく含まれる機能を提供します。 これは、Herokuが行った革新的な仕事からインスピレーションを受け、さまざまな点でそれを超えるものです:

  • Auto DevOpsはどのKubernetesクラスターでも動作します。GitLabのインフラストラクチャでの動作に限定されることはありません(多くの機能はKubernetesなしでも動作することに注意してください)。
  • 追加コストはかからず(インフラコストに上乗せされることはありません)、公開クラウド(GoogleKubernetes Engineなど)上のKubernetesクラスターやContainers as a Serviceを利用できます。
  • Auto DevOpsには、セキュリティ・テスト、パフォーマンス・テスト、コード品質テストなどの機能があります。
  • Auto DevOpsは、段階的な卒業パスを提供します。 高度なカスタマイズが必要な場合、まったく別のプラットフォームでやり直すことなく、テンプレートの変更を開始できます。 詳細については、カスタマイズのドキュメントをレビューしてください。

特徴

一連のステージで構成されるAuto DevOpsは、これらのベストプラクティスをシンプルかつ自動的な方法でプロジェクトにもたらします:

  1. オートビルド
  2. オートテスト
  3. オートコードの品質
  4. 自動SAST(静的アプリケーション・セキュリティ・テスト)
  5. 自動シークレット検出
  6. 自動依存関係スキャン
  7. 自動車免許コンプライアンス
  8. 自動コンテナスキャン
  9. オートレビューアプリ
  10. 自動DAST(動的アプリケーション・セキュリティ・テスト)
  11. 自動デプロイ
  12. 自動ブラウザ・パフォーマンス・テスト
  13. オートモニタリング

Auto DevOpsは多くの異なるコンポーネントに依存しているため、以下の基本的な知識を持っている必要があります:

Auto DevOpsはすべてのステージに優れたデフォルトを提供し、CIテンプレートを利用します。

Auto DevOpsの概要については、こちらのブログ記事をご覧ください。

KubernetesクラスターはAuto DevOpsなしで使用できます。

Kubernetesの要件

Kubernetesの自動DevOps要件を参照してください。

自動DevOpsベースドメイン

Auto DevOpsのベースドメインは、Auto Review AppsAuto Deploy、およびAuto Monitoringを使用するために必要です。 ベースドメインは、以下のいずれかの場所で定義できます:

  • インスタンス、プロジェクトグループのいずれであっても、クラスターの設定で
  • または変数としてプロジェクトレベルで:KUBE_INGRESS_BASE_DOMAIN
  • または変数としてグループレベルで:KUBE_INGRESS_BASE_DOMAIN
  • またはインスタンス全体のフォールバックとして 管理エリア > [設定]の [継続的インテグレーションと配信] セクションにあります。

ベースドメイン変数KUBE_INGRESS_BASE_DOMAIN 、他の環境変数と同じ優先順位に従います。CI/CD変数が設定されておらず、クラスター設定が空白のままである場合、インスタンス全体のAuto DevOpsドメイン設定が設定されていれば、それが使用されます。

ヒント:Ingress用のGitLab管理アプリを使っている場合、URLエンドポイントは自動的に設定されているはずです。](../../user/clusters/applications.md#ingress) 変数にその値を使うだけです。
注:AUTO_DEVOPS_DOMAINGitLab 11.8で非推奨となり、KUBE_INGRESS_BASE_DOMAINに置き換えられ、GitLab 12.0で削除されました。

Auto DevOpsには、ベースドメインに一致するワイルドカードDNS Aレコードが必要です。ベースドメインがexample.comの場合、次のようなDNSエントリーが必要です:

*.example.com   3600     A     1.2.3.4

この場合、デプロイされたアプリケーションはexample.comから提供されます。1.2.3.4はロードバランサーの IP アドレスで、通常は NGINX です(要件を参照)。DNS レコードの設定はこのドキュメントの範囲外です。情報については DNS プロバイダーに確認してください。

また、nip.io のような無料の公開サービスを利用することもできます。nip.ioでは、Auto DevOps のベースドメインを1.2.3.4.nip.ioに設定します。

セットアップ完了後、すべてのリクエストはロードバランサーにヒットし、ロードバランサーはアプリケーションを実行しているKubernetesポッドにリクエストをルーティングします。

AWS ECS

AmazonECSのAuto DevOps要件を参照してください。

自動DevOpsの有効化/無効化

Auto DevOps を初めて使用する場合は、要件をレビューし、Auto DevOps をフル活用するために必要なコンポーネントがすべて利用可能であることを確認してください。 初めて使用するユーザーは、クイックスタートガイドに従ってください。

GitLab.comユーザーは、プロジェクトレベルでのみAuto DevOpsを有効または無効にすることができます。 セルフマネージドユーザーは、プロジェクト、グループ、インスタンスレベルでのみAuto DevOpsを有効または無効にすることができます。

プロジェクトレベル

有効になっている場合は、プロジェクトに.gitlab-ci.ymlがないことを確認するか、存在する場合は削除してください。

  1. プロジェクトの{設定} 設定 > CI/CD > Auto DevOpsに移動します。
  2. Default to Auto DevOps pipelineチェックボックスを選択して有効にします。
  3. (オプションですが、推奨)有効にすると、Auto DevOpsがアプリケーションのデプロイに使用するベースドメインを追加し、デプロイ戦略を選択できます。
  4. 変更を有効にするには、[変更を保存] をクリックします。

この機能を有効にすると、デフォルトブランチでAuto DevOpsパイプラインが起動します。

グループレベルで

GitLab 11.10 で導入されました

グループレベルでAuto DevOpsを有効または無効にできるのは、管理者とグループオーナーだけです。

グループレベルで Auto DevOps を有効または無効にする場合、Auto DevOps がサブグループまたはプロジェクトで特に有効または無効になっていない限り、グループ構成はそのグループ内のサブグループおよびプロジェクトに暗黙的に使用されます。

グループレベルでAuto DevOpsを有効または無効にします:

  1. グループの{設定} 設定 > CI/CD > Auto DevOpsページに移動します。
  2. Default to Auto DevOps pipelineチェックボックスを選択して有効にします。
  3. 変更を有効にするには、[変更を保存] をクリックします。

インスタンスレベルで(管理者のみ)

インスタンスレベルで無効にした場合でも、グループオーナーとプロジェクトメンテナーは、それぞれグループレベルとプロジェクトレベルでAuto DevOpsを有効にすることができます。

  1. admin} 管理エリア > 設定 > 継続的インテグレーションとデプロイに移動します。
  2. Default to Auto DevOps pipeline for all projects]を選択して有効にします。
  3. (オプション)Auto DevOpsのベースドメインを設定し、Auto DeployアプリとAuto Reviewアプリが使用できるようにします。
  4. 変更を有効にするには、[変更を保存] をクリックします。

デプロイ戦略

GitLab 11.0で導入されました

プロジェクトの Settings > CI/CD > Auto DevOpsでAuto DevOpsが使用するデプロイ戦略を変更できます。 以下のオプションが利用可能です:

  • 本番環境への継続的デプロイ:master ブランチを本番環境に直接デプロイする自動デプロイを有効にします。
  • 時限付きインクリメンタル ロールアウトを使用した本番環境への継続的デプロイ:INCREMENTAL_ROLLOUT_MODE 変数をtimedに設定します。 本番環境へのデプロイは、ロールアウトの各インクリメント間に 5 分の遅延を設けて実行されます。
  • ステージングへの自動デプロイ、プロダクションへの手動デプロイ:STAGING_ENABLEDINCREMENTAL_ROLLOUT_MODE 変数を1manualに設定します。 これは次のことを意味します:

    • master ブランチは直接ステージングにデプロイされます。
    • 手動アクションは、本番への段階的なロールアウトのために提供されます。
ヒント:ダウンタイムとリスクを最小限に抑えるために、ブルーグリーンのデプロイ手法を使用します。

複数のKubernetesクラスターの使用

Auto DevOpsを使用する場合、Kubernetesクラスタ間は1:1で接続されているため、異なる環境を異なるKubernetesクラスタにデプロイすることができます。

Auto DevOpsが使用するデプロイジョブテンプレートは、現在3つの環境名を定義しています:

  • review/ (で始まるすべての review/環境)。
  • staging
  • production

これらの環境はAuto Deployを使用するジョブに関連付けられます。そのため、環境スコープを除いて、異なるデプロイメントドメインを持つ必要があります。 上記のそれぞれについて、環境に応じて個別の変数KUBE_INGRESS_BASE_DOMAIN を定義する必要があります。

次の表は、3つの異なるクラスターを構成する方法の例です:

クラスター名 クラスター環境範囲 KUBE_INGRESS_BASE_DOMAIN 変数値 変数環境スコープ 備考
レビュー review/* review.example.com review/* すべてのレビューアプリを実行するレビュークラスター。* はワイルドカードで、review/で始まるすべての環境名で使用されます。
ステージング staging staging.example.com staging (オプション)ステージング環境のデプロイを実行するステージング・クラスター。最初に有効にする必要があります。
生産 production example.com production 本番環境のデプロイを実行するクラスター。インクリメンタルロールアウトを使用できます。

環境ごとに異なるクラスターを追加するには:

  1. プロジェクトの Operations > Kubernetesに移動します。
  2. 上の表から説明したように、それぞれの環境スコープでKubernetesクラスターを作成します。
  3. クラスタを作成したら、各クラスタに移動してIngressをインストールします。 IngressのIPアドレスが割り当てられるのを待ちます。
  4. 指定したAuto DevOpsドメインでDNSが設定されていることを確認してください。
  5. cloud-gear} Operations >Kubernetesから各クラスターのページに移動し、Ingress IPアドレスに基づいてドメインを追加します。

設定が完了したら、マージリクエストを作成し、review/* 環境スコープを持つ Kubernetes クラスターにアプリケーションがレビューアプリとしてデプロイされていることを確認することで、セットアップをテストできます。 同様に、他の環境も確認できます。

制限事項

以下の制限が適用されます。

非公開レジストリ対応

Auto DevOps で非公開コンテナレジストリを使用する文書化された方法は存在しません。 設定を簡素化し、予期せぬ問題を防ぐために、Auto DevOps で GitLab コンテナレジストリを使用することを強くお勧めします。

プロキシの背後にあるアプリケーションのインストール

GitLabのHelmインテグレーションは、プロキシ経由でのアプリケーションのインストールをサポートしていません。 プロキシ設定を行いたいユーザーは、PodPresetなどを使って、実行時にインストールポッドにプロキシ設定を注入する必要があります:

apiVersion: settings.k8s.io/v1alpha1
kind: PodPreset
metadata:
  name: gitlab-managed-apps-default-proxy
  namespace: gitlab-managed-apps
spec:
   env:
    - name: http_proxy
      value: "PUT_YOUR_HTTP_PROXY_HERE"
    - name: https_proxy
      value: "PUT_YOUR_HTTPS_PROXY_HERE"

トラブルシューティング

ビルドパックが選択できません

自動ビルドと自動テストでは、言語またはフレームワークの検出に失敗し、次のエラーが表示されることがあります:

Step 5/11 : RUN /bin/herokuish buildpack build
 ---> Running in eb468cd46085
    -----> Unable to select a buildpack
The command '/bin/sh -c /bin/herokuish buildpack build' returned a non-zero code: 1

考えられる理由は以下の通りです:

  • RubyアプリはGemfile.NET Frameworkなしで書くことができますが、正しく検出さ Gemfileれるには.NET Frameworkが必要です。
  • アプリケーションに対応するビルドパックが存在しない可能性があります。カスタムビルドパックを指定してみてください。

AutoDevOpsを拡張するパイプラインは、失敗のみ/失敗を除く

パイプラインが以下のメッセージで失敗した場合:

Found errors in your .gitlab-ci.yml:

  jobs:test config key may not be used with `rules`: only

このエラーは、インクルードされたジョブのルール設定がonly またはexcept 構文で上書きされている場合に表示されます。 この問題を解決するには、以下のいずれかを行う必要があります:

Kubernetesネームスペースの作成失敗

GitLab がプロジェクト用の Kubernetes ネームスペースとサービスアカウントを作成できない場合、Auto Deploy は失敗します。 この問題のデバッグについては、失敗したデプロイジョブのトラブルシューティングを参照してください。

既存の PostgreSQL データベースを検出しました。

GitLab 13.0 にアップグレードした後、Auto DevOps でデプロイする際にこのメッセージが表示されることがあります:

Detected an existing PostgreSQL database installed on the
deprecated channel 1, but the current channel is set to 2. The default
channel changed to 2 in of GitLab 13.0.
[...]

Auto DevOpsはデフォルトで、アプリケーションと一緒にクラスタ内のPostgreSQLデータベースをインストールします。 GitLab 13.0でデフォルトのインストール方法が変更され、既存のデータベースをアップグレードするにはユーザーの関与が必要になりました。 2つのインストール方法があります:

  • チャネル1(非推奨):関連するHelmチャートの依存関係としてデータベースを引き込みます。 バージョン1.15までのKubernetesバージョンのみをサポートします。
  • チャネル2(現在):独立したHelmチャートとしてデータベースをインストールします。 Kubernetesバージョン1.16以降でクラスタ内データベース機能を使用するために必要です。

このエラーが表示された場合は、次のいずれかのアクションを実行してください:

  • 警告を無視して、AUTO_DEVOPS_POSTGRES_CHANNEL1 に設定し、再デプロイすることで、安全にチャネル1の PostgreSQL データベースを使い続けることができます。

  • チャネル1のPostgreSQLデータベースを削除し、AUTO_DEVOPS_POSTGRES_DELETE_V1 を空でない値に設定して再デプロイすることで、新しいチャネル2のデータベースをインストールすることができます。

    危険:チャンネル 1 PostgreSQL データベースを削除すると、既存のチャンネル 1 データベースとそのすべてのデータが永久に削除されます。 データベースのバックアップとアップグレードの詳細については PostgreSQL のアップグレードを参照してください。
  • クラスタ内データベースを使用していない場合、POSTGRES_ENABLEDfalse に設定し、再デプロイすることができます。 このオプションは、チャート内のPostgreSQL依存関係を持たないカスタムチャートのユーザーに特に関連します。 データベースの自動検出は、リリースのpostgresql.enabled Helm値に基づいて行われます。この値は、チャートが変数を使用しているかどうかに関係なく、POSTGRES_ENABLED CI変数に基づいて設定され、Helmによって永続化されます。

危険:POSTGRES_ENABLEDPOSTGRES_ENABLED に設定すると、環境に存在するチャンネル1データベースが永久に削除されます。

開発者向けガイド

自動DevOpsのための開発者ガイド