जेनकिंस पाइपलाइन कार्यक्षेत्र से बाहर पोंछे


142

हम जेनकिंस 2.x चला रहे हैं और नए पाइपलाइन प्लगइन से प्यार करते हैं। हालांकि, एक रिपॉजिटरी में कई शाखाओं के साथ, डिस्क स्थान जल्दी से भर जाता है।

क्या कोई प्लगइन है जो पाइपलाइन के साथ संगत है कि मैं एक सफल निर्माण पर कार्यक्षेत्र को मिटा सकता हूं?

जवाबों:


110

आप deleteDir()पाइपलाइन जेन्किन्सफाइल के अंतिम चरण के रूप में उपयोग कर सकते हैं (यह मानते हुए कि आपने कार्य निर्देशिका को नहीं बदला है)।


7
मुझे डिलीटडायर () की समस्या है। ऐसा लगता है कि जब एक दास पर नोड का निर्माण हो जाता है तो यह वर्तमान निर्देशिका को हटाने में सक्षम नहीं होता है। यदि ऐसा होता है, तो पाठ्यक्रम निश्चित रूप से विफल हो जाता है। यदि आपकी नौकरियां बेतरतीब ढंग से विफल हो जाती हैं तो जागरूक रहें। मुझे समझ नहीं आ रहा है कि जब नोड का निर्माण शुरू होता है तो नोड सिर्फ इसे कार्यक्षेत्र में साफ क्यों नहीं करता है। क्योंकि नोड कहीं भी चल सकता है आप कार्यक्षेत्र में फ़ाइलों के बारे में वैसे भी कोई धारणा नहीं बना सकते हैं।
ssindelar

1
लेकिन मुझे लगता है कि केवल वर्तमान नोड पर कार्यक्षेत्र को हटा देगा। सामान्य स्थिति में आपकी पाइपलाइन कई अलग-अलग दासों पर चलेगी।
मार्कस फिलिप

21
मैंने इसे पहले भीख मांगने के लिए रखा था checkout scm
10

2
मैंने इसे शुरुआत में भी रखा है, अगर परियोजना अंत तक पहुंचने से पहले विफल हो जाती है, या अगला निर्माण एक अलग दास पर होता है।
davegallant

2
यह जेनकिंस प्रलेखन के "क्लीनिंग और नोटिफिकेशन" खंड में कार्यक्षेत्र को साफ करने के लिए प्रलेखित है।
vossad01

131

जैसे @gotgenes ने जेनकिंस संस्करण के साथ बताया 2.74 , नीचे काम करता है, निश्चित नहीं है कि कब से, हो सकता है कि अगर कोई ऊपर संस्करण को संपादित और जोड़ सकता है

cleanWs()

के साथ, जेनकींस संस्करण 2.16 और कार्यस्थान सफाई प्लगइन , मेरे पास है, मैं उपयोग

step([$class: 'WsCleanup'])

कार्यक्षेत्र को हटाने के लिए।

आप इसे जाकर देख सकते हैं

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

फिर सैंपल स्टेप से "स्टेप: जनरल बिल्ड स्टेप" का चयन करें और फिर बिल्ड स्टेप से "डिलीट वर्कस्पेस तब बिल्ड करें" का चयन करें


यह मेरे लिए काम करता है: जेनकिंस 2.7.2, वर्कस्पेस क्लीनअप प्लगिन 0.30
dsh

4
0.33 में शामिल इस पीआर के अनुसार , इसे पाइपलाइन में कहा जाता है । cleanWs
गेटगेन्स

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() } }
at

68

वास्तव में DeleteDir फ़ंक्शन वर्तमान निर्देशिका और इसकी सामग्री को पुन: हटा देता है। प्रतीकात्मक लिंक और जंक्शनों का पालन नहीं किया जाएगा, लेकिन हटा दिया जाएगा।

किसी कार्यक्षेत्र की विशिष्ट निर्देशिका को हटाने के लिए डिलीट स्टेप को dir स्टेप में लपेटें।

dir('directoryToDelete') {
    deleteDir()
}

10
यद्यपि ओपी ने केवल पूछा कि कार्यक्षेत्र को कैसे हटाया जाए, यह उत्तर सबसे अधिक जानकारीपूर्ण है।
जॉन मैकगी

21

मैंने डिलीटडायर () का उपयोग इस प्रकार किया:

  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. LHS मेनू में रिप्ले लिंक पर क्लिक करें।
  3. उपरोक्त स्क्रिप्ट को टेक्स्ट बॉक्स में पेस्ट करें और रन पर क्लिक करें

options { skipDefaultCheckout() }थोड़ा तेज निष्पादन के लिए जोड़ें ।
११ पर

आपके सुझाव के साथ बेहतर जवाब @AkisK
एंड्रयू ग्रे

ऐसा लगता है कि केवल एक ही विकल्प है जो कार्यक्षेत्र की सफाई के लिए काम करता है पहले और न ही एक पाइपलाइन को निष्पादित करने के बाद, भले ही मैं सिर्फ साफ करने के लिए एक अलग कदम नहीं रखना चाहता था। धन्यवाद
सेर्गेई Pleshakov

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 plugin की एक सुविधा का उपयोग करके एक साफ कार्यक्षेत्र के साथ काम कर रहे हैं। आप 'चेकआउट से पहले क्लीन' जैसे अतिरिक्त व्यवहार जोड़ सकते हैं। हम इसका उपयोग 'प्रून स्टेल रिमोट-ट्रैकिंग शाखाओं' के लिए करते हैं।


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-Peline-Multibranch-

यहाँ उपलब्ध GitSCM एक्सटेंशन: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl


2

जेनकिंस 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

जेनकींस कुबेरनेट प्लग इन का उपयोग करने पर वर्तमान में डिलीट () और क्लीनव्स () दोनों ठीक से काम नहीं करते हैं, पॉड वर्कस्पेस हटा दिया जाता है लेकिन मास्टर वर्कस्पेस जारी रहता है

यह लगातार शाखाओं के लिए एक समस्या नहीं होनी चाहिए, जब आपके पास चेकआउट घोटाले से पहले कार्यक्षेत्र को साफ करने का एक कदम है। यह मूल रूप से एक ही कार्यक्षेत्र को बार-बार पुन: उपयोग करेगा: लेकिन मल्टीब्रांच पाइपलाइनों का उपयोग करते समय मास्टर पूरे कार्यक्षेत्र और गिट निर्देशिका को रखता है

मेरा मानना ​​है कि यह जेनकींस के साथ एक मुद्दा होना चाहिए, यहां कोई भी प्रबुद्धता है?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.