Jenkins の Docker による構築と CI/CD パイプライン設定

インストール

Docker を使用した Jenkins 環境のセットアップ

中国国内のネットワーク制限を考慮し、必要な Docker イメージを事前に取得しておくことを推奨します。

# Docker-in-Docker イメージ(コンテナ内で Docker コマンドを実行可能)
docker pull docker:dind

# Jenkins 公式イメージ(JDK17 同梱)
docker pull jenkins/jenkins:2.452.3-jdk17

カスタム Jenkins イメージの作成

以下の機能を追加したカスタムイメージを作成します:

  • Blue Ocean:モダンな UI でパイプラインの可視化・操作を簡素化
  • Docker Workflow:Declarative Pipeline 内で Docker コンテナを操作可能
  • Docker CLI:ビルドやプッシュなどの Docker 操作を直接実行
  • その他:MySQL クライアント、vim、net-tools など CI/CD に便利なツール群
cat <<EOF > Dockerfile
FROM jenkins/jenkins:2.452.3-jdk17
USER root

# 必要なパッケージと Docker CLI のインストール
RUN apt-get update && apt-get install -y lsb-release
RUN curl -fsSLo /usr/share/keyrings/docker-archive-keyring.asc \
  https://download.docker.com/linux/debian/gpg
RUN echo "deb [arch=\$(dpkg --print-architecture) \
  signed-by=/usr/share/keyrings/docker-archive-keyring.asc] \
  https://download.docker.com/linux/debian \
  \$(lsb_release -cs) stable" > /etc/apt/sources.list.d/docker.list
RUN apt-get update && apt-get install -y docker-ce-cli
RUN apt-get update && apt-get install -y default-mysql-client less vim telnet net-tools

ENV LESSCHARSET=utf-8
USER jenkins

# Jenkins プラグインのインストール
RUN jenkins-plugin-cli --plugins "blueocean docker-workflow"
EOF

docker build -t myjenkins-blueocean:2.452.3-1 .

起動方法

まず、Jenkins のデータディレクトリの所有者を UID 1000(jenkins ユーザー)に変更します。

chown -R 1000:1000 ./volumes/jenkins-data

Docker Compose を使用した起動

cat <<EOF > docker-compose.yaml
services:
  jenkins-docker:
    image: docker:dind
    privileged: true
    environment:
      - DOCKER_TLS_CERTDIR=/certs
    volumes:
      - ./volumes/jenkins-docker-certs:/certs/client
      - ./volumes/jenkins-data:/var/jenkins_home
    networks:
      jenkins:
        aliases:
          - docker
    ports:
      - "2376:2376"
    command: ["--storage-driver", "overlay2"]

  jenkins-blueocean:
    image: myjenkins-blueocean:2.452.3-1
    restart: on-failure
    environment:
      - DOCKER_HOST=tcp://docker:2376
      - DOCKER_CERT_PATH=/certs/client
      - DOCKER_TLS_VERIFY=1
    volumes:
      - ./volumes/jenkins-data:/var/jenkins_home
      - ./volumes/jenkins-docker-certs:/certs/client:ro
    networks:
      - jenkins
    ports:
      - "8080:8080"
      - "50000:50000"

networks:
  jenkins:
    driver: bridge
EOF

docker compose up -d

初期設定

ブラウザで http://localhost:8080 にアクセスし、初期管理者パスワードを確認します。

docker compose exec jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword

パイプラインの実装例

Credentials の利用

Jenkins の Credentials Store は以下のような種類をサポートしています:

  • Username with password
  • SSH Username with private key
  • Secret text

パイプライン内で Credentials を環境変数として安全に使用するには、credentials() 関数または withCredentials ステップを使用します。

pipeline {
    agent any
    stages {
        stage('Example') {
            environment {
                DB_CREDS = credentials('mysql-dev')
            }
            steps {
                sh 'echo "User: $DB_CREDS_USR"'
            }
        }
    }
}

SQL スクリプトの実行(ローカル MySQL クライアント利用)

pipeline {
    agent any
    parameters {
        string(name: 'branch', defaultValue: 'main', description: '対象ブランチ')
    }
    environment {
        GIT_CRED_ID = 'github-ssh-key'
        MYSQL_CRED_ID = 'mysql-test'
    }
    stages {
        stage('Checkout') {
            steps {
                checkout scmGit(
                    branches: [[name: "*/${params.branch}"]],
                    extensions: [localBranch("${params.branch}")],
                    userRemoteConfigs: [[
                        credentialsId: env.GIT_CRED_ID,
                        url: 'git@github.com:liuzhenghua/jenkins-test.git'
                    ]]
                )
            }
        }
        stage('Execute SQL') {
            steps {
                script {
                    withCredentials([
                        usernamePassword(
                            credentialsId: env.MYSQL_CRED_ID,
                            usernameVariable: 'MYSQL_USER',
                            passwordVariable: 'MYSQL_PASS'
                        )
                    ]) {
                        sh '''
                        set -e
                        for f in sql/*.sql; do
                            mysql -h 192.168.137.101 -u "$MYSQL_USER" -p"$MYSQL_PASS" demo_db < "$f"
                        done
                        '''
                    }
                }
            }
        }
    }
}

Docker コンテナ内での SQL 実行(MySQL クライアント未インストール時)

まず、MySQL クライアントを含むカスタムイメージを作成します。

cat <<EOF > Dockerfile.mysql
FROM alpine:3.20.1
RUN apk add --no-cache mysql-client
EOF

docker build -t registry.example.com/mysql-client:1.0 .

次に、パイプラインのエージェントを Docker に切り替えます。

pipeline {
    agent {
        docker {
            image 'registry.example.com/mysql-client:1.0'
            registryCredentialsId 'private-registry-creds'
        }
    }
    // ... 以降のステージ定義
}

運用・トラブルシューティング

よく使うコマンド

# 初期パスワードの再確認
docker compose exec jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword

# root 権限でコンテナに入る
docker exec -u 0 -it jenkins-blueocean bash

プラグイン更新が失敗する場合

HTTPS 通信がプロキシや証明書の問題で失敗する場合、Jenkins 管理画面の「プラグイン管理」→「詳細設定」から Update Site URL を http:// に変更します。

Git SSH 鍵の設定手順

  1. 任意のマシンで SSH 鍵ペアを生成:
    ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  2. 秘密鍵を Jenkins の Credentials に登録(種別: SSH Username with private key)
  3. 公開鍵を Git リポジトリ(例: GitHub)に登録
  4. Jenkins コンテナ内で一度手動で ssh git@github.com を実行し、ホストを信頼済みに設定

タグ: Jenkins Docker CI/CD BlueOcean DeclarativePipeline

7月7日 16:37 投稿