こんにちは!現場で毎日CI/CDパイプラインと格闘している君なら、一度はこんな絶望を味わったことがあるはずだ。
「あ、セキュリティポリシーの変更で、全150個のジョブのGitリポジトリのURLを一箇所だけ書き換えなきゃいけない……?」
「プラグインのアップデートで、全ジョブのビルドタイムアウトの設定仕様が変わった……?」
まさか、150個のジョブを一つずつポチポチとブラウザで開き、「設定」→「保存」を繰り返すつもりかい? 夜中の3時にそんな作業をしていたら、エンジニアとしての魂が削られていってしまうよ。
今回は、そんな地獄の作業から君を解放し、「たった数行のGroovyスクリプト」でJenkinsを意のままに操る、現場で震えるほど役立つ裏技を伝授しよう。
Jenkinsの「スクリプトコンソール」の扉を開ければ、GUIの限界など一瞬で吹き飛ぶ。さあ、一緒に次世代の自動化の世界へ足を踏み入れよう!
—
そもそも「Jenkinsのスクリプトコンソール」って何?
Jenkinsの裏側では、Javaベースの強力な言語であるGroovy(グルーヴィー)が動いている。
Jenkinsの管理画面にある「スクリプトコンソール(Script Console)」は、このGroovyコードをJenkinsのマスター上で直接実行できる、いわば「エンジニアの最終兵器」だ。
GUIでは触れないJenkinsの内部オブジェクト(メモリ上のジョブ設定データなど)に直接アクセスし、一括で読み書きができる。これを使えば、数千個のジョブであっても一瞬で書き換えられるんだ。
注意:これは劇薬である
言うまでもないが、スクリプトコンソールは強力すぎる権限を持つ。一歩間違えると全ジョブを吹き飛ばすこともできる「劇薬」だ。だからこそ、本番環境で実行する前には必ずステージング環境やローカルのコンテナ(Docker等)でテストすること。これがプロの鉄則だよ。
—
基礎のセットアップと「Hello World」的動作確認
まずは、スクリプトコンソールの場所を確認し、正しく動くか試してみよう。
1. スクリプトコンソールへのアクセス
1. Jenkinsのダッシュボードを開く。
2. 左側メニューの 「Jenkinsの管理(Manage Jenkins)」 をクリック。
3. 「システム情報と管理」セクションにある 「スクリプトコンソール(Script Console)」 を選択。
これで、ブラウザ上にコードエディタが現れるはずだ。
2. 「Hello World」:全ジョブの名前をリストアップしてみる
まずは安全に、現在のJenkinsサーバーにどんなジョブが登録されているか、名前を覗いてみよう。以下のコードを貼り付けて「実行(Run)」を押してみてほしい。
// Jenkinsのインスタンスを取得し、全ジョブをイテレートする
println “=== 登録されているジョブの一覧 ===”
jenkins.model.Jenkins.instance.getAllItems(hudson.model.Job.class).each { job ->
// ジョブのフルネームを出力
println “・ジョブ名: ${job.fullName}”
}
println “=== 取得完了 ===”
「実行」を押した瞬間、下部の出力エリアにずらりとジョブの名前が表示されたかい?
おめでとう!君は今、Jenkinsの心臓部に直接アクセスしてデータを取得することに成功した。これがすべての自動化の第一歩だ。
—
実践編:現場で使える「一括ジョブ修正」スクリプト2選
ここからが本番だ。よくある現場のトラブルを解決する具体的なスクリプトを2つ紹介しよう。これをマスターすれば、毎日の作業が劇的に楽になるよ。
ケース1:プラグインの仕様変更やリポジトリ移転に伴う「Git URLの一括置換」
例えば、社内Gitサーバーのドメインが `git.old-company.com` から `git.new-company.com` に変わったとする。全ジョブのGit設定を書き換えるスクリプトがこれだ。
> 💡 ポイント: Jenkinsでは、設定を変更した後は必ず `save()` を呼ばないとディスクに保存されない。ここを忘れると「実行したのに直ってない!」というホラー現象が起きるので注意しよう。
import hudson.plugins.git.GitSCM
import jenkins.model.Jenkins
// 変更前の文字列と変更後の文字列
def oldDomain = “git.old-company.com”
def newDomain = “git.new-company.com”
// 変更カウンター
def updatedCount = 0
println “=== Git URL 一括置換処理を開始します ===”
// 全てのジョブを走査
Jenkins.instance.getAllItems(hudson.model.Job.class).each { job ->
// FreeStyleプロジェクトなどを想定し、SCM(ソース管理)を持つものを対象にする
if (job instanceof hudson.model.AbstractProject) {
def scm = job.getScm()
if (scm instanceof GitSCM) {
boolean isModified = false
// 既存のリポジトリURLをチェックして置換
scm.userRemoteConfigs.each { remoteConfig ->
def currentUrl = remoteConfig.getUrl()
if (currentUrl && currentUrl.contains(oldDomain)) {
def newUrl = currentUrl.replace(oldDomain, newDomain)
remoteConfig.setUrl(newUrl)
println “【置換】 ${job.fullName}: ${currentUrl} -> ${newUrl}”
isModified = true
}
}
// 変更があった場合のみジョブの設定を保存
if (isModified) {
job.save()
updatedCount++
}
}
}
}
println “=== 処理完了: 合計 ${updatedCount} 件のジョブを更新しました ===”
このスクリプトを走らせるだけで、100個あろうが1000個あろうが、GitのURLが一瞬で書き換わる。手動でやったら数日かかる作業が、わずか数秒で終わる瞬間だ。
—
ケース2:エージェント(ノード)のラベルの一括付け替え
インフラの移行などで、特定のビルドを実行する「ノード(スレイブ)」のラベル名が変わることはよくある。例えば、旧ラベル `linux-node` を、新スペックの `ubuntu-2204-node` に一斉に切り替えたい場合だ。
import jenkins.model.Jenkins
def oldLabel = “linux-node”
def newLabel = “ubuntu-2204-node”
def updatedCount = 0
println “=== ノードラベルの一括付け替えを開始します ===”
Jenkins.instance.getAllItems(hudson.model.Job.class).each { job ->
if (job instanceof hudson.model.AbstractProject) {
def assignedLabel = job.getAssignedLabelString()
// 割り当てられているラベルが一致、または含まれている場合
if (assignedLabel && assignedLabel.contains(oldLabel)) {
// 単純置換
def newAssignedLabel = assignedLabel.replace(oldLabel, newLabel)
job.setAssignedLabel(new hudson.model.labels.LabelAtom(newAssignedLabel))
job.save()
updatedCount++
println “【ラベル変更】 ${job.fullName}: ‘${assignedLabel}’ -> ‘${newAssignedLabel}'”
}
}
}
println “=== 処理完了: 合計 ${updatedCount} 件のノードラベルを更新しました ===”
これで、インフラ側の構成変更にも素早く追従できる。インフラエンジニアとアプリケーションエンジニアの架け橋となるDevOpsエンジニアにとって、持っておくべき必須の武器と言えるだろう。
—
安全に自動化を成功させるための「3つの鉄則」
最後に、スクリプトコンソールを使う上で絶対に守ってほしいルールを伝えておく。これを怠ると、最悪の場合、会社からお叱りを受けることになりかねない。
1. 必ずバックアップを取る(あるいはDry-runする)
実行前に Jenkinsのホームディレクトリ(`/var/jenkins_home/jobs` など)のバックアップを必ず取得すること。あるいは、最初は `job.save()` をコメントアウトして、printlnの出力結果だけを確認する「Dry-run(模擬実行)」を徹底しよう。
2. 影響範囲を限定する
`getAllItems()` は強力すぎるため、特定のフォルダの中だけに絞りたい場合は `jenkins.model.Jenkins.instance.getItemByFullName(“folder-name”, com.cloudbees.hudson.plugins.folder.Folder.class).getItems()` のようにスコープを絞る配慮をしよう。
3. バージョン管理(JCasC)への移行を見据える
スクリプトコンソールは緊急避難や一時的な一括修正には最高だが、持続可能なシステムにするためには、最終的には Configuration as Code (JCasC) や Pipeline as Code (Jenkinsfile) へ移行していくことがベストプラクティスだ。
—
おわりに
GUIのポチポチ作業から抜け出し、コードの力でインフラやCI/CD環境をコントロールできるようになると、エンジニアとしての視座が一段階上がります。
「面倒くさい」「時間がかかる」と思った作業は、大抵の場合、自動化のチャンスです。
今回紹介したGroovyスクリプトのテクニックを武器に、君のチームのCI/CDパイプラインをより洗練された、美しいものに育て上げてください。応援しています!