GitLab CI/CDパイプライン入門|自動テスト環境の構築

GitLab CI/CDパイプライン入門|自動テスト環境の構築
GitLab CI/CDパイプラインを活用すれば、コードのビルド・テスト・デプロイを自動化し、開発効率を最大300%向上させられます。本記事では、初心者でも実践できるGitLab CI/CDの設定方法を、具体的な手順とサンプルコードで解説します。自動テスト環境の構築から本番デプロイまで、一貫したCI/CDワークフローを構築する方法を学びましょう。
GitLab CI/CDとは
GitLab CI/CD(Continuous Integration/Continuous Delivery)は、GitLabが提供する自動化フレームワークです。開発からテスト、デプロイまでの一連のプロセスを自動化し、ソフトウェア品質の向上とリリースサイクルの短縮を実現します。
GitLab CI/CDの主な特徴は以下の通りです:
- 統合環境:GitLabのリポジトリとCI/CDがシームレスに連携
- 柔軟な設定:YAML形式でパイプラインを定義可能
- スケーラビリティ:並列実行や依存関係の管理が容易
- セキュリティ:シークレット管理やアクセス制御機能
GitLab公式の調査によると、CI/CDを導入したチームは平均でリリース頻度が4倍向上し、バグ発見率が30%低下すると報告されています(出典: GitLab DevSecOps Survey 2023)。
CI/CDと従来の開発フロ…
| 従来の開発フロー | CI/CDを活用した開発フロー |
|---|---|
| 手動でテストを実行 | コードプッシュ時に自動テスト実行 |
| リリース前に手動でビルド | コード変更時に自動ビルド |
| リリースサイクルが長い | 小さな変更を頻繁にリリース |
| バグ発見が遅れる | 早期にバグを検出 |
CI/CD環境のセットアップ
GitLab CI/CDを開始するには、以下の準備が必要です:
1. GitLabアカウン…
GitLabの公式サイト(https://gitlab.com)から無料アカウントを作成します。個人利用であれば無料プランで十分ですが、プライベートリポジトリを使用する場合は有料プランが必要です。
2. プロジェクトの作成
GitLabにログイン後、以下の手順で新規プロジェクトを作成します:
- 右上の「New project」ボタンをクリック
- 「Create blank project」を選択
- プロジェクト名と可視性(Public/Private)を設定
- 「Create project」をクリック
3. Runnerのインス…
GitLab Runnerは、CI/CDジョブを実行するためのエージェントです。以下の手順でインストールします:
Linux(Ubuntu/Debian)へのインストール
# GitLab Runnerの公式リポジトリを追加
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" | sudo bash
GitLab Runnerをインストール
sudo apt-get install gitlab-runner
Runnerを登録
sudo gitlab-runner register
登録時に以下の情報を入力します:
- GitLab instance URL: https://gitlab.com
- Registration token: プロジェクトのSettings > CI/CD > Runners
- Description: 任意のRunner名
- Tags: 任意のタグ(例: docker, linux)
- Executor: docker(推奨)またはshell
Docker Executorの設定
Docker Executorを使用すると、各ジョブが独立したコンテナで実行されるため、環境の整合性が保たれます。以下の手順で設定します:
# Dockerをインストール
sudo apt-get update
sudo apt-get install -y docker.io
GitLab Runnerユーザーをdockerグループに追加
sudo usermod -aG docker gitlab-runner
GitLab Runnerを再起動
sudo systemctl restart gitlab-runner
4. 必要なツールのインス…
CI/CDパイプラインで使用するツールをRunnerにインストールします。一般的なツールは以下の通りです:
- Git
- Node.js(JavaScriptプロジェクトの場合)
- Python(Pythonプロジェクトの場合)
- Docker
- 各種テストツール(Jest, pytest, RSpecなど)
これらのツールは、.gitlab-ci.yml内で各ジョブのbefore_scriptセクションでインストールできます。
基本的なCI/CDパイプラインの作成
GitLab CI/CDパイプラインの核となるのが.gitlab-ci.ymlファイルです。このYAMLファイルでパイプラインの構成を定義します。
.gitlab-ci.ymlの設定方法
プロジェクトのルートディレクトリに.gitlab-ci.ymlファイルを作成します。以下は基本的な設定例です:
stages:
- test
- build
- deploy
test-job:
stage: test
script:
- echo "Running tests..."
- npm test # Node.jsプロジェクトの場合
build-job:
stage: build
script:
- echo "Building application..."
- npm run build
deploy-job:
stage: deploy
script:
- echo "Deploying to production..."
- ./deploy.sh
only:
- main
主要なセクションの説明
| セクション | 説明 | 例 |
|---|---|---|
| stages | パイプラインのステージを定義 | - test |
| job名 | ジョブの識別子 | test-job: |
| stage | ジョブが属するステージ | stage: test |
| script | 実行するコマンド | script: |
| only/except | 実行条件を指定 | only: |
ステージとジョブの定義
ステージはパイプラインの段階を表し、ジョブは各ステージで実行されるタスクです。ステージは以下の順序で実行されます:
- testステージ
- buildステージ
- deployステージ
各ステージ内のジョブは並列実行されます。ステージ間の依存関係は自動的に管理されます。
依存関係のあるジョブの定義
特定のジョブが他のジョブの成果物に依存する場合はneedsキーワードを使用します:
build-job:
stage: build
script:
- echo "Building application..."
artifacts:
paths:
- dist/
deploy-job:
stage: deploy
script:
- echo "Deploying..."
needs:
- job: build-job
artifacts: true
アーティファクトとキャッシュの活用
アーティファクトとキャッシュは、CI/CDパイプラインの効率を向上させる重要な機能です。
アーティファクト
アーティファクトは、ジョブの実行後に保存されるファイルやディレクトリです。他のジョブで使用できます。
test-job:
stage: test
script:
- npm test
artifacts:
paths:
- coverage/
reports:
junit: test-results.xml
一般的なアーティファクトの用途:
- テストカバレッジレポート
- ビルド成果物(dist/、build/)
- ドキュメント(docs/)
- テスト結果(JUnit形式)
キャッシュ
キャッシュは、ジョブ間で再利用できるファイルを保存します。主に依存関係のダウンロードを高速化します。
test-job:
stage: test
script:
- npm install
- npm test
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
キャッシュのベストプラクティス:
- キャッシュキーには
${CI_COMMIT_REF_SLUG}(ブランチ名)を使用 - 依存関係(node_modules/、vendor/)をキャッシュ
- 頻繁に変更されるファイルはキャッシュしない
応用テクニック
基本的なCI/CDパイプラインを構築したら、より高度なテクニックを活用してパイプラインを最適化しましょう。
Dockerとの連携
Dockerを活用すると、一貫した実行環境を提供し、依存関係の問題を解決できます。GitLab CI/CDでは、Dockerイメージを使用してジョブを実行できます。
カスタムDockerイメージの使用
独自のDockerイメージを使用するには、imageキーワードを指定します:
test-job:
stage: test
image: node:18
script:
- npm install
- npm test
Docker-in-Docker(DinD)の設定
ジョブ内でDockerコンテナを実行する場合は、Docker-in-Docker(DinD)を有効にします:
services:
- docker:dind
test-job:
stage: test
variables:
DOCKER_HOST: tcp://docker:2375
DOCKER_TLS_CERTDIR: ""
script:
- docker build -t my-app .
- docker run my-app npm test
Dockerイメージのビルドとプッシュ
アプリケーションのDockerイメージをビルドして、レジストリにプッシュする例です:
build-docker-image:
stage: build
image: docker:20.10
services:
- docker:dind
script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
- docker build -t $CI_REGISTRY_IMAGE:latest .
- docker push $CI_REGISTRY_IMAGE:latest
only:
- main
並列ジョブの実行
GitLab CI/CDでは、ジョブを並列実行することでパイプラインの実行時間を短縮できます。並列実行にはparallelマトリックスを使用します。
並列テストの実行
テストを並列実行する例です:
test:
stage: test
parallel:
matrix:
- TEST_GROUP: [1, 2, 3, 4]
script:
- npm test -- --group $TEST_GROUP
この設定では、4つの並列ジョブが実行され、各ジョブで異なるテストグループを実行します。GitLab Premiumを使用すると、最大50並列ジョブまで実行できます。
依存関係のある並列ジョブ
並列ジョブ間で依存関係がある場合はneedsを使用します:
build:
stage: build
script:
- npm run build
artifacts:
paths:
- dist/
test:
stage: test
parallel:
matrix:
- TEST_GROUP: [1, 2, 3]
script:
- npm test -- --group $TEST_GROUP
needs:
- job: build
artifacts: true
手動承認を要するデプロイ
本番環境へのデプロイなど、重要なジョブは手動承認を必要とする場合があります。GitLab CI/CDではwhen: manualを使用して手動ジョブを定義します。
deploy-production:
stage: deploy
script:
- ./deploy-to-production.sh
when: manual
only:
- main
手動ジョブは、GitLab UIのパイプライン画面から手動で実行する必要があります。承認が必要な場合は、rulesを使用して承認者を指定できます:
deploy-production:
stage: deploy
script:
- ./deploy-to-production.sh
when: manual
rules:
- if: $CI_COMMIT_REF_NAME == "main"
when: manual
allow_failure: false
セキュリティベストプラクティス
CI/CDパイプラインはソフトウェアの品質とセキュリティに大きな影響を与えます。以下のベストプラクティスに従って、セキュアなパイプラインを構築しましょう。
1. シークレットの管理
APIキー、パスワード、証明書などの機密情報は、.gitlab-ci.ymlファイルに直接記述してはいけません。GitLabのCI/CD変数機能を使用します。
CI/CD変数の設定
- プロジェクトのSettings > CI/CD > Variablesに移動
- 「Add variable」をクリック
- 変数名と値を入力(例:
DOCKER_PASSWORD) - Mask変数にチェックを入れて値を非表示にする
- Protect変数にチェックを入れてmainブランチでのみ使用可能にする
変数を.gitlab-ci.ymlで使用するには、$変数名または${変数名}の形式で記述します:
deploy-job:
stage: deploy
script:
- echo $DOCKER_PASSWORD | docker login -u $DOCKER_USER --password-stdin
2. 最小権限の原則
CI/CDジョブに与える権限は最小限に抑えます。例えば、本番環境へのデプロイには専用のデプロイキーを使用します。
専用のデプロイユーザーの作成
GitLab RunnerやCI/CDジョブに専用のユーザーを作成し、必要な権限のみを付与します。例えば、AWSの場合はIAMロールを使用します。
3. セキュリティテストの…
CI/CDパイプラインにセキュリティテストを組み込むことで、脆弱性を早期に発見できます。
SAST(Static Application Security Testing)
GitLab UltimateにはSAST機能が組み込まれており、コードの静的解析を行います。有効にするには.gitlab-ci.ymlに以下を追加します:
include:
- template: Security/SAST.gitlab-ci.yml
sast:
stage: test
Dependency Scanning
依存関係の脆弱性を検出するDependency ScanningもGitLab Ultimateで利用できます:
include:
- template: Security/Dependency-Scanning.gitlab-ci.yml
dependency_scanning:
stage: test
4. イメージの信頼性確保
使用するDockerイメージは公式のものを使用し、可能な限り最新のセキュリティパッチが適用されたものを選択します。
イメージの検証
カスタムイメージを使用する場合は、以下の手順で検証します:
- 公式のベースイメージから作成されたイメージか確認
- 必要なパッケージのみインストールされているか確認
- rootユーザーで実行しないように設定
FROM node:18-alpine
rootユーザーで実行しない
USER node
必要なパッケージのみインストール
RUN npm install --production
アプリケーションを実行
CMD ["npm", "start"]
トラブルシューティング
CI/CDパイプラインの実行中に発生する一般的な問題とその解決方法を紹介します。
1. ジョブが失敗する
ジョブが失敗する主な原因と対処法:
| 原因 | 対処法 |
|---|---|
| コマンドの実行に失敗 | ジョブのログを確認し、エラーメッセージを特定 |
| タイムアウト | timeoutキーワードでタイムアウト時間を延長 |
| メモリ不足 | Runnerのリソースを増強またはジョブを軽量化 |
| 依存関係の不足 | before_scriptで依存関係をインストール |
ジョブログの確認方法
- GitLab UIでパイプラインを開く
- 失敗したジョブをクリック
- 「Job log」タブで詳細なログを確認
2. アーティファクトが見…
アーティファクトが見つからない場合の原因と対処法:
- 原因1:ジョブが失敗した
- アーティファクトは成功したジョブでのみ保存される
- 失敗したジョブのアーティファクトは保存されない
- 原因2:パスが間違っている
artifacts.pathsで指定したパスが正しいか確認- ジョブの実行ディレクトリ(通常
/builds/...)からの相対パスを使用 - 原因3:ストレージ容量の制限
- GitLabのストレージ制限に達している可能性あり
- 管理者にストレージ容量の拡張を依頼
3. Runnerがジョブ…
Runnerがジョブを実行しない場合の原因と対処法:
- 原因1:Runnerがオフライン
- Runnerのステータスを確認(
sudo gitlab-runner verify) - Runnerを再起動(
sudo systemctl restart gitlab-runner) - 原因2:タグが一致しない
- ジョブにタグが指定されている場合、Runnerも同じタグを持っている必要あり
- Runnerの登録時にタグを設定
- 原因3:ジョブの条件に一致しない
onlyやexceptの条件を確認- ブランチ名やタグ名が正しいか確認
4. キャッシュが効かない
キャッシュが効かない場合の原因と対処法:
- 原因1:キャッシュキーが異なる
- キャッシュキーが変更されると新しいキャッシュが作成される
cache.keyを固定値にするか、${CI_COMMIT_REF_SLUG}を使用- 原因2:キャッシュのパスが間違っている
cache.pathsで指定したパスが正しいか確認- ジョブの実行ディレクトリからの相対パスを使用
- 原因3:キャッシュが期限切れ
- GitLabのデフォルトではキャッシュは1週間で期限切れ
cache:policy:pullを使用してキャッシュを更新
よくある質問
Q1. GitLab CI…
GitLab CI/CDとGitHub Actionsの主な違いは以下の通りです:
| 機能 | GitLab CI/CD | GitHub Actions |
|---|---|---|
| 統合環境 | GitLabと完全に統合 | GitHubと統合 |
| Runnerの管理 | 独自のRunnerを管理可能 | GitHub-hosted Runnerと独自Runner |
| ストレージ | 無料プランで10GB | 無料プランで500MB |
| 価格 | 無料プランあり(制限あり) | 無料プランあり(制限あり) |
| セキュリティ機能 | SAST、Dependency Scanningなど | CodeQL、Dependabotなど |
GitLab CI/CDはGitLabとの統合が強く、特にGitLabを使用しているチームに適しています。GitHub ActionsはGitHubリポジトリとの統合が強く、GitHubを使用しているチームに適しています。
Q2. CI/CDパイプラ…
CI/CDパイプラインの実行時間を短縮するための具体的な方法を紹介します:
- 並列実行の活用
- 独立したジョブは
parallelマトリックスで並列実行 - GitLab Premiumを使用すると最大50並列ジョブまで実行可能
- 独立したジョブは
- キャッシュの最適化
- 依存関係(node_modules/、vendor/)をキャッシュ
- キャッシュキーには
${CI_COMMIT_REF_SLUG}を使用 - 頻繁に変更されるファイルはキャッシュしない
- 軽量なDockerイメージの使用
- Alpine Linuxベースのイメージを使用
- 必要なパッケージのみインストール
- ステージの最適化
- 必須のジョブのみ実行するように
rulesを設定 - テストやビルドなど、実行時間の長いジョブを並列化
- 必須のジョブのみ実行するように
- Runnerのリソース増強
- CPUやメモリを増強したRunnerを使用
- オンプレミスのRunnerを使用してネットワーク遅延を軽減
GitLabの調査によると、これらの最適化により平均でパイプラインの実行時間を60%短縮できると報告されています(出典: GitLab CI/CD Best Practices)。
Q3. CI/CDパイプラ…
CI/CDパイプラインでDockerを使用する主なメリットは以下の通りです:
- 一貫した実行環境
- 開発環境、テスト環境、本番環境で同じ環境を使用
- 依存関係の問題を解決
- 隔離された実行
- 各ジョブが独立したコンテナで実行される
- ジョブ間の干渉を防止
- 高速な起動
- Dockerコンテナは軽量で高速に起動
- 従来の仮想マシンよりも高速
- セキュリティの向上
- rootユーザーで実行しないように設定可能
- コンテナ間のネットワーク隔離
- 再現性の向上
- Dockerfileで環境を定義可能
- 環境のバージョン管理が容易
GitLabの公式ドキュメントによると、Dockerを使用したCI/CDパイプラインは、従来の方法と比較して平均で40%高速に実行できるとされています(出典: GitLab Docker Integration)。
Q4. CI/CDパイプラ…
CI/CDパイプラインで使用するDockerイメージのベストプラクティスを紹介します:
- 公式イメージを使用する
- 可能な限り公式のDockerイメージを使用
- 例:
node:18、python:3.11、alpine:latest
- 軽量なイメージを選択する
- Alpine Linuxベースのイメ【編集・制作ポリシー】
本記事はRoute Bloom編集部が各ベンダー公式ドキュメント・エンジニア監修をもとに作成しています。インフラ・クラウド構築は環境により異なります。本番環境への適用前に必ずテストを実施してください。情報の正確性には万全を期していますが、最新情報は各公式ドキュメントをご確認ください。ABOUT ME
- Alpine Linuxベースのイメ




