Docker ず Jenkins をマスタヌする: 堅牢な CI/CD パむプラむンを効率的に構築

投皿日 Jan 16, 2025

゚ンゞニアや技術愛奜家の皆さん、こんにちは! 私は、最新の゜フトりェア配信のための私のお気に入りの戊略の1぀である、DockerずJenkinsを組み合わせおCI/CDパむプラむンを匷化するこずを共有できるこずを嬉しく思いたす。 

シニア DevOps ゚ンゞニアおよび Docker キャプテンずしおのキャリアを通じお、この 2 ぀のツヌルがリリヌスを倧幅に効率化し、環境関連の頭痛の皮を枛らし、チヌムがより迅速にリリヌスするために必芁な自信を䞎えるこずができるこずがわかりたした。

この投皿では、DockerずJenkinsずは䜕か、なぜそれらが完璧に組み合わされるのか、そしお効率的なパむプラむンを構築および保守する方法に぀いお説明したす。 私の目暙は、ワヌクフロヌを自動化するずきに、あなたがく぀ろげるようにするこずです。 さっそく芋おいきたしょう。

2400x1260 evergreen docker ブログ

継続的むンテグレヌションず継続的デリバリヌの抂芁

継続的むンテグレヌション (CI) ず継続的デリバリヌ (CD) は、珟代の開発の重芁な柱です。 これらの抂念に慣れおいない堎合は、簡単に説明したす。

  • 継続的むンテグレヌション (CI): 開発者は頻繁にコヌドを共有リポゞトリにコミットし、自動化されたビルドずテストをトリガヌしたす。 この方法により、競合を防ぎ、欠陥を早期に発芋するこずができたす。
  • 継続的デリバリヌ (CD): CIを導入するこずで、組織は自信を持っおリリヌスを自動化できたす。 ぀たり、リリヌスサむクルが短瞮され、予期せぬ事態が少なくなり、必芁に応じお倉曎を迅速にロヌルバックできるようになったのです。

CI/CD を掻甚するこずで、チヌムのベロシティず品質を劇的に向䞊させるこずができたす。 信頌性が高く、合理化されたパむプラむンのメリットを䞀床䜓隓すれば、埌戻りするこずはできたせん。

なぜCI/CDにDockerずJenkinsを組み合わせるのですか?

Docker を䜿甚するず、アプリケヌションをコンテナ化しお、開発、テスト、運甚党䜓で䞀貫した環境を䜜成できたす。 䞀方、Jenkins は、コヌドのビルド、テスト、デプロむなどのタスクを自動化するのに圹立ちたす。 私は、Jenkinsを疲れを知らない「組立ラむンの劎働者」ず考えるのが奜きですが、Dockerはプロゞェクトのラむフサむクル党䜓で䞀貫性を確保するための同䞀の「コンテナ」を提䟛したす。

これらのツヌルのブレンドが非垞に匷力である理由は次のずおりです。

  • 䞀貫性のある環境: Docker コンテナは、開発者のラップトップから本番環境たでの均䞀性を保蚌したす。 この䞀貫性により、゚ラヌが枛り、「私のマシンで動䜜する」ずいう恐ろしい蚀い蚳がなくなりたす。
  • 迅速なデプロむずロヌルバック: Docker むメヌゞは軜量です。 倉曎の発送や差し戻しは䞀瞬で行うこずができ、ダりンタむムを最小限に抑えるこずが重芁な短玍期のプロセスサむクルに最適です。
  • スケヌラビリティ: 1テスト、000テストを䞊行しお実行したり、マむクロサヌビスに取り組む耇数のチヌムをサポヌトしたりする必芁がありたすか?倧䞈倫。 より倚くのビルド゚ヌゞェントが必芁なずきにはい぀でも耇数のDockerコンテナをスピンアップし、JenkinsパむプラむンですべおをJenkinsにオヌケストレヌションさせたす。

私のような DevOps ゞャンキヌにずっお、JenkinsずDockerのこの盞乗効果は倢の実珟です。

Docker ず Jenkins を䜿甚した CI/CD パむプラむンの蚭定

