Трубопровід Дженкінса знищить робочу область


142

Ми запускаємо Jenkins 2.x і любимо новий плагін Pipeline. Однак, маючи стільки гілок у сховищі, дисковий простір швидко заповнюється.

Чи є якийсь плагін, сумісний з Pipeline, я можу стерти робочу область для успішної збірки?

Відповіді:


110

Ви можете використовувати deleteDir()в якості останнього кроку конвеєра Jenkinsfile (якщо припустити, що ви не змінили робочий каталог).


7
У мене проблеми з deleteDir (). Схоже, випадково не вдається видалити поточний каталог, коли вузол отримує збірку на підлеглому. Збірка не вдається, звичайно, якщо це станеться. Тож майте на увазі, якщо ваша робота вийде випадково. Я не розумію, чому вузол не просто очищає робочу область, коли вузол починає будувати. Оскільки вузол може працювати будь-де, ви все одно не можете робити припущення щодо файлів у робочій області.
ssindelar

1
Але я думаю, що видалити лише робочу область на поточному вузлі. У загальному випадку ваш трубопровід буде працювати на декількох різних рабах.
Маркус Філіп

21
Я ставив це перед початком прямо раніше checkout scm.
jpbochi

2
Я ставлю це на початку також, якщо проект завершився невдачею, перш ніж він закінчиться, або наступна збірка буде на іншому підлеглому.
davegallant

2
Це команда, задокументована для очищення робочої області в розділі «Очищення та повідомлення» документації про Дженкінса.
vossad01

131

Як @gotgenes зазначив з версією Jenkins. 2.74 , наведене нижче працює, не впевнений, коли, можливо, якщо хтось може відредагувати та додати версію вище

cleanWs()

З , я використовую , Jenkins версії 2.16 та плагіну очищення робочої області

step([$class: 'WsCleanup'])

для видалення робочої області.

Ви можете переглянути його, перейшовши на

JENKINS_URL/job/<any Pipeline project>/pipeline-syntax

Потім виберіть "крок: Загальний крок збірки" із кроку зразка, а потім виберіть "Видалити робочу область, коли збирання виконано" з кроку збірки


Це працює для мене: Jenkins 2.7.2, плагін очищення робочої області 0.30
dsh

4
Згідно з цим PR , включеним в 0,33 , це називається в конвеєрі як cleanWs.
gotgenes

93

Згадані рішення deleteDir()та cleanWs()(якщо використовується плагін очищення робочої області ) обидва працюють, але рекомендація використовувати його на етапі додаткової збірки, як правило, не є бажаним рішенням . Якщо збірка не вдається і трубопровід перерваний, ця стадія очищення ніколи не досягається, і тому робоча область не очищається від збійних збірок.

=> У більшості випадків ви, ймовірно, повинні ставити його в стані після вбудованого кроку, наприклад always:

pipeline {
    agent any
    stages {
        stage('Example') {
            steps {
                echo 'Hello World'
            }
        }
    }
    post { 
        always { 
            cleanWs()
        }
    }
}

5
Це було абсолютно ключовим для мого випадку використання. Мені потрібно архівувати артефакти з завдання, а виконання, cleanWs()як крок, видаляє їх до запуску команди архіву публікації. cleanWs()найімовірніше, завжди слід виконувати як команду після складання
Брендон

23
Якщо у вас є лише один postрозділ, його cleanWs()можна сміливо привести в alwaysстан, але найбезпечніше місце знаходиться в cleanupстані:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

68

Фактично функція deleteDir рекурсивно видаляє поточний каталог та його вміст. Символічні посилання та з'єднання не будуть дотримуватися, але будуть видалені.

Для видалення конкретного каталогу робочої області оберніть крок deleteDir на етапі dir.

dir('directoryToDelete') {
    deleteDir()
}

10
Хоча ОП запитувала просто, як видалити робочу область, ця відповідь є найбільш інформативною.
Джон Макгі

21

Я використовував deleteDir () наступним чином:

  post {
        always {
            deleteDir() /* clean up our workspace */
        }
    }

Однак мені довелося також завжди виконувати Успіх або Невдачу ПІСЛЯ, але ви не можете замовити умови публікації. Поточний порядок завжди, змінений, перерваний, невдалий, успішний, а потім нестабільний.

Однак є дуже корисна умова публікації, чистка якої завжди триває останньою, див. Https://jenkins.io/doc/book/pipeline/syntax/

Отже, врешті-решт моя посада була такою:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

Сподіваємось, це може бути корисним у деяких кутових випадках


Ми отримуємо помилку "недійсне очищення стану", ми використовуємо версію 2.89 Дженкінса
Аравінд Мерті

19

Використовуючи наступний сценарій конвеєра:

pipeline {
    agent { label "master" }
    options { skipDefaultCheckout() }
    stages {
        stage('CleanWorkspace') {
            steps {
                cleanWs()
            }
        }
    }
}

Виконайте такі дії:

  1. Перейдіть до останньої збірки роботи конвеєра, від якої ви хочете очистити робочу область.
  2. Клацніть посилання Replay у меню LHS.
  3. Вставте вищезазначений скрипт у текстове поле та натисніть Виконати

Додайте options { skipDefaultCheckout() }для трохи швидшого виконання.
AkisK

Удосконалена відповідь з вашою пропозицією @AkisK
Ендрю Грей

Здається, це єдиний варіант, який працює для очищення робочої області ДО, А НЕ ПІСЛЯ виконання трубопроводу, хоча я не хотів робити окремий крок для простої очищення. Дякую
Сергій Плешаков

11

Якщо ви використовували власну робочу область в 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()
            }
        }
    }
}

Цей фрагмент також буде працювати для робочої області за замовчуванням.


1
Також працює з докерізованим трубопроводом. Дуже корисно, дякую!
mcw

1
Це також єдина відповідь, яку я бачив, що також може вбити набридливу папку @libs
Девід

4

Ми впевнені, що ми працюємо з чистою робочою областю, використовуючи функцію додатка git. Ви можете додати додаткову поведінку, наприклад "Очистити перед оформленням замовлення". Ми також використовуємо це для "Відрізних застарілих гілок віддаленого відстеження".


4

Використання розширення '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


2

Для Jenkins 2.190.1 це працює точно:

    post {
        always {
            cleanWs deleteDirs: true, notFailBuild: true
        }
    }

1

Очищення : Оскільки після закінчення виконання трубопроводу гарантовано працювати розділ "Трубопровід" після закінчення виконання трубопроводу, ми можемо додати деякі повідомлення або інші кроки для виконання завдань щодо завершення, сповіщення або інших завдань, що закінчуються.

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 */
        }
    }
}

Це не спрацьовує, коли на етапах працюють різні раби!
codeGeass

1

У моєму випадку я хочу очистити старі файли на початку збирання, але це проблематично, оскільки вихідний код був перевірений.

Моє рішення - попросити git очистити будь-які файли (з останньої збірки), про які він не знає:

    sh "git clean -x -f"

Таким чином я можу запустити збірку чистою, і якщо вона не вдасться, робоча область не очищається і тому легко виводиться з ладу.


0

В даний час і deleteir (), і cleanWs () не працюють належним чином при використанні плагіна Jenkins kubernetes, робоча область стручка видаляється, але головна робоча область зберігається

це не повинно бути проблемою для стійких відділень, коли у вас є крок очищення робочої області перед аферою каси. В основному він буде повторно використовувати одне і те ж робоче середовище знову і знову: але при використанні багатогалузевих конвеєрів майстер зберігає всю робочу область та каталог git

Я вважаю, що це має бути проблемою для Дженкінса, будь-якого просвітництва тут?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.