Ответ 1
Вы можете использовать deleteDir()
в качестве последнего шага файла Jenkins в конвейере (при условии, что вы не изменили рабочий каталог).
Мы запускаем Jenkins 2.x и любим новый плагин Pipeline. Однако с таким количеством веток в репозитории дисковое пространство быстро заполняется.
Есть ли какой-либо плагин, совместимый с Pipeline, который я могу уничтожить рабочую область в успешной сборке?
Вы можете использовать deleteDir()
в качестве последнего шага файла Jenkins в конвейере (при условии, что вы не изменили рабочий каталог).
Как @gotgenes указал на версию Jenkins. 2.74, ниже работает, не уверен с того момента, когда, может быть, если кто-то может отредактировать и добавить версию выше
cleanWs()
С Jenkins версии 2.16 и Плагин очистки рабочей области, который у меня есть, я использую
step([$class: 'WsCleanup'])
для удаления рабочей области.
Вы можете просмотреть его, выбрав
JENKINS_URL/job/<any Pipeline project>/pipeline-syntax
Затем выберите "Шаг: общий шаг сборки" на шаге "Шаг", а затем выберите "Удалить рабочее пространство при выполнении сборки" с этапа сборки
Фактически функция deleteDir рекурсивно удаляет текущий каталог и его содержимое. Символические ссылки и соединения не будут соблюдаться, но будут удалены.
Чтобы удалить конкретный каталог рабочей области, переместите шаг deleteDir на шаг dir.
dir('directoryToDelete') {
deleteDir()
}
Упомянутые решения deleteDir()
и cleanWs()
(если используется плагин очистки рабочего пространства) работают, но рекомендация использовать его на дополнительном этапе сборки обычно не является желаемым решением. Если сборка завершается неудачно и конвейер прерывается, этот этап очистки никогда не достигается, и, следовательно, рабочая область не очищается при неудачных сборках.
=> В большинстве случаев вам, вероятно, следует поместить его в состояние после сборки, как always
:
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
cleanWs()
}
}
}
Я использовал deleteDir() следующим образом:
post {
always {
deleteDir() /* clean up our workspace */
}
}
Тем не менее, мне также приходилось всегда запускать Успех или Неудачно ПОСЛЕ, но вы не можете заказать условия публикации. Текущий заказ всегда изменен, отменен, сбой, успех, а затем нестабильный.
Тем не менее, есть очень полезный пост состояние, очистки, который всегда работает, наконец, увидеть https://jenkins.io/doc/book/pipeline/syntax/
Итак, в итоге мой пост был следующим:
post {
always {
}
success{
}
failure {
}
cleanup{
deleteDir()
}
}
Надеюсь, это может быть полезно для некоторых угловых случаев
Используя следующий конвейерный скрипт:
pipeline {
agent { label "master" }
options { skipDefaultCheckout() }
stages {
stage('CleanWorkspace') {
steps {
cleanWs()
}
}
}
}
Следуй этим шагам:
Если вы использовали пользовательское рабочее пространство в Jenkins, то deleteDir() не удалит папку @tmp.
Чтобы удалить @tmp вместе с рабочей областью, используйте следующую
pipeline {
agent {
node {
customWorkspace "/home/jenkins/jenkins_workspace/${JOB_NAME}_${BUILD_NUMBER}"
}
}
post {
cleanup {
/* clean up our workspace */
deleteDir()
/* clean up tmp directory */
dir("${workspace}@tmp") {
deleteDir()
}
/* clean up script directory */
dir("${workspace}@script") {
deleteDir()
}
}
}
}
Этот фрагмент также будет работать для рабочей области по умолчанию.
Мы следим за тем, чтобы мы работали с чистой рабочей областью, используя функцию плагина git. Вы можете добавить дополнительное поведение, например "Очистить до проверки". Мы также используем это для "Обрезанных ветвей удаленного отслеживания".
Использование расширения WipeWorkspace также работает. Для этого требуется более длинная форма:
checkout([
$class: 'GitSCM',
branches: scm.branches,
extensions: scm.extensions + [[$class: 'WipeWorkspace']],
userRemoteConfigs: scm.userRemoteConfigs
])
Подробнее здесь: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-
Доступные расширения GitSCM здесь: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl
Очистка. Так как секция post конвейера гарантированно будет запущена в конце выполнения конвейера, мы можем добавить некоторые уведомления или другие шаги для выполнения финализации, уведомления или других задач окончания конвейера.
pipeline {
agent any
stages {
stage('No-op') {
steps {
sh 'ls'
}
}
}
post {
cleanup {
echo 'One way or another, I have finished'
deleteDir() /* clean up our workspace */
}
}
}
В моем случае я хочу очистить старые файлы в начале сборки, но это проблематично, так как исходный код был извлечен.
Мое решение - попросить git удалить все файлы (из последней сборки), о которых он не знает:
sh "git clean -x -f"
Таким образом, я могу начать чистую сборку, и если она не удастся, рабочее пространство не будет очищено и поэтому легко отлаживается.
Используйте Git Shallow Clone в расширенном поведении клонов
И другой подход - очистить дерево с помощью git clean -fdx