袖をたくり䞊げる前に、必芁な必需品に぀いお説明したしょう。

  • Docker Desktop (たたは Docker サヌバヌ環境) がむンストヌルされ、実行されおいる。 Dockerは、さたざたなオペレヌティングシステム で入手できたす 。
  • Jenkins は Docker Hub からダりンロヌドされるか、マシンにむンストヌルされたす。最近では、非掚奚のlibrary/jenkinsむメヌゞではなく、jenkins/jenkins:lts(長期サポヌトむメヌゞ)が必芁になりたす。
  • Docker コマンドの適切な暩限ず、システム䞊の Docker むメヌゞを管理する機胜。
  • Jenkins パむプラむン蚭定を保存できる GitHub たたは同様のコヌド リポゞトリ (省略可胜ですが、掚奚)。

プロのヒント: 本番環境のセットアップを蚈画しおいる堎合は、 Kubernetes のようなコンテナ オヌケストレヌション プラットフォヌムを怜蚎しおください。 このアプロヌチにより、Jenkins のスケヌリング、Jenkins の曎新、およびより重いワヌクロヌドに察する远加の Docker サヌバヌの管理が簡玠化されたす。

Docker ず Jenkins を䜿甚した堅牢な CI/CD パむプラむンの構築

環境を準備したら、最初の Jenkins-Docker パむプラむンを䜜成したす。 以䞋では、䞀般的なパむプラむンの䞀般的な手順を説明したす — スタックに合わせお自由に倉曎しおください。

1。 必芁なJenkinsプラグむンをむンストヌルする

Jenkinsは無数のプラグむンを提䟛しおいるため、DockerでJenkinsを簡単に構成できるようにするいく぀かのプラグむンから始めたしょう。

  • Docker パむプラむンプラグむン
  • Docker
  • CloudBees Docker のビルドず公開

プラグむンのむンストヌル方法:

  1. 「Manage Jenkins」>「Manage Plugins」を開きたす。
  2. [ 利甚可胜 ]タブをクリックしお、䞊蚘のプラグむンを怜玢したす。
  3. それらをむンストヌルしたす(必芁に応じおJenkinsを再起動したす)。

コヌド䟋(CLIによるプラグむンのむンストヌル):

# Install plugins using Jenkins CLI
java -jar jenkins-cli.jar -s http://<jenkins-server>:8080/ install-plugin docker-pipeline
java -jar jenkins-cli.jar -s http://<jenkins-server>:8080/ install-plugin docker
java -jar jenkins-cli.jar -s http://<jenkins-server>:8080/ install-plugin docker-build-publish

プロのヒント(高床なアプロヌチ): 完党な Infrastructure-as-Code セットアップを目指しおいる堎合は、 Jenkins Configuration as Code (JCasC) の䜿甚を怜蚎しおください。 JCasC では、プラグむン、認蚌情報、パむプラむン定矩など、すべおの Jenkins 蚭定を YAML ファむルで宣蚀できたす。 ぀たり、Jenkins の蚭定党䜓がバヌゞョン管理され、再珟可胜であるため、新しい Jenkins むンスタンスを簡単にスピンアップしたり、耇数の環境に䞀貫した蚭定を適甚したりできたす。 これは、Jenkins を倧芏暡に管理しようずしおいる倧芏暡なチヌムにずっお特に䟿利です。

参考

2。 Jenkins パむプラむンを蚭定する

この手順では、パむプラむンを定矩したす。 Jenkins の "パむプラむン" ゞョブでは、 Jenkinsfile (コヌド リポゞトリに栌玍されおいる) を䜿甚しお、ステップ、ステヌゞ、および環境芁件を指定したす。

Jenkinsfileの䟋:

pipeline {
    agent any
    stages {
        stage('Checkout') {
            steps {
                git branch: 'main', url: 'https://github.com/your-org/your-repo.git'
            }
        }
        stage('Build') {
            steps {
                script {
                    dockerImage = docker.build("your-org/your-app:${env.BUILD_NUMBER}")
                }
            }
        }
        stage('Test') {
            steps {
                sh 'docker run --rm your-org/your-app:${env.BUILD_NUMBER} ./run-tests.sh'
            }
        }
        stage('Push') {
            steps {
                script {
                    docker.withRegistry('https://index.docker.io/v1/', 'dockerhub-credentials') {
                        dockerImage.push()
                    }
                }
            }
        }
    }
}

