Contents
CI/CD自動化による開発効率向上
- 保守コストの削減: 手動で行っていた環境構築やテストを自動化することで、人件費と時間の無駄を減らすことができます
- コード品質の向上: 毎回の変更時に自動でテストが実行されることで、バグの早期発見が可能になります
- リリース頻度の増加: テスト通過後の自動デプロイにより、本番環境へのリリース頻度を上げることができます
コード変更時の即時ビルド・テスト実行
- GitLabでプッシュされたコードに対して、Jenkinsが自動的にビルド・テストを実施します。これにより、開発者自身も迅速なフィードバックを得られます
- 本番環境へのリリースタイミングの柔軟性が高まります
- 即時フィードバック: コード変更後数秒以内にエラーメッセージを表示できるため、修正の早期対応が可能です
Webhook設定の詳細手順
GitLabとJenkinsを連携するには、Webhook設定が必要です。この設定により、GitLabでのコード変更をJenkinsに通知し、自動でCI/CDパイプラインを実行させることができます。以下に具体的な手順を解説します。注意として、GitLab 15.0以上とJenkins 2.400以上が推奨です(古いバージョンでは挙動が異なる可能性があります)。
GitLab側でのWebhook設定
プロジェクトのSettings > Integrations画面で、以下を実施します。
- 通知先URLの指定: JenkinsサーバーのWebhook受信アドレスを入力
- 例:
http://jenkins.example.com/projectname/webhook/ - Secret Tokenの生成: アルファベット・数字・記号の組み合わせで、20文字以上を作成
- イベントタイプの選択: プッシュイベント(
Push events)やマージリクエスト(Merge request events)などが必要なイベントを指定
注意: Jenkinsサーバー側でのファイアウォール設定(ポート80/443)やHTTPS証明書の有効性を事前に確認してください。
Jenkins側でのWebhook受信設定
Jenkins管理画面(Manage Jenkins > Configure System)で以下を行います。
- Webhook URLの取得:
/github-webhook/など、独自のエンドポイントを作成 - Secret Tokenとの一致確認: GitLab側と同一のトークンを入力(大文字小文字を含むため注意)
- GitLabプラグインの有効化:
Manage Plugins > AvailableからGitLab Pluginをインストール
イベントタイプのフィルタリング
Webhook送信先のイベント種別を指定することで、不要なパイプライン実行を防ぎます。
| イベントタイプ | 説明 | 有効推奨 |
|---|---|---|
| Push events | ブランチへのプッシュ動作時の通知 | ○ |
| Merge request events | マージリクエスト受理時の通知 | △ |
| Tag push events | タグのプッシュ動作時の通知 | × |
補足:
Merge request eventsは、マージリクエストが承認されたタイミングでCI/CDを実行する際には有効ですが、一部バージョンでは不具合が報告されています。
Pipelineスクリプトの記述例
JenkinsでGitLabとの連携を実現するには、PipelineスクリプトにGitLabリポジトリ接続設定を記述します。ここではDeclarative Pipelineを基準としたサンプルコードを紹介します。
GitLabリポジトリ接続設定
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
pipeline { agent any stages { stage('Checkout') { steps { git url: 'https://gitlab.example.com/your-project.git', branch: 'main', credentialsId: 'gitlab-credentials' } } } } |
credentialsIdは、Jenkinsで登録したGitLab APIトークンを参照するためのIDです。
-gitステップでは、credentialsIdが指定された認証情報を自動的に使用します
- リポジトリURLにHTTPSとSSHの選択肢があり、セキュリティ上はSSHが推奨されます
Pipelineステージの構成例
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
stages { stage('Build') { steps { sh 'npm install' sh 'npm run build' } } stage('Test') { steps { sh 'npm test' } } stage('Deploy') { when { expression { env.BRANCH_NAME == 'main' } } steps { sh 'kubectl apply -f k8s-deploy.yaml' } } } |
ステージの実行条件:
-whenブロックで環境変数(例:BRANCH_NAME)をチェックし、特定のブランチでのみ実行できます
- テスト失敗時にも自動で終了するようにpostセクションでエラーハンドリングを記述
エラーハンドリングの記述方法
|
1 2 3 4 5 6 7 8 9 |
post { always { cleanWs() // 毎回作業ディレクトリをクリーンアップ } failure { slackSend channel: '#devops', message: "Pipeline failed on ${env.BRANCH_NAME}" } } |
補足:
-cleanWs()はワークスペースのリーク防止に有効です
- メッセージ送信先(Slackなど)やエラーレポート形式はチームごとにカスタマイズ可能
認証情報管理のベストプラクティス
JenkinsとGitLabの連携では、認証情報のセキュリティ管理が非常に重要です。 以下に、安全な保存方法と運用のポイントを解説します。
Jenkins Credential Storeの利用方法
- Credential Manager画面(
Manage Jenkins > Manage Credentials)でGitLab APIトークンやSSH鍵などを登録 - パイプラインスクリプト内で
credentialsIdを指定することで、Jenkinsが自動で認証情報を取得します
|
1 2 3 4 |
git url: 'https://gitlab.example.com/your-project.git', branch: 'main', credentialsId: 'gitlab-credentials' |
重要: パスワードやトークンは、Jenkins Credential Store以外に保存しないようにしてください
- 環境変数に記載するとリポジトリに漏洩のリスクがあります
GitLab APIトークンのセキュアな保存
- GitLab側でのAPIトークン発行は、「User Settings > Access Tokens」から実施します。
- 必要権限(例:
read_api)を最小限に設定し、定期的にローテーションしてください - APIトークンは、環境変数や
.gitconfigに保存せず、Jenkins Credential Store経由で管理するようにしてください
トラブルシューティングのポイント
連携中に発生する代表的なエラーとその対処法を解説します。
401認証失敗時の対処法
- 原因: Secret Tokenが一致していない、またはAPIトークンの権限不足
- 確認手順:
- GitLabとJenkinsのSecret Tokenが完全に一致しているか確認する(大文字小文字含む)
- APIトークンが
read_apiなどの必要権限を持っているかをGitLabで再確認する
Webhookイベントの受信確認手順
-
Jenkins側:
Manage Jenkins > Script Consoleから以下を実行し、Webhookリスナーの動作をチェックします
groovy
import hudson.model.*
def listener = Hudson.instance.getExtensionList("hudson.plugins.gitlab.GitLabPlugin").get(0)
println(listener.getWebHookUrl()) -
GitLab側: プロジェクト設定画面で
Integrations > Testボタンをクリックし、Webhookの送信テストを行います
Pipeline実行ログの読み方
Jenkinsのパイプラインログは「Build History」から確認可能です。
| 状況 | 表現例 | 対応方法 |
|---|---|---|
| 失敗時 | Error: Could not fetch from remote repo |
GitLabリポジトリのURLや認証情報を再確認 |
| 成功時 | Build finished with status: SUCCESS |
続行ステージ(Deployなど)を実施 |
補足: ログは「Advanced Project Options > Log」タブで詳細に確認可能。
他の注意点
- バージョン依存性:
- JenkinsのGitLabプラグイン(
gitlab-plugin)は、GitLab API v4を前提としています。GitLab <13.0では非対応です。 -
JenkinsのWebhook設定でHTTPSが必須な場合、Jenkinsサーバーに有効なSSL証明書が必要になります。
-
セキュリティ:
- Secret Tokenは、定期的な変更を推奨(例: 1か月ごと)
- GitLab側のAPIトークンも、ロールベースのアクセス制御(RBAC)で最小限の権限に設定してください