Почему снова такой вопрос?
Этот вопрос, кажется, задавали несколько раз, но все ответы актуальны для заданий Jenkins Pipeline (плагин: workflow-job).
Ситуация
Я переношу кучу старых фристайл-заданий со старого автономного сервера Jenkins на распределенный Jenkins env, и я решил преобразовать их в задания Jenkins Pipeline (нельзя использовать Blue ocean для этого как SCM - это SVN.
В любом случае, для некоторых заданий нежелательно очищать свои рабочие пространства, поскольку они являются своего рода заданиями для проверки работоспособности / проверки и из-за того, что размер проверки SVN и встроенного материала велик (2 ГБ в файлах 20K, просто удаление происходит очень медленно).
Тем не менее, мне время от времени (время от времени) нужно удалить рабочую область таких заданий. И я не хочу делать это следующими способами:
- изменение файла Jenkins и передача его в SVN
- «Воспроизведение» конвейера выполняется с модификацией
И у меня нет прямого доступа к FS на этом подчиненном узле (что было бы проще всего).
Поиск в Google
Быстрый поиск в Интернете обрушился на меня с десятками результатов [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)
Просто потому, что эти методы недоступны для этого типа элементов, а только для _7 _ а>
Вопрос: Как тогда я могу удалить рабочую область задания Pipeline?
Существует еще один плагин Jenkins: Workspace Cleanup, который, вероятно, используется в Jenkinsfile, вызывая cleanWs()
внутри stage() {}
, но я не понял, как использовать его извне Jenkinsfile (например, из моего отличного сценария запускалась консоль сценариев Jenkins).
Это ошибка / запрос на улучшение плагина заданий Jenkins Pipeline? Или есть какой-либо другой способ, как преобразовать элемент во что-то, откуда у меня будет доступ к желаемой функциональности?
console script
работает на сервере, аworkflow
работает на узлах ... возможно, вам нужно пройти через узлы и каким-то образом запустить там конвейер ... - person daggett   schedule 03.04.2019