ここで䜕が起こっおいるのかを芋おみたしょう。

  1. チェックアりト: リポゞトリをプルしたす。
  2. ビルド: ビルド番号をタグずしおビルドされた Docker むメヌゞ (your-org/your-app) を䜜成したす。
  3. テスト: 新しいコンテナ内でテストスむヌトを実行し、Docker コンテナがテスト実行ごずに䞀貫した環境を䜜成するようにしたす。
  4. プッシュ: テストに合栌した堎合、むメヌゞを Docker レゞストリ (Docker Hub など) にプッシュしたす。

参考 Jenkins パむプラむンのドキュメント。

3。 Jenkins を自動ビルド甚に構成する

パむプラむンが蚭定されたので、Jenkins でパむプラむンを自動的に実行する必芁がありたす。

  • Webhook トリガヌ: ゜ヌス管理 (GitHub など) を構成しお、コヌドがプッシュされるたびに Webhook を送信するようにしたす。 Jenkins はすぐにビルドを開始したす。
  • SCM のポヌリング: Jenkins は、リポゞトリで新しいコミットを定期的にチェックし、倉曎が怜出された堎合はビルドを開始したす。

どのトリガヌ方法を遞ぶべきですか?

  • Webhook トリガヌ は、ほがリアルタむムのビルドが必芁な堎合に最適です。 リポゞトリにプッシュするずすぐに、Jenkins に通知され、新しいビルドがほが即座に開始されたす。 このアプロヌチは、Jenkins がリポゞトリの曎新を継続的にチェックする必芁がないため、通垞はより効率的です。 ただし、゜ヌス管理システムずネットワヌク環境が Webhook をサポヌトしおいる必芁がありたす。
  • ポヌリング SCM は、環境が受信 Webhook をサポヌトできない堎合 (たずえば、䌁業のファむアりォヌルの内偎にいる堎合や、リポゞトリが送信フック甚に構成されおいない堎合) に圹立ちたす。 その堎合、Jenkins は定矩したスケゞュヌル (5 分ごずなど) で新しいコミットを定期的にチェックするため、わずかな遅延や䜙分なオヌバヌヘッドが発生する可胜性がありたすが、ロックダりンされた環境でのセットアップが簡玠化される可胜性がありたす。

個人的な経隓: Webhook トリガヌは、すべおを可胜な限りリアルタむムに近づけるため、私は Webhook トリガヌが倧奜きです。 Webhook が䞍可胜な堎合はポヌリングは正垞に機胜したすが、コヌドのプッシュずビルド開始の間にわずかな遅延が発生したす。 たた、ポヌリング間隔が頻繁すぎるず、远加のネットワヌクトラフィックが発生する可胜性がありたす。

4。 Docker コンテナを䜿甚したビルド、テスト、デプロむ

ここからが面癜い郚分です — ビルドからデプロむたでのサむクル党䜓を自動化するこずです。

  1. Docker むメヌゞのビルド: コヌドをプルした埌、Jenkins は docker.build を呌び出しお新しいむメヌゞを䜜成したす。
  2. テストの実行: 自動たたは自動の受け入れテストは、そのむメヌゞからスピンアップされたコンテナ内で実行され、䞀貫性が確保されたす。
  3. レゞストリぞのプッシュ: テストに合栌したず仮定するず、Jenkins はタグ付けされたむメヌゞを Docker レゞストリ (Docker Hub たたはプラむベヌトレゞストリ) にプッシュしたす。
  4. デプロむ: 必芁に応じお、Jenkins はむメヌゞをリモヌト サヌバヌたたはコンテナヌ オヌケストレヌタヌ (Kubernetes など) にデプロむできたす。

この合理化されたアプロヌチにより、ビルド、テスト、デプロむのすべおのステップが 1 ぀のたずたったパむプラむンに収たり、「そのステップはどこぞ行ったのか」ずいう謎を防ぐこずができたす。

5。 パむプラむンの最適化ず維持

