0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Docker】Jenkinsfile 学習メモ

Last updated at Posted at 2025-10-29

1. サンプルコード(Jenkinsfile )

.groovy
pipeline {
  agent any

  options {
    timestamps()
    ansiColor('xterm')
    disableConcurrentBuilds()
  }

  environment {
    // ---- 共通設定 ----
    DOCKERHUB_USER       = 'exampleuser'
    BUILD_HOST           = '192.168.10.64'
    REGISTRY             = 'docker.io'
    COMPOSE_PROJECT_NAME = 'sample-app'
    DOCKER_CONFIG        = "${WORKSPACE}/.docker"
    COMPOSE_FILE_PATH    = 'docker-compose.build.yml'
    COMPOSE_BASE         = "docker-compose -p ${COMPOSE_PROJECT_NAME} -f ${COMPOSE_FILE_PATH}"
  }

  stages {

    stage('Prepare: docker-compose & known_hosts') {
      steps {
        sh '''#!/usr/bin/env bash
          set -Eeuo pipefail
          echo "[Prepare] 環境準備を開始..."
          DEST="$HOME/.local/bin"
          mkdir -p "$DEST" "$DOCKER_CONFIG" "$HOME/.ssh"
          export PATH="$DEST:$PATH"
          
          # known_hosts 登録(模擬処理)
          echo "[Prepare] known_hosts 登録確認中..."
          ssh-keyscan -H "$BUILD_HOST" >> "$HOME/.ssh/known_hosts" 2>/dev/null || true
          echo "[Prepare] known_hosts 登録完了"
        '''
      }
    }

    stage('Sanity check: SSH & remote Docker') {
      steps {
        withCredentials([sshUserPrivateKey(
          credentialsId: 'ssh_build_host',
          keyFileVariable: 'SSH_KEY',
          usernameVariable: 'SSH_USER'
        )]) {
          sh '''#!/usr/bin/env bash
            set -Eeuo pipefail
            echo "[Check] SSH接続確認: ${SSH_USER}@${BUILD_HOST}"
            # 実際にはここで ssh コマンドを実行する
          '''
        }
      }
    }

    stage('Docker Hub login (client side)') {
      steps {
        withCredentials([usernamePassword(
          credentialsId: 'dockerhub_example',
          usernameVariable: 'DUSER',
          passwordVariable: 'DPASS'
        )]) {
          sh '''#!/usr/bin/env bash
            set -Eeuo pipefail
            echo "[Login] Docker Hub にログイン中..."
            echo "ユーザ名: $DUSER"
            # 実際にはここで docker login を実行する
          '''
        }
      }
    }

    stage('Build on remote with compose') {
      steps {
        sh '''#!/usr/bin/env bash
          set -Eeuo pipefail
          echo "[Build] SSH経由でリモートビルドを実行(模擬)..."
          
          # compose コマンド模擬
          compose() { echo "docker-compose 実行: $*"; }
          compose build
          compose up -d
          
          # DOCKER_HOST 設定模擬
          export DOCKER_HOST="ssh://user@${BUILD_HOST}"
          echo "[Build] DOCKER_HOST=$DOCKER_HOST"
        '''
      }
    }
  }

  post {
    success {
      echo "✅ パイプラインが正常に完了しました。"
    }
    failure {
      echo "❌ パイプラインが失敗しました。"
    }
  }
}



2. 構文の解説

2.1 pipeline { ... }

Jenkinsfile の最上位ブロックであり、宣言型パイプラインの基本構文。
この中にすべての設定(agent, environment, stages など)を定義する。


2.2 agent any

パイプラインの全ステージを任意のJenkinsエージェントで実行する指定である。

特定のDocker環境やノードに限定したい場合↓

agent { label 'docker' }
// または
agent { docker { image 'jenkins/jenkins:lts-jdk11' } }

2.3 options { ... }

パイプライン全体の挙動を制御するオプションを定義する。

オプション 説明
timestamps() 各ログ行に時刻を付与し、後からトレースしやすくする
ansiColor('xterm') Jenkinsログに色を付け、視認性を上げる
disableConcurrentBuilds() 同じジョブが同時に実行されるのを防ぐ(状態競合の防止)

2.4 environment { ... }

共通の環境変数を定義する。
パイプライン全体で参照可能であり、sh ステップ内でも ${VAR_NAME} として利用できる。

例:

DOCKER_CONFIG = "${WORKSPACE}/.docker"
COMPOSE_BASE  = "docker-compose -p ${COMPOSE_PROJECT_NAME} -f ${COMPOSE_FILE_PATH}"

補足:WORKSPACE は Jenkins の組み込み環境変数であり、
ジョブごとに割り当てられた作業ディレクトリを指す。


2.5 stages { ... }

ビルド処理の全体を段階(ステージ)ごとに分けるブロック。
JenkinsのUIでは各ステージが可視化される。


2.6 各 stage の構文

(1) Prepare: docker-compose & known_hosts

docker-compose バイナリと SSH の known_hosts 設定を整える。

  • sh '''...''':シェルスクリプトを実行する構文。
  • set -Eeuo pipefail:Bashの厳格モード。エラーを即検出できる。
  • ssh-keyscan:対象ホストの公開鍵を known_hosts に登録し、SSH接続エラーを防ぐ。

(2) Sanity check: SSH & remote Docker

SSH鍵を使ってリモートDockerホストへの接続確認を行う。

withCredentials([sshUserPrivateKey(...)]) { ... }

Jenkinsの「資格情報ストア」に登録された秘密鍵を安全に環境変数として扱う構文。


(3) Docker Hub login (client side)

Docker Hubへのログイン(認証ファイル生成)。
withCredentials([usernamePassword(...)]) により、
ユーザ名とパスワードを一時的に環境変数 (DUSER, DPASS) として利用できる。


(4) Build on remote with compose

SSH経由でリモートのDocker Engine上でビルドと起動を実行する。

  • eval "$(ssh-agent -s)":SSHエージェントを起動。
  • export DOCKER_HOST="ssh://${SSH_USER}@${BUILD_HOST}":Dockerコマンドをリモート転送モードに変更。
  • compose() 関数:共通コマンドを関数化し、再利用可能にしている(Groovy内でBash関数定義)。

2.7 withCredentials

Jenkinsの認証情報を安全に呼び出すための構文であり、
秘密鍵やパスワードをスクリプトに平文で残さず安全に使用できる。

withCredentials([
  sshUserPrivateKey(credentialsId: 'ssh_build_host', keyFileVariable: 'SSH_KEY', usernameVariable: 'SSH_USER'),
  usernamePassword(credentialsId: 'dockerhub_example', usernameVariable: 'DUSER', passwordVariable: 'DPASS')
]) { ... }

2.8 sh '''...'''

三重引用符 (''') によるシェルスクリプトブロックは、改行を含む複数行を安全に記述できる。
#!/usr/bin/env bash を先頭に書くことで、Bash構文が明確に動作する。


3. Jenkinsfile構文まとめ表

構文 意味 このサンプルでの使用例
pipeline {} パイプライン全体 全体を包む最上位構文
agent any 実行環境指定 任意ノードで実行
options {} ビルド設定 timestamps(), ansiColor()
environment {} 環境変数設定 DOCKER_BUILDKIT, COMPOSE_BASE
stages {} 各工程の集合 Prepare, Build, など
stage('...') 単一ステージ 各作業工程
steps {} 実際の処理 sh, withCredentials など
withCredentials() 認証情報の注入 SSH鍵やDockerHubログインに使用
sh '''...''' シェル実行 Bashスクリプトを直接記述

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?