Есть ли способ очистить рабочее пространство Jenkins Worflowjob с помощью отличного сценария через консоль сценариев Jenkins? - PullRequest
2 голосов
/ 03 апреля 2019

Почему опять этот тип вопроса?

Этот вопрос, похоже, задавался несколько раз, но все ответы не имеют отношения к заданию 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? Или есть какой-нибудь другой способ, как привести предмет к чему-то, откуда у меня был бы доступ к желаемой функциональности?

Ответы [ 2 ]

2 голосов
/ 03 апреля 2019

Это не самый красивый способ, но вы можете просто выполнить команду ОС:

def isWin = Jenkins.instance.windows
def cmd = isWin ? "rmdir /s /q $workspace" : "rm -rf $workspace"

cmd.execute()

Если вы используете свой код только один раз или не имеете дело с несколькими ОС, вы можете вместо этого сократитькод соответствующей команды:

"rm -rf $workspace".execute()
1 голос
/ 04 апреля 2019

Ладно, исследуя это все больше, гуглюсь еще больше и прислушиваясь к вашим идеям (этот один особенно вдохновил меня Дэниел Спилкер ), я достиг того, чего хотел, а именно:

Независимо от рабочего задания CLEAN-UP Pipeline через консоль сценариев Jenkins

(только с использованием доступных средств Jenkins и без сбоев с настройкой Job, ни обновления Jenkinsfile, ни воспроизведения)

Код не удивительно сложен, и для ручной демонстрации он выглядит так:

Jenkins jenkins = Jenkins.instance
Job item = jenkins.getItemByFullName('Sandbox/PipelineTests/SamplePipeline')
println("RootDir: " + item.getRootDir())

for (Node node in jenkins.nodes) {
  // Make sure slave is online
  if (!node.toComputer().online) {
    println "Node '$node.nodeName' is currently offline - skipping workspace cleanup"
    continue
  }

  println "Node '$node.nodeName' is online - performing cleanup:"

  // Do some cleanup
  FilePath wrksp = node.getWorkspaceFor(item)
  println("WRKSP "  + wrksp)
  println("ls " + wrksp.list())
  println("Free space " + wrksp.getFreeDiskSpace())
  println("===== PERFORMING CLEAN UP!!! =====")
  wrksp.deleteContents()
  println("ls now " + wrksp.list())
  println("Free space now " + wrksp.getFreeDiskSpace())
}

Его вывод, если ваша работа найдена, выглядит следующим образом:

Результат

RootDir: /var/lib/jenkins/jobs/Sandbox/jobs/PipelineTests/jobs/SamplePipeline
....
.... other node's output noise
....
Node 'mcs-ubuntu-chch' is online - performing cleanup:
WRKSP /var/lib/jenkins/workspace/Sandbox/PipelineTests/SamplePipeline
ls [/var/lib/jenkins/workspace/Sandbox/PipelineTests/SamplePipeline/README.md, /var/lib/jenkins/workspace/Sandbox/PipelineTests/SamplePipeline/.git]
Free space 3494574714880
===== PERFORMING CLEAN UP!!! =====
ls now []
Free space now 3494574919680

Миссия выполнена:)

Ссылки

В основном Jenkins Javadoc

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...