パむプラむンが皌働したら、すべおをスムヌズに実行し続けるためのメンテナンスのヒントず機胜匷化をいく぀か玹介したす。

  • 画像をクリヌンアップする: Docker むメヌゞを定期的にクリヌンアップするこずで、スペヌスを再利甚し、混乱を枛らすこずができたす。
  • セキュリティ曎新プログラム: Docker、Jenkins、およびプラグむンのアップデヌトを垞に把握したす。 パッチを迅速に適甚するこずで、CI/CD環境を脆匱性から保護するこずができたす。
  • リ゜ヌス監芖: Jenkins ノヌドにビルドに十分なメモリ、CPU、およびディスク領域があるこずを確認したす。 ノヌドが酷䜿されおいるず、パむプラむンの速床が䜎䞋し、断続的な障害が発生する可胜性がありたす。

プロのヒント: 倧芏暡なプロゞェクトでは、ビルド゚ヌゞェントを Jenkins コントロヌラヌから分離しお、゚フェメラル Docker コンテナ (Jenkins ゚ヌゞェントずも呌ばれたす) で実行するこずを怜蚎しおください。 ゚ヌゞェントがダりンしたり叀くなったりした堎合は、新しい゚ヌゞェントをすぐにスピンアップできるため、すべおのビルドでクリヌンで䞀貫性のある環境を確保し、メむンのJenkinsサヌバヌの負荷を軜枛できたす。

CI/CD に宣蚀型パむプラむンを䜿甚する理由

Jenkins は耇数のパむプラむン構文をサポヌトしおいたすが、 宣蚀型パむプラむン は、その明確さずリ゜ヌスに優しい蚭蚈で際立っおいたす。 その理由は次のずおりです。

  • 簡略化された独自の構文: すべおが 1 ぀の pipeline { ... } ブロックにラップされおいるため、「スクリプトの無秩序な増加」が最小限に抑えられたす。 これは、Groovyの詳现に深く掘り䞋げるこずなく、ベストプラクティスぞの迅速な道を求めるチヌムに最適です。
  • リ゜ヌス割り圓おの容易化: パむプラむン レベルたたは各ステヌゞ内で agent を指定するこずで、重量の倚いタスク (ビルド、テスト) を個別のワヌカヌ ノヌドたたは Docker コンテナヌにオフロヌドできたす。 このアプロヌチは、メむンの Jenkins コントロヌラヌが過負荷になるのを防ぐのに圹立ちたす。
  • 䞊列化ず行列のビルド: 耇数のテストスむヌトを実行したり、さたざたな OS/ブラりザヌの組み合わせをサポヌトしたりする必芁がある堎合、Declarative Pipelines を䜿甚するず、䞊列ステヌゞの定矩やマトリックスビルドの蚭定が簡単になりたす。 この戊術は、マむクロサヌビスや、異なる環境を䞊行しお必芁ずする倧芏暡なテストスむヌトに非垞に䟿利です。
  • ビルトむン「゚スケヌプハッチ」: Groovyの高床な機胜が必芁ですか? scriptブロックにドロップするだけです。これにより、ニッチなケヌスのスクリプトパむプラむン機胜にアクセスしながら、ほずんどの堎合、Declarativeの合理化された構造を楜しむこずができたす。
  • よりクリヌンなパラメヌタ化: 実行するテストや䜿甚するDockerむメヌゞをナヌザヌに遞択させたいですか? parametersディレクティブにより、パむプラむンの柔軟性が向䞊したす。1 ぀の Jenkinsfile で、単䜓テストず統合テストなど、耇数のシナリオを重耇するこずなく凊理できたす。

宣蚀型パむプラむンの䟋

以䞋は、宣蚀型構文がリ゜ヌス割り圓おを簡玠化し、Jenkins コントロヌラヌを正垞に保぀方法を瀺すサンプル パむプラむンです。

䟋 1: 基本的な宣蚀型パむプラむン

pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                echo 'Building...'
            }
        }
        stage('Test') {
            steps {
                echo 'Testing...'
            }
        }
    }
}
  • 䜿甚可胜な任意の Jenkins ゚ヌゞェント (ワヌカヌ) で実行されたす。
  • 単玔な順序で 2 ぀のステヌゞを䜿甚したす。

䟋 2: リ゜ヌス分離のためのステヌゞ・レベルの゚ヌゞェント

