GitLabを使ったCI/CD入門

このドキュメントでは、継続的インテグレーション、継続的デリバリー、継続的デプロイの概念の概要と、GitLab CI/CDを紹介します。

すぐに使える管理システムは、ツールチェーンの保守に費やす時間を10%以上減らすことができます。 継続的な手法と、GitLabのビルトインCIがソフトウェア開発の簡素化とスケーリングにどのように役立つかを学ぶには、“Mastering continuous software development “ウェブキャストをご覧ください。

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は、設定したジョブを実行するだけでなく、ターミナルで見るような実行中の様子も表示してくれます。

job running

あなたはアプリケーションのテストやデプロイの戦略を作成して、それをGitLabのパイプラインで実行できます。パイプラインのステータスはGitLab上に表示されます。

pipeline status

さらに、何か問題があった場合は、簡単にすべての変更をロールバックできます。

rollback button

基本的なCI/CDワークフロー

GitLab CI/CDが一般的な開発ワークフローにどのようにフィットするか、次の例を考えてみましょう。

イシューでコードの実装を議論し、提案された変更についてローカルで作業したと仮定します。GitLabのリモートリポジトリにあるフィーチャーブランチにコミットをプッシュすると、プロジェクトのCI/CDパイプラインが起動します。そうすることで、GitLab CI/CDは以下のことを行ないます。

  • 自動化されたスクリプトを(直列または並列に)実行します。
    • アプリケーションをビルド、テストします。
    • レビューアプリで、マージリクエストごとの変更点を、localhostにあるようにプレビューできます。

実装に満足したら、以下を行ないます。

  • コードレビューを受けて、承認をもらいます。
  • フィーチャーブランチをデフォルトブランチにマージします。
    • GitLab CI/CDは、あなたの変更を本番環境に自動的にデプロイします。
  • さらに、何か問題が発生した場合は、簡単にそれをロールバックできます。

GitLab workflow example

GitLab CI/CDはさらに多くのことができます。しかも、このワークフローはソフトウェアをデリバリーするために外部ツールを必要とせず、プロセス全体を追跡できます。 そして最も便利なのは、GitLabのUIを通してすべてのステップを可視化できることです。

CI/CDの基本的なワークフローを深堀り

基本的なワークフローを深く掘り下げてみると、下の図のようにDevOpsライフサイクルの各ステージで利用できるGitLabの機能を見ることができます。

Deeper look into the basic CI/CD workflow

画像を左から右に見てみると、各ステージ(Verify、Package、Release)ごとにGitLabで利用できる、いくつかの機能のあることがわかります。

  1. Verify:
  2. Package:
  3. Release:
    • 継続的デプロイでは、アプリケーションを本番環境に自動的にデプロイします。
    • 継続的デリバリーでは、手動でデプロイボタンをクリックしてアプリケーションを本番環境にデプロイします。
    • GitLab Pagesを使って静的なウェブサイトをデプロイします。
    • Canaryデプロイを使用すると、一部のポッドのみに機能を配布し、一部のユーザーに一時的にデプロイされた機能を閲覧させることができます。
    • 機能フラグの背後に機能をデプロイします。
    • GitLabのリリースを使って、任意のGitタグにリリースノートを追加します。
    • Kubernetes 上で動作する各 CI 環境の現在の健全性とステータスをデプロイボードで表示します。
    • 自動デプロイを使用して、アプリケーションをKubernetesクラスターの本番環境にデプロイします。

GitLab CI/CDを使えば、以下のようなこともできます。

すべての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 の完全なリファレンスをご覧ください。