こんにちは!日々のビルド待ちや、原因不明のジョブエラーに頭を悩ませていませんか?
長年運用されてきたJenkins環境……気がつけば、誰も中身を把握していない「プラグイン依存地獄」や、退職した先輩が作った謎のフリースタイルジョブの山と化していませんか?「新しくプラグインを入れようとしたら依存関係で全滅した」「Javaのバージョンを上げたら動かなくなった」——そんな悪夢のようなレガシーJenkinsを、思い切って『ゼロベース』で綺麗に現代化する手順を、今日は優しく、そして徹底的に解説していきます。
これをマスターすれば、毎日のデプロイ作業や環境メンテの絶望感から解放され、チーム全体の開発スピードが劇的に変わりますよ。さあ、一緒にクリーンなCI/CD環境への第一歩を踏み出しましょう!
—
1. そもそも「Jenkins」って何をするもの?(ツールの役割)
いまさら聞けないかもしれませんが、Jenkinsの本質を確認しておきましょう。
Jenkinsは一言で言うと、「開発作業の面倒なルーティンワークを、完全に自動化してくれる頼れるロボット執事」です。
- コードがプッシュされたら自動でビルドする
- 自動テストを走らせて品質をチェックする
- ステージング環境や本番環境へ安全にデプロイする
これらを人間が手動でやるとミスが起きるし時間もかかります。Jenkinsに「これをこうして、終わったらあそこに通知して」と指示(パイプライン定義)しておくことで、24時間365日、文句も言わずに正確に作業をこなしてくれます。
—
2. なぜ「プラグイン依存地獄」が起きるのか?
レガシーJenkinsがなぜ崩壊するのか、その理由はシンプルです。
「とりあえず動くから」と、GUI画面から一つひとつプラグインを手動インストールし、設定を継ぎ足し続けてきたからです。
- 構成管理がされていない(Config as Codeがない): 設定がすべてJenkins内部のXMLファイル(`$JENKINS_HOME`)の迷宮に隠されており、誰も全体像がわからない。
- バックアップからの復元テストをしていない: いざという時に戻せない恐怖から、誰も古いプラグインをアップデートできない。
この負債を綺麗に清算するのが、今回のテーマである「ゼロベース再構築」です。古い環境を直すのではなく、「インフラのコード化」を使って、全く新しい綺麗な環境を一瞬で組み上げるアプローチを取ります。
—
3. インフラのコード化(IaC)による土台作り
まずは、Jenkinsが動く土台のサーバー環境を、TerraformとAnsibleを使ってコードで定義します。これにより、「手作業による設定ミス」を完全にゼロにします。
ステップ①:Terraformでサーバーを召喚する
AWSなどのクラウド上に、Jenkins用のEC2インスタンスを構築するTerraformコードの例です。
main.tf – Jenkinsサーバーのインフラ定義
provider “aws” {
region = “ap-northeast-1”
}
セキュリティグループ(HTTPとSSH、Jenkins用ポートを開放)
resource “aws_security_group” “jenkins_sg” {
name = “jenkins-server-sg”
description = “Allow inbound traffic for Jenkins”
ingress {
from_port = 8080
to_port = 8080
protocol = “tcp”
cidr_blocks = [“0.0.0.0/0”] # 本番では社内IP等に制限してください
}
ingress {
from_port = 22
to_port = 22
protocol = “tcp”
cidr_blocks = [“0.0.0.0/0”]
}
egress {
from_port = 0
to_port = 0
protocol = “-1”
cidr_blocks = [“0.0.0.0/0”]
}
}
EC2インスタンスの作成
resource “aws_instance” “jenkins” {
ami = “ami-0c3fd0f5d33134a79” # Amazon Linux 2023の例
instance_type = “t3.medium”
security_groups = [aws_security_group.jenkins_sg.name]
tags = {
Name = “Modern-Jenkins-Server”
}
}
output “jenkins_ip” {
value = aws_instance.jenkins.public_ip
description = “JenkinsサーバーにアクセスするためのIPアドレス”
}
ステップ②:AnsibleでJenkinsをセットアップする
サーバーが立ち上がったら、Ansibleを使ってDocker環境とJenkinsをサクッとインストールします。現代のJenkinsは、コンテナ(Docker)上で動かすのが圧倒的にスマートです。
playbook.yml – Jenkins環境構築プレイブック
- hosts: all
become: yes
tasks:
- name: Dockerのインストール (Amazon Linux 2023の例)
dnf:
name: docker
state: present
- name: Dockerサービスを起動して有効化
systemd:
name: docker
state: started
enabled: yes
- name: Dockerグループに現在のアカウントを追加
user:
name: ec2-user
groups: docker
append: yes
- name: Jenkins用データディレクトリの作成
file:
path: /var/jenkins_home
state: directory
owner: “1000”
group: “1000”
mode: ‘0755’
- name: 公式Jenkinsコンテナの起動
docker_container:
name: jenkins
image: jenkins/jenkins:lts-jdk17
state: started
restart_policy: always
ports:
- “8080:8080”
- “50000:50000”
volumes:
- /var/jenkins_home:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
このAnsibleを実行すれば、数分でピカピカの最新Jenkinsが立ち上がります!
—
4. 不要なジョブの選別基準:持たない美学
新しい環境に移る際、一番やってはいけないのが「古いジョブをすべてそのまま移行すること」です。ここで徹底的に断捨離を行いましょう。以下の「断捨離フィルター」を通してみてください。
1. 直近3ヶ月間、一度も実行されていないジョブ
- 👉 即座に削除またはアーカイブ。 「いつか使うかも」は99%使いません。
2. 誰が何のために作ったか分からないブラックボックスなジョブ
- 👉 作り直し対象。 新環境では、後述する「Jenkinsfile(コード化)」として生まれ変わらせます。
3. 手動トリガーでパラメータを大量に入力する職人芸的なジョブ
- 👉 自動化対象。 GitHubのプルリクエストやマージをトリガーにするように設計し直します。
—
5. 精度高い「HelloWorld」:Jenkinsfileによるパイプライン構築
新しいJenkins環境では、GUIでポチポチ設定を作るのではなく、「Jenkinsfile」というテキストファイルにビルド手順を書いてコード管理(Pipeline as Code)します。これがレギシー脱却の最大の武器です。
新環境にアクセスしたら初期セットアップを済ませ、以下の手順で最高の「HelloWorld」動かしてみましょう。
1. リポジトリに `Jenkinsfile` を置く
プロジェクトのルートディレクトリに、以下のような `Jenkinsfile` を作成してGitにプッシュします。
// Jenkinsfile (Declarative Pipeline)
pipeline {
// どんなエージェント(実行環境)で動かすか
agent any
// パイプライン内で使う環境変数
environment {
GREETING = “こんにちは、モダンなCI/CDの世界へ!”
}
stages {
// ステージ1: 挨拶と環境確認
stage(‘Hello World’) {
steps {
echo “====================================”
echo “${env.GREETING}”
echo “Running on Jenkins Version: ${env.JENKINS_VERSION}”
echo “====================================”
}
}
// ステージ2: ちょっとしたビルドシミュレーション
stage(‘Build & Test’) {
steps {
echo “依存関係をインストールしています…”
sh ‘echo “Mock dependencies installed successfully.”‘
echo “テストを実行しています…”
sh ‘echo “All 42 tests passed without errors!”‘
}
}
}
// パイプライン終了後の処理
post {
success {
echo ‘🎉 すべてのステージが華麗に成功しました!毎日の作業が劇的に楽になりますね!’
}
failure {
echo ‘😢 どこかでエラーが発生しました。ログを確認してください。’
}
}
}
2. Jenkinsで「Pipeline」ジョブを作成する
1. Jenkinsのトップ画面から [新規ジョブ作成] をクリック。
2. ジョブ名(例: `hello-world-pipeline`)を入力し、[パイプライン (Pipeline)] を選択して保存。
3. 設定画面の「Pipeline」セクションで、以下のように指定します。
- Definition: `Pipeline script from SCM`
- SCM: `Git`
- Repository URL: あなたのGitリポジトリのURL
- Script Path: `Jenkinsfile`
4. 保存して [ビルド実行 (Build Now)] をポチッと押してみましょう!
「Console Output」を開き、緑色の美しいログと共にメッセージが表示されたら成功です!
—
6. 移行後の継続的な監査と運用ルール
新しく綺麗にした環境を、再びレギシー化させないための「3つの鉄則」を授けます。
1. GUIでの直接設定変更の禁止(Configuration as Codeの徹底)
- プラグインの追加や全体設定の変更は、JCasC(Jenkins Configuration as Code)プラグインを使い、コードで管理してGit経由で適用します。
2. プラグインの定期的な棚卸しと自動アップデート
- 「Dependabot」や「Renovate」のようなツールを使い、プラグインやコンテナイメージの脆弱性を常に検知し、小さくアップデートし続ける文化を作ります。
3. 「壊すことを恐れない」インフラのイミュータブル化
- サーバー自体が調子悪くなったら、TerraformとAnsibleを流して「秒で再構築できる」状態を維持しておきます。サーバーに愛着を持ってはいけません。使い捨てるくらいの気構えがベストです。
—
おわりに
レギシーJenkinsの刷新は、最初は途方もなく大きな山に見えるかもしれません。しかし、インフラをコード化し、ジョブをJenkinsfileに落とし込んでいくプロセスは、エンジニアにとって非常に知的でワクワクする作業です。
これをマスターすれば、毎日のデプロイや環境トラブルにおびえる日々から解放され、本当に価値のあるコードを書くことに集中できるようになりますよ。
あなたのCI/CD環境が、より快適で素晴らしいものになることを心から応援しています!