經過腳本命令行批量修改 Jenkins 任務bash
最近,筆者所在團隊的 Jenkins 所在的服務器常常報硬盤空間不足。經查發現不少任務沒有設置「丟棄舊的構建」。通知全部的團隊檢查本身的 Jenkins 任務有沒有設置丟棄舊的構建,有些不現實。 一開始想到的是使用 Jenkins的 API 來實現批量修改全部的 Jenkins 任務。筆者對這個解決方案不滿意,經 Google 發現有同窗和我遇到了一樣的問題。他使用的更「技巧」的方式:在 Jenkins 腳本命令行中,經過執行 Groovy 代碼操做 Jenkins 任務。 總的來講,就兩步: 進入菜單:系統管理 --> 腳本命令行 在輸入框中,粘貼以下代碼:服務器
import jenkins.model.Jenkins
import hudson.model.Job
import jenkins.model.BuildDiscarderProperty
import hudson.tasks.LogRotator
// 遍歷全部的任務
Jenkins.instance.allItems(Job).each { job ->
if ( job.isBuildable() && job.supportsLogRotator() && job.getProperty(BuildDiscarderProperty) == null) {
println " \"${job.fullDisplayName}\" 處理中"
job.addProperty(new BuildDiscarderProperty(new LogRotator (2, 10, 2, 10)))
println "$job.name 已更新"
}
}
return;
/**
LogRotator構造參數分別爲:
daysToKeep: If not -1, history is only kept up to this days.
numToKeep: If not -1, only this number of build logs are kept.
artifactDaysToKeep: If not -1 nor null, artifacts are only kept up to this days.
artifactNumToKeep: If not -1 nor null, only this number of builds have their artifacts kept.
**/
複製代碼
腳本ui
腳本命令行介紹 腳本命令行(Jenkins Script Console),它是 Jenkins 的一個特性,容許你在 Jenkins master 和 Jenkins agent 的運行時環境執行任意的 Groovy 腳本。這意味着,咱們能夠在腳本命令行中作任何的事情,包括關閉 Jenkins,執行操做系統命令 rm -rf /(因此不能使用 root 用戶運行 Jenkins agent)等危險操做。 除了上文中的,使用界面來執行 Groovy 腳本,還能夠經過 Jenkins HTTP API:/script執行。具體操做,請參考 官方文檔。this
問題:代碼執行完成後,對任務的修改有沒有被持久化?spa
當咱們代碼job.addProperty(new BuildDiscarderProperty(new LogRotator (2, 10, 2, 10)))執行後,這個修改到底有沒有持久化到文件系統中呢(Jenkins 的全部配置默認都持久化在文件系統中)?咱們看下 hudson.model.Job 的源碼,在addProperty方法背後是有進行持久化的:操作系統
public void addProperty(JobProperty<? super JobT> jobProp) throws IOException {
((JobProperty)jobProp).setOwner(this);
properties.add(jobProp);
save();
}
複製代碼
小結命令行
本文章只介紹了批量修改「丟棄舊的構建」的配置,若是還但願修改其它配置,能夠參考 hudson.model.Job 源碼。 不得不提醒讀者朋友,Jenkins 腳本命令行是一把雙刃劍,你們操做前,請考慮清楚影響範圍。若是有必要,請提早作好備份。code