【入門編】レガシーJenkinsの刷新計画:プラグイン依存地獄から脱却するための『ゼロベース再構築』移行ガイド – バージョン管理・CI/CD活用バイブル

こんにちは!日々のビルド待ちや、原因不明のジョブエラーに頭を悩ませていませんか?

長年運用されてきた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環境が、より快適で素晴らしいものになることを心から応援しています!

タイトルとURLをコピーしました