เรากำลังเรียกใช้ Jenkins 2.x และชอบปลั๊กอินของ Pipeline ตัวใหม่ อย่างไรก็ตามด้วยสาขาจำนวนมากในพื้นที่เก็บข้อมูลพื้นที่ดิสก์จะเต็มเร็วขึ้น
มีปลั๊กอินใดบ้างที่เข้ากันได้กับ Pipeline ที่ฉันสามารถลบพื้นที่ทำงานออกจากบิลด์ที่ประสบความสำเร็จได้หรือไม่?
เรากำลังเรียกใช้ Jenkins 2.x และชอบปลั๊กอินของ Pipeline ตัวใหม่ อย่างไรก็ตามด้วยสาขาจำนวนมากในพื้นที่เก็บข้อมูลพื้นที่ดิสก์จะเต็มเร็วขึ้น
มีปลั๊กอินใดบ้างที่เข้ากันได้กับ Pipeline ที่ฉันสามารถลบพื้นที่ทำงานออกจากบิลด์ที่ประสบความสำเร็จได้หรือไม่?
คำตอบ:
คุณสามารถใช้deleteDir()
เป็นขั้นตอนสุดท้ายของไปป์ไลน์ Jenkinsfile (สมมติว่าคุณไม่ได้เปลี่ยนไดเรกทอรีทำงาน)
checkout scm
ฉันใส่นี้จุดเริ่มต้นที่เหมาะสมก่อน
เช่นเดียวกับ @ gotgenes ชี้ให้เห็นด้วยเจนกินส์เวอร์ชั่น 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()
เป็นขั้นตอนการลบพวกเขาก่อนที่คำสั่ง post build เก็บถาวรทำงาน cleanWs()
น่าจะมีการเรียกใช้เป็นคำสั่งการสร้างโพสต์เสมอ
post
ส่วนเดียวcleanWs()
สามารถใส่always
เงื่อนไขได้อย่างปลอดภัยแต่จุดที่ปลอดภัยที่สุดอยู่ในcleanup
เงื่อนไข:post { cleanup { cleanWs() } }
ในความเป็นจริงฟังก์ชั่น deleteDir จะลบไดเรกทอรีปัจจุบันและเนื้อหาซ้ำ ๆ ลิงก์สัญลักษณ์และทางแยกจะไม่ถูกติดตาม แต่จะถูกลบออก
ในการลบไดเร็กทอรีเฉพาะของเวิร์กสเปซให้ห่อขั้นตอน deleteDir ในขั้นตอน dir
dir('directoryToDelete') {
deleteDir()
}
ฉันใช้ deleteDir () ดังต่อไปนี้:
post {
always {
deleteDir() /* clean up our workspace */
}
}
อย่างไรก็ตามฉันต้องเรียกใช้ Success หรือ Failure AFTER ด้วยเสมอ แต่คุณไม่สามารถสั่งเงื่อนไขการโพสต์ได้ คำสั่งซื้อปัจจุบันเปลี่ยนแปลงเปลี่ยนแปลงล้มเหลวล้มเหลวสำเร็จแล้วไม่เสถียร
อย่างไรก็ตามมีเงื่อนไขการโพสต์ที่มีประโยชน์มากคือการล้างข้อมูลซึ่งจะทำงานล่าสุดเสมอดู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()
}
}
}
}
ตัวอย่างนี้จะทำงานสำหรับพื้นที่ทำงานเริ่มต้นด้วย
เราตรวจสอบให้แน่ใจว่าเรากำลังทำงานกับพื้นที่ทำงานที่สะอาดโดยใช้คุณสมบัติของปลั๊กอิน 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
สำหรับ Jenkins 2.190.1 มันใช้งานได้อย่างแน่นอน:
post {
always {
cleanWs deleteDirs: true, notFailBuild: true
}
}
การล้างข้อมูล : เนื่องจากส่วนการโพสต์ของ Pipeline รับประกันว่าจะทำงานเมื่อสิ้นสุดการประมวลผล Pipeline เราสามารถเพิ่มการแจ้งเตือนหรือขั้นตอนอื่น ๆ เพื่อดำเนินการขั้นสุดท้ายการแจ้งเตือนหรืองานอื่น ๆ ที่สิ้นสุดของท่อ
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"
ด้วยวิธีนี้ฉันสามารถเริ่มต้น build out ใหม่ได้และหากล้มเหลวเวิร์กสเปซจะไม่ถูกล้างออกและสามารถ debuggable ได้ง่าย
ปัจจุบันทั้ง deleteir () และ cleanWs () ทำงานไม่ถูกต้องเมื่อใช้ปลั๊กอิน Jenkins kubernetes พื้นที่ทำงานของ pod จะถูกลบ แต่พื้นที่ทำงานหลักยังคงอยู่
มันไม่ควรเป็นปัญหาสำหรับสาขาถาวรเมื่อคุณมีขั้นตอนในการทำความสะอาดพื้นที่ทำงานก่อนที่จะทำการเช็คเอาต์หลอกลวง โดยทั่วไปจะใช้พื้นที่ทำงานเดิมซ้ำแล้วซ้ำอีก: แต่เมื่อใช้ไพพ์ไลน์แบบหลายสาขาต้นแบบจะเก็บรักษาพื้นที่ทำงานทั้งหมดและไดเรกทอรี git
ฉันเชื่อว่านี่น่าจะเป็นปัญหากับเจนกินส์การรู้แจ้งใด ๆ ที่นี่?