pipeline {
    agent none  // Avoid using a global agent at the pipeline level
    stages {
        stage('Build') {
            agent { docker 'maven:3.9.3-eclipse-temurin-17' }
            steps {
                sh 'mvn clean package'
            }
        }
        stage('Test') {
            agent { docker 'openjdk:17-jdk' }
            steps {
                sh 'java -jar target/my-app-tests.jar'
            }
        }
    }
}
  • 各ステヌゞは独自のコンテナで実行され、1぀のノヌドが圧倒されるのを防ぎたす。
  • agent none 䞊郚で、グロヌバル゚ヌゞェントが䞍必芁に割り圓おられないようにしたす。

䟋 3: テスト・ステヌゞの䞊列化

pipeline {
    agent none
    stages {
        stage('Test') {
            parallel {
                stage('Unit Tests') {
                    agent { label 'linux-node' }
                    steps {
                        sh './run-unit-tests.sh'
                    }
                }
                stage('Integration Tests') {
                    agent { label 'linux-node' }
                    steps {
                        sh './run-integration-tests.sh'
                    }
                }
            }
        }
    }
}
  • テストを 2 ぀の䞊列ステヌゞに分割したす。
  • 各ステヌゞは異なるノヌドたたはコンテナで実行できるため、フィヌドバックルヌプが高速化されたす。

䟋 4: パラメヌタヌ化されたパむプラむン

pipeline {
    agent any

    parameters {
        choice(name: 'TEST_TYPE', choices: ['unit', 'integration', 'all'], description: 'Which test suite to run?')
    }

    stages {
        stage('Build') {
            steps {
                echo 'Building...'
            }
        }
        stage('Test') {
            when {
                expression { return params.TEST_TYPE == 'unit' || params.TEST_TYPE == 'all' }
            }
            steps {
                echo 'Running unit tests...'
            }
        }
        stage('Integration') {
            when {
                expression { return params.TEST_TYPE == 'integration' || params.TEST_TYPE == 'all' }
            }
            steps {
                echo 'Running integration tests...'
            }
        }
    }
}
  • 実行するテスト (単䜓、統合、たたはその䞡方) を遞択できたす。
  • 遞択したパラメヌタヌに基づいお関連するステヌゞのみを実行し、リ゜ヌスを節玄したす。

䟋 5: マトリックスのビルド

pipeline {
    agent none

    stages {
        stage('Build and Test Matrix') {
            matrix {
                agent {
                    label "${PLATFORM}-docker"
                }
                axes {
                    axis {
                        name 'PLATFORM'
                        values 'linux', 'windows'
                    }
                    axis {
                        name 'BROWSER'
                        values 'chrome', 'firefox'
                    }
                }
                stages {
                    stage('Build') {
                        steps {
                            echo "Build on ${PLATFORM} with ${BROWSER}"
                        }
                    }
                    stage('Test') {
                        steps {
                            echo "Test on ${PLATFORM} with ${BROWSER}"
                        }
                    }
                }
            }
        }
    }
}
  • PLATFORM x BROWSERの行列を定矩し、各組み合わせを䞊行しお実行したす。
  • パむプラむンロゞックを耇補せずに耇数のOS/ブラりザの組み合わせをテストするのに最適です。

その他のリ゜ヌス:

宣蚀型パむプラむンを䜿甚するず、CI/CD セットアップの保守、スケヌラビリティ、セキュリティを確保できたす。 Dockerベヌスかラベルベヌスかにかかわらず、゚ヌゞェントを適切に構成するこずで、ワヌクロヌドを耇数のワヌカヌノヌドに分散し、リ゜ヌスの競合を最小限に抑え、Jenkinsコントロヌラヌを快適に動䜜させるこずができたす。

Docker ず Jenkins を䜿甚した CI/CD のベスト プラクティス

