Почему опять этот тип вопроса?
Этот вопрос, похоже, задавался несколько раз, но все ответы не имеют отношения к заданию Jenkins Pipeline (плагин: workflow-job ).
Положение
Я перевожу кучу старых вольных работ со старого автономного сервера Jenkins в распределенную среду Jenkins, и я решил преобразовать их в задания Jenkins Pipeline (не могу использовать Blue Ocean для этого, так как SCM SVN .
Во всяком случае, для некоторых заданий нежелательно очищать свои рабочие пространства, поскольку они являются своего рода заданиями по проверке работоспособности и проверке, а также потому, что размер извлечения SVN и встроенных материалов велик (2 ГБ в файлах по 20 КБ, просто удалить его) медленно).
Однако мне время от времени (ad-hoc) необходимо удалять рабочее пространство таких заданий.
И я не хочу делать это:
И у меня нет доступа к FS на этом подчиненном узле (что было бы проще всего сделать).
погуглить
Быстрый поиск в интернете обрушил на меня десятки результатов [ 1 , 2 , 3 , 4 , ... ] как убрать WS () из скрипта Groovy, запущенного из консоли скрипта Jenkins.
К сожалению, никто из них не пытается удалить рабочую область истинного org.jenkinsci.plugins.workflow.job.WorkflowJob
экземпляра элемента задания.
Моя Groovy попытка очистить WS
Основываясь на ответах, полученных из Интернета, я запустил мой скрипт очистки Groovy, который можно запустить из консоли Jenkins <Jenkins:port/script>
import hudson.model.*
import com.cloudbees.hudson.*
import com.cloudbees.hudson.plugins.*
import com.cloudbees.hudson.plugins.folder.*
import org.jenkinsci.plugins.workflow.job.*
//jobsToRetrieve = ["aFolder/aJobInFolder","topLevelJob"]
jobsToRetrieve = ["Sandbox/PipelineTests/SamplePipeline"]
enumerateItems(Hudson.instance.items)
def enumerateItems(items) {
items.each { item ->
println("===============::: GENERAL INFO::: =======================")
println(" item: " + item)
println(" item FN: " + item.fullName)
println(" item.getClass " + item.getClass())
println("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~")
if ( !(item instanceof Folder)) {
jobName = item.getFullDisplayName()
println(" :::jobname::: " + jobName)
if (jobsToRetrieve.contains(item.getFullName())) {
if (item instanceof WorkflowJob) {
println("XXXXXXXXXXXXX--- THIS IS THE JOB --- XXXXXXXXXXXXXXXXXXXXX")
println(" item.workspace: " + item.WORKSPACE)
println("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX")
println(" following methods ain't implemented for WorkflowJob type of Item\nand it will blow out.")
//see https://javadoc.jenkins.io/hudson/model/FreeStyleProject.html
println(" customWS: " + item.getCustomWorkspace())
println(" WS:" + item.getWorkspace())
item.doDoWipeOutWorkspace()
}
}
} else {
println(" :::foldername::: " + item.displayName)
enumerateItems(((Folder) item).getItems())
}
println("==========================================================")
}
}
Результаты (вроде ожидаемые, но разочаровывающие)
Как вы можете видеть, мой скрипт будет взорван при вызовах:
item.getCustomWorkspace()
item.getWorkspace()
item.doDoWipeOutWorkspace()
с MissingMethodException
groovy.lang.MissingMethodException: No signature of method: org.jenkinsci.plugins.workflow.job.WorkflowJob.doDoWipeOutWorkspace() is applicable for argument types: () values: []
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58)
at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:49)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:117)
at Script1$_enumerateItems_closure1.doCall(Script1.groovy:33)
Просто потому, что эти методы недоступны для этого типа предметов, но только для hudson.model.FreeStyleProject
Вопрос: Как тогда я могу удалить рабочее пространство конвейерного задания?
Существует еще один плагин Jenkins: очистка рабочего пространства , который, вероятно, используется в Jenkinsfile путем вызова cleanWs()
внутри stage() {}
, но я не понял, как его использовать извне Jenkinsfile (как из моего отличного скрипта запускалась консоль скрипта Jenkins).
Это ошибка / запрос на улучшение плагина заданий Jenkins Pipeline?
Или есть какой-нибудь другой способ, как привести предмет к чему-то, откуда у меня был бы доступ к желаемой функциональности?