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 Code Qualityでソースコードの品質を分析しましょう。
- ブラウザパフォーマンステストにより、コード変更によるパフォーマンスへの影響を判断します。
- コンテナスキャン 、依存性スキャン やJUnit テストなどの一連のテストを実行します。
- レビューアプリ で変更をデプロイして、すべてのブランチでアプリの変更をプレビューします。
-
Package:
- コンテナレジストリを使用して、Dockerイメージを保存します。
- NPMレジストリで npm パッケージを保存します。
- MavenリポジトリでMavenアーティファクトを保存します。
- Conanリポジトリを使ってConanのパッケージを保存します。
-
Release:
- 継続的デプロイでは、アプリケーションを本番環境に自動的にデプロイします。
- 継続的デリバリーでは、手動でデプロイボタンをクリックしてアプリケーションを本番環境にデプロイします。
- GitLab Pagesを使って静的なウェブサイトをデプロイします。
- Canaryデプロイを使用すると、一部のポッドのみに機能を配布し、一部のユーザーに一時的にデプロイされた機能を閲覧させることができます。
- 機能フラグの背後に機能をデプロイします。
- 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
の完全なリファレンスをご覧ください。