こんにちは!エンジニアリングの世界へようこそ。
これからCI/CD自動化の心臓部である「Jenkins」を一緒にマスターしていきましょう。
開発現場で毎日行うビルドやテスト、デプロイ。これを自動化してくれるのがJenkinsですが、プロジェクトが増えるにつれて、同じようなJenkinsfile(パイプラインの設計図)があちこちにコピペされ、カオスになっていく……というのは、現場のエンジニアなら誰もが一度は通る「闇」です。
「またあの設定ファイルを書き換えるのか……全プロジェクト分直さなきゃいけないの?」
そんな絶望からあなたを救い出すのが、今回解説する「Shared Library(共通ライブラリ)」という最強の武器です。これをマスターすれば、パイプラインコードの重複を根絶し、メンテナンス効率を最大化できますよ。
それでは、Jenkinsの基礎から、明日から使えるスマートな共通ライブラリの設計術まで、一緒に見ていきましょう!
—
1. Jenkinsってなに?(ツールの役割と基本のキ)
一言で言うと、Jenkinsは「あなたの代わりに24時間365日、コードのビルド・テスト・デプロイを文句言わずに実行してくれる優秀なロボット執事」です。
私たちがGitHubなどにコードをプッシュした瞬間にそれを検知し、
1. ソースコードをコンパイルし
2. 自動テストを走らせ
3. 問題なければ本番サーバーへデプロイする
この一連の流れ(CI/CDパイプライン)を自動化するためのデファクトスタンダードツールがJenkinsです。
—
2. 最初の第一歩:最小限のセットアップとHelloWorld
難解な構築は置いておいて、まずは動く体験をしましょう。
Dockerを使えば、一瞬であなたの手元にJenkins環境が立ち上がります。
DockerでJenkinsを起動する
ターミナルを開いて、以下のコマンドを実行してみてください。
docker run -d \
–name jenkins-master \
-p 8080:8080 -p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
jenkins/jenkins:lts
これだけで、お使いのPCの `http://localhost:8080` でJenkinsが動き出します。
初回アクセス時にパスワードを求められますが、以下のコマンドでコンテナ内からサクッと取得できます。
docker exec jenkins-master cat /var/jenkins_home/secrets/initialAdminPassword
画面に従ってプラグインのインストール(「suggested plugins」でOKです)を終えたら、いよいよ世界で一番シンプルな「Hello World」パイプラインを作ってみましょう。
精度高いHelloWorld(Jenkinsfile)
Jenkinsの管理画面から「新規ジョブ作成」>「パイプライン」を選び、以下のスクリプトを「Pipeline script」欄に貼り付けて実行(Build Now)してみてください。
// Jenkinsfile (Declarative Pipelineの基本)
pipeline {
// どのエージェント(実行環境)で動かすか
agent any
stages {
// ステージ1: 挨拶をする
stage(‘Hello’) {
steps {
echo ‘こんにちは、Jenkinsの世界へようこそ!’
}
}
// ステージ2: 環境情報を覗き見する
stage(‘Environment Check’) {
steps {
echo “実行ビルド番号: ${env.BUILD_NUMBER}”
echo “ジョブ名: ${env.JOB_NAME}”
}
}
}
post {
// 成否にかかわらず最後に実行されるブロック
always {
echo ‘パイプラインの実行が完了しました。’
}
}
}
コンソール出力(Console Output)を開き、きれいにログが流れたらセットアップ完了です!おめでとうございます。
—
3. 現場の闇:コピペだらけのJenkinsfileから脱却せよ
さて、ここからが本題です。
例えば、会社のプロジェクトが10個に増えたとします。どのプロジェクトのJenkinsfileを見ても、こんなボイラープレート(お決まりのコード)が書いてありませんか?
- Slackへの通知処理(成功時、失敗時)
- セキュリティスキャンの決まりきったコマンド
- デプロイ前の承認(Input)プロセス
もしSlackのWebhook URLが変わったら? 10個すべてのJenkinsfileを書き換えますか? ……そんなのエンジニアの仕事じゃありませんよね。
ここで登場するのが Shared Library(共通ライブラリ) です。
共通の処理を1つのGitリポジトリにまとめ、みんなで「共有」しちゃいましょう。
—
4. Shared Libraryの設計と実装:実践ハンズオン
Shared Libraryのディレクトリ構造は、Jenkinsによって厳格に決められています。以下のようにリポジトリを作成します。
my-shared-library/
├── src/ # Javaでいう com.example.Utils などのクラスを置く場所(高度な人用)
└── vars/ # グローバル変数として簡単に呼び出せるスクリプトを置く場所(超重要!)
├── slackNotify.groovy
└── standardBuild.groovy
今回は、一番よく使う「Slack通知」と「ビルドの定型処理」をカプセル化してみましょう。
① Slack通知スクリプトを作る (`vars/slackNotify.groovy`)
`vars/` の下にファイルを作ると、ファイル名(拡張子除く)がそのままJenkinsfileから呼び出す関数名になります!
// vars/slackNotify.groovy
// 呼び出し方: slackNotify(‘#channel-name’, ‘SUCCESS’, ‘ビルド成功しました!’)
def call(String channel, String status, String message) {
// 色の判定
def color = (status == ‘SUCCESS’) ? ‘good’ : ‘danger’
// 実際のSlack通知プラグインのラッパー関数を呼ぶ想定
slackSend(
channel: channel,
color: color,
message: “””
[${status}] ジョブ: ${env.JOB_NAME} (Build #${env.BUILD_NUMBER})
> ${message}
<${env.BUILD_URL}|ビルド結果を確認する>
“””
)
}
② 定型化されたパイプラインを作る (`vars/standardBuild.groovy`)
次に、アプリのビルドからテスト、通知までを丸ごと包み込んだ「黄金のテンプレート」を作ります。
// vars/standardBuild.groovy
// 呼び出し方: standardBuild { sh ‘mvn clean package’ }
def call(Closure body) {
pipeline {
agent any
stages {
stage(‘Checkout’) {
steps {
// ソースコードのチェックアウト
checkout scm
}
}
stage(‘Build & Test’) {
steps {
// 引数として渡されたクロージャ(具体的なビルド処理)を実行
script {
body.call()
}
}
}
}
post {
success {
slackNotify(‘#ci-notifications’, ‘SUCCESS’, ‘すべてのテストをクリアしました!’)
}
failure {
slackNotify(‘#ci-notifications’, ‘FAILURE’, ‘ビルドが爆発しました。確認してください!’)
}
}
}
}
—
5. Jenkinsへの組み込みと、劇的に美しくなったJenkinsfile
作ったShared LibraryリポジトリをGitHub等にプッシュしたら、Jenkinsに登録しましょう。
1. Jenkinsの管理画面 >「システムの設定(System)」を開く。
2. 「Global Pipeline Libraries」のセクションを探し、「追加」をクリック。
3. 以下の様に設定します:
- Name: `my-shared-lib` (Jenkinsfileから呼び出す名前)
- Default version: `main` (ブランチ名)
- Retrieval method: Modern SCM を選び、あなたのライブラリのGit URLを入力。
さあ、準備は整いました。各プロジェクトのJenkinsfileをどう書くか、見てください。
魔法のようにスッキリしたJenkinsfile
// 各プロジェクトのJenkinsfile(これだけでOK!)
// ライブラリをインポート
@Library(‘my-shared-lib’) _
// 共通ライブラリで定義したテンプレートを呼び出し、
// このプロジェクト固有のビルドコマンドだけを渡す!
standardBuild {
sh ‘npm install && npm test’
}
すごくないですか!?
たったこれだけの記述で、裏では「チェックアウト ➔ ビルド実行 ➔ 成功/失敗に応じたSlack通知」が完璧に実行されます。もしSlackの通知フォーマットを変えたくなったら、Shared Library側のファイルを1箇所修正するだけで、全プロジェクトが一瞬でアップデートされます。
—
まとめ:毎日の作業が劇的に楽になりますよ
今回はJenkinsの基本から、一歩進んだShared Libraryによるコードの共通化・再利用までを解説しました。
- JenkinsはCI/CDの自動化に欠かせない優秀な执事。
- パイプラインのコピペ地獄は、Shared Library(共通ライブラリ)でスマートに解決できる。
- `vars/` ディレクトリに置いたスクリプトは、グローバル関数として簡単に呼び出せる。
これをマスターすれば、新しいプロジェクトが立ち上がったときも、数行のJenkinsfileを書くだけで最高品質のCI/CDパイプラインを手に入れることができます。設定ファイルのメンテナンスに怯える日々とはもうお別れです。
あなたの自動化ライフが、より快適でエキサイティングなものになりますように。
それでは、良きDevOpsライフを!