जवाबों:
आप deleteDir()
पाइपलाइन जेन्किन्सफाइल के अंतिम चरण के रूप में उपयोग कर सकते हैं (यह मानते हुए कि आपने कार्य निर्देशिका को नहीं बदला है)।
checkout scm
।
जैसे @gotgenes ने जेनकिंस संस्करण के साथ बताया । 2.74 , नीचे काम करता है, निश्चित नहीं है कि कब से, हो सकता है कि अगर कोई ऊपर संस्करण को संपादित और जोड़ सकता है
cleanWs()
के साथ, जेनकींस संस्करण 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 फ़ंक्शन वर्तमान निर्देशिका और इसकी सामग्री को पुन: हटा देता है। प्रतीकात्मक लिंक और जंक्शनों का पालन नहीं किया जाएगा, लेकिन हटा दिया जाएगा।
किसी कार्यक्षेत्र की विशिष्ट निर्देशिका को हटाने के लिए डिलीट स्टेप को dir स्टेप में लपेटें।
dir('directoryToDelete') {
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-Peline-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"
इस तरह मैं बिल्ड क्लीन को शुरू कर सकता हूं, और अगर यह विफल हो जाता है, तो कार्यक्षेत्र को साफ नहीं किया जाता है और इसलिए आसानी से डीबग करने योग्य है।
जेनकींस कुबेरनेट प्लग इन का उपयोग करने पर वर्तमान में डिलीट () और क्लीनव्स () दोनों ठीक से काम नहीं करते हैं, पॉड वर्कस्पेस हटा दिया जाता है लेकिन मास्टर वर्कस्पेस जारी रहता है
यह लगातार शाखाओं के लिए एक समस्या नहीं होनी चाहिए, जब आपके पास चेकआउट घोटाले से पहले कार्यक्षेत्र को साफ करने का एक कदम है। यह मूल रूप से एक ही कार्यक्षेत्र को बार-बार पुन: उपयोग करेगा: लेकिन मल्टीब्रांच पाइपलाइनों का उपयोग करते समय मास्टर पूरे कार्यक्षेत्र और गिट निर्देशिका को रखता है
मेरा मानना है कि यह जेनकींस के साथ एक मुद्दा होना चाहिए, यहां कोई भी प्रबुद्धता है?