Contents
Jenkins パイプライン Docker 実装例をわかりやすく解説
DevOpsエンジニアやCI/CD導入を検討中の開発者にとって、JenkinsとDockerの統合パイプライン構築は必須スキルです。本記事では、宣言型パイプライン(Jenkinsfile)で実装する具体的な手順とコード例を紹介し、自社環境でのテストに活かせる知識をお届けします。
宣言型パイプラインの概要とJenkinsfileの基本構造
Jenkinsfileは、CI/CDプロセスをコードとして定義する設定ファイルです。宣言型パイプライン(Declarative Pipeline)は、ステージごとに処理を明確に分離し、リソース管理が容易になる特徴があります。
Jenkinsfileの定義と宣言型パイプラインの特徴
- pipelineブロック:全体の構造を定義する
- agent any:任意のマシンで実行可能に設定
- stagesブロック:ビルド・テスト・デプロイなどのステージを並べる
以下は基本構造のサンプルです:
|
1 2 3 4 5 6 7 8 9 10 11 |
pipeline { agent any stages { stage('Example') { steps { echo 'Hello World' } } } } |
このように、処理内容がコードに明記されることで、パイプラインの再現性と保守性が向上します。
Dockerイメージビルド・テスト・デプロイのステージ設計
DockerとJenkinsを連携させるには、ステージごとに処理を細分化するのが効果的です。以下に各ステップの実装例を紹介します。
ビルドステージの実装例
Dockerイメージのビルドはdocker buildコマンドで実行します。Dockerfileが存在するディレクトリを指定し、タグを付与します。
|
1 2 3 4 5 6 7 8 |
stage('Build Docker Image') { steps { script { docker.build("myapp:${env.BUILD_NUMBER}", ".") } } } |
このステップでは、ビルド番号に連動したイメージタグを生成することで、バージョン管理が可能です。
テストステージの自動化
ビルド後のテストはdocker runでコンテナを起動し、内部コマンドを実行します。
|
1 2 3 4 5 6 7 8 9 10 11 |
stage('Run Tests') { steps { script { def container = docker.build("myapp:${env.BUILD_NUMBER}") container.inside { sh 'npm test' } } } } |
テストに失敗するとパイプラインが停止するように、failFast: trueを設定することも可能です。
デプロイステージの手順
デプロイはDocker Hubにイメージをプッシュし、クラウド環境への配布を行います。以下はプッシュ処理の一例です:
|
1 2 3 4 5 6 7 8 9 10 |
stage('Push to Docker Hub') { steps { script { docker.withRegistry("hub.docker.com", 'docker-hub-credentials-id') { docker.image("myapp:${env.BUILD_NUMBER}").push() } } } } |
このステップでは、認証情報の安全な保存方法も重要です(後述)。
Docker Hubとの連携設定方法
Docker Hubにイメージをプッシュするには、Jenkinsで認証情報を安全に管理する必要があります。
認証情報の安全な保存方法
- Jenkins管理画面で「Credentials」→「Add Credentials」を選択
- ユーザー名とパスワード(またはトークン)を登録
docker.withRegistry()メソッド内でcredentials-idを指定して認証
この方法では、明文でパスワードを記載する必要がなく、セキュリティ体制が強化されます。
Pipeline実行時のよくあるトラブルシューティング
パイプラインの実行中に発生するエラーは、以下の通りです。それぞれの対応策を確認しましょう。
Dockerデーモン接続エラーの対処
エラーメッセージ例:
|
1 2 |
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running? |
- 解決策:
- Jenkins実行ユーザーが
dockerグループに所属しているか確認 sudo usermod -aG docker jenkinsで権限を追加
サンプルJenkinsfileのコードレビュー
以下は、記事で紹介するJenkinsfileの全文です。各ステージにはコメントが付き、実装ポイントが明確です。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
pipeline { agent any environment { DOCKER_REGISTRY = 'hub.docker.com' APP_NAME = 'myapp' } stages { stage('Checkout') { steps { git 'https://github.com/your-repo/myapp.git' } } stage('Build Docker Image') { steps { script { docker.build("${APP_NAME}:${env.BUILD_NUMBER}", ".") } } } stage('Run Tests') { steps { script { def container = docker.build("myapp:${env.BUILD_NUMBER}") container.inside { sh 'npm test' } } } } stage('Push to Docker Hub') { steps { script { docker.withRegistry("${DOCKER_REGISTRY}", 'docker-hub-credentials-id') { docker.image("${APP_NAME}:${env.BUILD_NUMBER}").push() } } } } } } |
まとめ
- Jenkinsfileの基本構造を理解し、ステージごとに処理を設計
- Dockerイメージのビルド・テスト・デプロイを連携させた実装例を紹介
- Docker Hubとの接続方法とセキュリティ対策を確認
- パイプライン実行時のトラブルシューティングポイントを解説
記事に掲載したJenkinsfileサンプルをGitHubで保存し、自社環境でのテストを試してみましょう。