Відповіді:
Ви можете використовувати deleteDir()
в якості останнього кроку конвеєра Jenkinsfile (якщо припустити, що ви не змінили робочий каталог).
checkout scm
.
Як @gotgenes зазначив з версією Jenkins. 2.74 , наведене нижче працює, не впевнений, коли, можливо, якщо хтось може відредагувати та додати версію вище
cleanWs()
З , я використовую , Jenkins версії 2.16 та плагіну очищення робочої області
step([$class: 'WsCleanup'])
для видалення робочої області.
Ви можете переглянути його, перейшовши на
JENKINS_URL/job/<any Pipeline project>/pipeline-syntax
Потім виберіть "крок: Загальний крок збірки" із кроку зразка, а потім виберіть "Видалити робочу область, коли збирання виконано" з кроку збірки
Згадані рішення deleteDir()
та cleanWs()
(якщо використовується плагін очищення робочої області ) обидва працюють, але рекомендація використовувати його на етапі додаткової збірки, як правило, не є бажаним рішенням . Якщо збірка не вдається і трубопровід перерваний, ця стадія очищення ніколи не досягається, і тому робоча область не очищається від збійних збірок.
=> У більшості випадків ви, ймовірно, повинні ставити його в стані після вбудованого кроку, наприклад always
:
pipeline {
agent any
stages {
stage('Example') {
steps {
echo 'Hello World'
}
}
}
post {
always {
cleanWs()
}
}
}
cleanWs()
як крок, видаляє їх до запуску команди архіву публікації. cleanWs()
найімовірніше, завжди слід виконувати як команду після складання
post
розділ, його cleanWs()
можна сміливо привести в always
стан, але найбезпечніше місце знаходиться в cleanup
стані:post { cleanup { cleanWs() } }
Фактично функція deleteDir рекурсивно видаляє поточний каталог та його вміст. Символічні посилання та з'єднання не будуть дотримуватися, але будуть видалені.
Для видалення конкретного каталогу робочої області оберніть крок deleteDir на етапі dir.
dir('directoryToDelete') {
deleteDir()
}
Я використовував 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()
}
}
}
}
Виконайте такі дії:
options { skipDefaultCheckout() }
для трохи швидшого виконання.
Якщо ви використовували власну робочу область в 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()
}
}
}
}
Цей фрагмент також буде працювати для робочої області за замовчуванням.
Використання розширення '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
Очищення : Оскільки після закінчення виконання трубопроводу гарантовано працювати розділ "Трубопровід" після закінчення виконання трубопроводу, ми можемо додати деякі повідомлення або інші кроки для виконання завдань щодо завершення, сповіщення або інших завдань, що закінчуються.
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"
Таким чином я можу запустити збірку чистою, і якщо вона не вдасться, робоча область не очищається і тому легко виводиться з ладу.
В даний час і deleteir (), і cleanWs () не працюють належним чином при використанні плагіна Jenkins kubernetes, робоча область стручка видаляється, але головна робоча область зберігається
це не повинно бути проблемою для стійких відділень, коли у вас є крок очищення робочої області перед аферою каси. В основному він буде повторно використовувати одне і те ж робоче середовище знову і знову: але при використанні багатогалузевих конвеєрів майстер зберігає всю робочу область та каталог git
Я вважаю, що це має бути проблемою для Дженкінса, будь-якого просвітництва тут?