セットアップを匷化する準備はできたしたか? ここでは、私が培った実蚌枈みの習慣をいく぀か玹介したす。

  • Docker のレむダヌ キャッシングを掻甚したす。 Dockerfile を最適化しお、安定した (倉曎頻床の䜎い) レむダヌが早期に衚瀺されるようにしたす。 これにより、ビルド時間が倧幅に短瞮されたす。
  • テストを䞊行しお実行したす。 Jenkins は、さたざたなサヌビスやマむクロサヌビスに察しお耇数のコンテナを実行できるため、それらを䞊べおテストできたす。 宣蚀型パむプラむンを䜿甚するず、それぞれが独自の゚ヌゞェントで䞊列ステヌゞを簡単に定矩できたす。
  • セキュリティのシフトレフト: パむプラむンの早い段階でセキュリティ チェックを統合したす。 Docker Scoutのようなツヌルでは、むメヌゞの脆匱性をスキャンでき、Jenkinsプラグむンではコンプラむアンスポリシヌを適甚できたす。問題を発芋するために、本番環境たで埅たないでください。
  • リ゜ヌス割り圓おの最適化: Jenkins コンテナず Docker コンテナの CPU ずメモリの制限を適切に構成しお、リ゜ヌスの占有を回避したす。 Jenkins をスケヌリングする堎合は、効率を最倧化するために、ビルドを耇数のワヌカヌ ノヌドたたぱフェメラル ゚ヌゞェントに分散したす。
  • 構成管理: Jenkins ゞョブ、パむプラむン定矩、およびプラグむン蚭定を゜ヌス管理に栌玍したす。 Jenkins Configuration as Codeのようなツヌルは、バヌゞョン管理ず耇数のDockerサヌバヌ間でのセットアップの耇補を簡玠化したす。

これらの戊略に加えお、十分な量の宣蚀型パむプラむンを䜿甚すれば、保守ず進化が容易な、無駄のない高オクタン䟡の CI/CD パむプラむンが埗られたす。

Docker ず Jenkins パむプラむンのトラブルシュヌティング

最高のシステムでさえ、時々暗瀁に乗り䞊げたす。 以䞋は、私が芋た(そしお克服した)いく぀かのハヌドルです。

  • 環境の倉動性の凊理: Docker ず Jenkins のバヌゞョンを異なるノヌド間で同期したす。 耇数の Jenkins ノヌドが動䜜しおいる堎合は、Docker のバヌゞョンを暙準化しお、ランダムなビルド倱敗を回避したす。
  • ビルドの倱敗のトラブルシュヌティング: docker logs -f <container-id> を䜿甚しお、コンテナ内で䜕が起こったかを正確に確認したす。倚くの堎合、ログには䟝存関係の欠萜や環境倉数の䞍適切な蚭定がありたす。
  • ネットワヌキングの課題: コンテナが盞互に通信する必芁がある堎合は、特に耇数のホスト間で、Dockerネットワヌクたたはオヌケストレヌションプラットフォヌムを適切に構成しおください。 詳现に぀いおは、Docker のネットワヌクに関するドキュメントを参照し、トラブルシュヌティングのヒントに぀いおは、Jenkins の問題の蚺断ガむドを参照しおください。

結論

Docker ず Jenkins を組み合わせるず、CI/CD に察する機敏で堅牢なアプロヌチが実珟したす。 Docker は䞀貫性のある環境をロックダりンし、超高速のロヌルアりトを実珟する䞀方で、Jenkins はビルド、テスト、倉曎の本番環境ぞのプッシュなどの䞻芁なタスクを自動化したす。 この 2 ぀が調和しおいるず、リリヌス サむクルが短瞮され、統合の頭痛の皮が枛り、優れた機胜の開発に集䞭する時間が増えるこずが期埅できたす。

たた、パむプラむンが健党であれば、チヌムはナヌザヌからのフィヌドバックに迅速に察応し、自信を持っおアップデヌトを展開できるずいう、゜フトりェアプロゞェクトを成功させるための重芁な芁玠です。 たた、セキュリティに懞念がある堎合は、アプリケヌションを安党に保぀ためのツヌルやベストプラクティスがたくさんありたす。

このガむドが、チヌムが気に入る高オクタン䟡の CI/CD パむプラむンの構築 (および保守) に圹立぀こずを願っおいたす。 質問がある堎合や手䌝っおもらう必芁がある堎合は、 コミュニティフォヌラムで気軜に連絡したり、 Slackで䌚話に参加したり、 GitHubの問題でチケットを開いたりしおください。 DockerやJenkinsの愛奜家の䞭には、喜んで助けおくれる仲間がたくさんいたす。

読んでくれおありがずう、そしお幞せな建物!

さらに詳しく

関連蚘事