GitLabを使ったCI/CD入門
このドキュメントでは、継続的インテグレーション、継続的デリバリー、継続的デプロイの概念の概要と、GitLab CI/CDを紹介します。
CI/CDを用いた開発手法の基礎
ソフトウェアの継続的な開発手法は、アプリケーションの開発中にエラーが発生する可能性を最小限にするために、スクリプトの実行を自動化することを基本にしています。新しいコードの開発からデプロイまで、人の介入が少なくて済む、あるいは全く介入しなくても済むようにしなければなりません。
小さなイテレーションごとにコードの変更を継続的にビルド、テスト、デプロイすることで、以前のバージョンで発生したバグやエラーが新しいコードで再発する可能性を減らすことができます。
この開発手法には大きく分けて3つのアプローチがあり、それぞれ自分の戦略に合ったものに合わせて適用していきます。
継続的インテグレーション
GitLabのGitリポジトリにコードが保存されているアプリケーションを考えてみましょう。開発者は毎日、1日に何度もコードの変更をプッシュしています。リポジトリへのプッシュごとに、アプリケーションにエラーが発生する可能性を減らすために、アプリケーションを自動的にビルド、テストするためのスクリプトを作成できます。
このプラクティスは 継続的インテグレーション として知られています。 アプリケーションのすべての変更(開発ブランチへの変更も含む)に対して、自動的・継続的に、ビルド・テストを実行します。これにより、導入された変更がアプリケーションに設定されたすべてのテスト、ガイドライン、およびコードコンプライアンス基準を確実に満たすようにします。
GitLabの開発自体で、ソフトウェア開発手法としての継続的インテグレーションを利用しています。プロジェクトにプッシュするたびに、コードをチェックする多数のスクリプトを実行しています。
継続的デリバリー
継続的デリバリーは、継続的インテグレーションの一歩先を行くものです。アプリケーションは、コードベースに変更がプッシュされるごとにビルド、テストされます。それだけではなく、手動でデプロイを開始するステップを追加して、継続的にデプロイされます。
この方法は、コードが自動的にチェックされることを保証します。しかし、必要に応じて手動でデプロイを開始するために、人の介入が必要です。
継続的デプロイ
継続的デプロイも継続的デリバリーと同様に、継続的インテグレーションの一歩先を行くものです。継続的デリバリーとの違いは、アプリケーションを手動でデプロイするのではなく、自動的にデプロイされるように設定することです。アプリケーションをデプロイするために、人の介入は全く必要ありません。
GitLab CI/CD入門
GitLab CI/CDはGitLabに組み込まれた強力なツールで、サードパーティ製のアプリケーションやインテグレーションを必要とせず、すべての継続的な開発手法(継続的インテグレーション、デリバリー、デプロイメント)をソフトウェアに適用できます。
概要については、最近のGitLab MeetupのGitLab CI入門を参照してください。
GitLab CI/CDの仕組み
GitLab CI/CDを使用するために必要なのは、Gitリポジトリでホストされているアプリケーションのコードベースと、リポジトリのルートにある.gitlab-ci.yml
というファイルでビルド、テスト、デプロイのスクリプトを指定することだけです。
このファイルでは、実行するスクリプト、インクルードやキャッシュの依存関係を定義します。また、コマンドを直列・並列に実行するかを定義でき、アプリをデプロイする場所を定義できます。さらに、デプロイスクリプトを自動的に実行するか、手動で起動するかを指定できます。GitLab CI/CDに慣れてきたら、設定ファイルにさらに高度なステップを追加できます。
ファイルにスクリプトを追加する前に、アプリケーションに適した順番で、実行したいテストに沿ったスクリプトを用意する必要があります。プロセスを可視化するために、設定ファイルに追加するスクリプトはすべて、コンピュータ上のターミナルで実行するコマンドと同じであることを想像してみてください。
設定ファイル .gitlab-ci.yml
をリポジトリに追加すると、GitLabがそれを検出して GitLab Runner というツールを使ってスクリプトを実行します。
スクリプトはジョブとしてグループ化され、パイプラインの構成要素となります。以下は、.gitlab-ci.yml
の最小限のサンプルファイルです。
before_script:
- apt-get install rubygems ruby-dev -y
run-test:
script:
- ruby --version
before_script
属性ではジョブを実行する前にアプリの依存関係をインストールし、run-test
という名前のジョブでは、現在のシステムのRubyのバージョンを表示します。
両方とも、リポジトリの任意のブランチにプッシュするたびに開始されるパイプラインを構成します。
GitLab CI/CDは、設定したジョブを実行するだけでなく、ターミナルで見るような実行中の様子も表示してくれます。
あなたはアプリケーションのテストやデプロイの戦略を作成して、それをGitLabのパイプラインで実行できます。パイプラインのステータスはGitLab上に表示されます。
さらに、何か問題があった場合は、簡単にすべての変更をロールバックできます。
基本的なCI/CDワークフロー
GitLab CI/CDが一般的な開発ワークフローにどのようにフィットするか、次の例を考えてみましょう。
課題でコードの実装を議論し、提案された変更についてローカルで作業したと仮定します。GitLabのリモートリポジトリにあるフィーチャーブランチにコミットをプッシュすると、プロジェクトのCI/CDパイプラインが起動します。そうすることで、GitLab CI/CDは以下のことを行ないます。
- 自動化されたスクリプトを(直列または並列に)実行します。
- アプリケーションをビルド、テストします。
- レビューアプリを使用してマージリクエストごとの変更を、
localhost
で表示するのと同じようにプレビューします。
実装に満足したら、以下を行ないます。
- コードレビューを受けて、承認をもらいます。
- フィーチャーブランチをデフォルトブランチにマージします。
- GitLab CI/CDは、あなたの変更を本番環境に自動的にデプロイします。
- さらに、何か問題が発生した場合は、簡単にそれをロールバックできます。
GitLab CI/CDはさらに多くのことができます。しかも、このワークフローはソフトウェアをデリバリーするために外部ツールを必要とせず、プロセス全体を追跡できます。 そして最も便利なのは、GitLabのUIを通してすべてのステップを可視化できることです。
CI/CDの基本的なワークフローを深堀り
基本的なワークフローを深く掘り下げてみると、下の図のようにDevOpsライフサイクルの各ステージで利用できるGitLabの機能を見ることができます。
画像を左から右に見てみると、各ステージ(Verify、Package、Release)ごとにGitLabで利用できる、いくつかの機能のあることがわかります。
-
Verify:
- 継続的インテグレーションでアプリケーションを自動的にビルド、テストします。
- GitLabコード品質でソースコードの品質を分析します。
- ブラウザパフォーマンステストでコード変更のパフォーマンスへの影響を判断します。
- コンテナの脆弱性スキャン、依存関係の脆弱性スキャン、JUnitテストなどの一連のテストを行ないます。
- レビューアプリ で変更をデプロイして、すべてのブランチでアプリの変更をプレビューします。
-
Package:
- コンテナレジストリを使用して、Dockerイメージを保存します。
- NPMレジストリを使用して、NPMパッケージを保存します。
- Mavenリポジトリ使用して、Mavenのアーティファクトを保存します。
- Conanリポジトリを使用して、Conanパッケージを保存します。
-
Release:
- 継続的デプロイでは、アプリケーションを本番環境に自動的にデプロイします。
- 継続的デリバリーでは、手動でデプロイボタンをクリックしてアプリケーションを本番環境にデプロイします。
- GitLab Pagesを使って静的なウェブサイトをデプロイします。
- カナリアデプロイメントを使用して、一部のPodにのみ機能をリリースし、指定した割合のユーザーベースに対して一時的にデプロイされた機能を有効にします。
- フィーチャーフラグで、デプロイした機能を制御します
- GitLabのリリースを使って、任意のGitタグにリリースノートを追加します。
- デプロイボードを使用して、Kubernetes上で実行されている各CI環境の現在の健全性とステータスを表示します。
- 自動デプロイを使用して、アプリケーションをKubernetesクラスターの本番環境にデプロイします。
GitLab CI/CDを使えば、以下のようなこともできます。
- Auto DevOpsでアプリケーションのライフサイクル全体を簡単に設定できます。
- アプリケーションをさまざまな環境にデプロイします。
- 独自のGitLab Runnerをインストールします。
- パイプラインをスケジュールします。
- セキュリティテストレポートでアプリの脆弱性をチェックします。
すべてのCI/CDの機能を表示するには、CI/CDのトップページに戻ります。
GitLab CI/CDの概要をより深く知ることができるGitLab CIのライブデモの動画をご覧ください。
初めてのGitLab CI/CDの設定
GitLab CI/CDを使い始めるには、.gitlab-ci.yml
の設定ファイルの構文とその属性に慣れる必要があります。
このドキュメントでは、GitLab Pagesを使用して静的なウェブサイトをデプロイすることで、GitLab CI/CDの概念を紹介しています。 GitLab Pagesのスクリプトをゼロから書きたいユーザー向けのドキュメントですが、GitLab CI/CDのセットアップ手順の紹介ドキュメントとしても使用できます。 CI/CDの設定ファイルを書くための最初の一般的なステップをカバーしています。GitLabのCI/CDのロジックを理解し、どんなアプリケーションにも対応できるように独自のスクリプトを書く(あるいは既存のスクリプトをカスタマイズする)方法を学ぶために、ぜひ一読することをお勧めします。
GitLab CI/CDの設定オプションの詳細については、.gitlab-ci.yml
の完全なリファレンスを確認してください。