Jenkins Pipeline เช็ดพื้นที่ทำงานออก


142

เรากำลังเรียกใช้ Jenkins 2.x และชอบปลั๊กอินของ Pipeline ตัวใหม่ อย่างไรก็ตามด้วยสาขาจำนวนมากในพื้นที่เก็บข้อมูลพื้นที่ดิสก์จะเต็มเร็วขึ้น

มีปลั๊กอินใดบ้างที่เข้ากันได้กับ Pipeline ที่ฉันสามารถลบพื้นที่ทำงานออกจากบิลด์ที่ประสบความสำเร็จได้หรือไม่?

คำตอบ:


110

คุณสามารถใช้deleteDir()เป็นขั้นตอนสุดท้ายของไปป์ไลน์ Jenkinsfile (สมมติว่าคุณไม่ได้เปลี่ยนไดเรกทอรีทำงาน)


7
ฉันมีปัญหากับ deleteDir () ดูเหมือนจะสุ่มไม่สามารถลบไดเรกทอรีปัจจุบันเมื่อโหนดได้รับการสร้างบนทาส งานสร้างล้มเหลวแน่นอนหากเกิดเหตุการณ์เช่นนี้ ดังนั้นควรระวังหากงานของคุณล้มเหลวแบบสุ่ม ฉันไม่เข้าใจว่าทำไมไม่เพียง แต่ล้างมันพื้นที่ทำงานเมื่อโหนดเริ่มสร้าง เนื่องจากโหนดสามารถทำงานได้ทุกที่คุณไม่สามารถทำการสันนิษฐานเกี่ยวกับไฟล์ในพื้นที่ทำงานได้
ssindelar

1
แต่ฉันคิดว่าจะลบพื้นที่ทำงานบนโหนดปัจจุบันเท่านั้น ในกรณีทั่วไปไปป์ไลน์ของคุณจะทำงานกับทาสหลายคน
มาร์คัสฟิลิป

21
checkout scmฉันใส่นี้จุดเริ่มต้นที่เหมาะสมก่อน
jpbochi

2
ฉันวางสิ่งนี้ไว้ที่จุดเริ่มต้นเช่นกันในกรณีที่โครงการล้มเหลวก่อนที่จะถึงจุดสิ้นสุดหรืองานสร้างถัดไปอยู่บนทาสคนอื่น
davegallant

2
นี่คือคำสั่งที่บันทึกไว้เพื่อล้างพื้นที่ทำงานในส่วน"การทำความสะอาดและการแจ้งเตือน"ของเอกสารประกอบของ Jenkins
vossad01

131

เช่นเดียวกับ @ gotgenes ชี้ให้เห็นด้วยเจนกินส์เวอร์ชั่น 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
ตามที่ประชาสัมพันธ์นี้รวมอยู่ใน0.33cleanWsนี้เรียกว่าในท่อเป็น
gotgenes

93

ที่กล่าวถึงการแก้ปัญหาdeleteDir()และcleanWs()(ถ้าใช้พื้นที่ทำงานทำความสะอาดปลั๊กอิน ) การทำงานของทั้งสองแต่ข้อเสนอแนะที่จะใช้ในการสร้างขั้นตอนพิเศษที่มักจะไม่ได้แก้ปัญหาที่ต้องการ หากบิลด์ล้มเหลวและไปป์ไลน์ถูกยกเลิกขั้นตอนการล้างข้อมูลนี้จะไม่ถึงและทำให้พื้นที่ทำงานไม่ถูกล้างบนบิลด์ที่ล้มเหลว

=> ในกรณีส่วนใหญ่คุณควรวางไว้ในเงื่อนไขหลังการสร้างเช่นalways:

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

5
นี่เป็นสิ่งสำคัญอย่างยิ่งสำหรับกรณีการใช้งานของฉัน ฉันต้องการเก็บถาวรสิ่งประดิษฐ์จากงานและเรียกใช้cleanWs()เป็นขั้นตอนการลบพวกเขาก่อนที่คำสั่ง post build เก็บถาวรทำงาน cleanWs()น่าจะมีการเรียกใช้เป็นคำสั่งการสร้างโพสต์เสมอ
แบรนดอน

23
หากคุณมีเพียงpostส่วนเดียวcleanWs()สามารถใส่alwaysเงื่อนไขได้อย่างปลอดภัยแต่จุดที่ปลอดภัยที่สุดอยู่ในcleanupเงื่อนไข:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

68

ในความเป็นจริงฟังก์ชั่น deleteDir จะลบไดเรกทอรีปัจจุบันและเนื้อหาซ้ำ ๆ ลิงก์สัญลักษณ์และทางแยกจะไม่ถูกติดตาม แต่จะถูกลบออก

ในการลบไดเร็กทอรีเฉพาะของเวิร์กสเปซให้ห่อขั้นตอน deleteDir ในขั้นตอน dir

dir('directoryToDelete') {
    deleteDir()
}

10
แม้ว่า OP จะถามถึงวิธีการลบพื้นที่ทำงานเท่านั้นคำตอบนี้เป็นข้อมูลที่ดีที่สุด
John McGehee

21

ฉันใช้ deleteDir () ดังต่อไปนี้:

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

อย่างไรก็ตามฉันต้องเรียกใช้ Success หรือ Failure AFTER ด้วยเสมอ แต่คุณไม่สามารถสั่งเงื่อนไขการโพสต์ได้ คำสั่งซื้อปัจจุบันเปลี่ยนแปลงเปลี่ยนแปลงล้มเหลวล้มเหลวสำเร็จแล้วไม่เสถียร

อย่างไรก็ตามมีเงื่อนไขการโพสต์ที่มีประโยชน์มากคือการล้างข้อมูลซึ่งจะทำงานล่าสุดเสมอดูhttps://jenkins.io/doc/book/pipeline/syntax/

ดังนั้นในที่สุดโพสต์ของฉันเป็นดังนี้:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

หวังว่านี่อาจเป็นประโยชน์สำหรับบางกรณีที่มุม


เราได้รับข้อผิดพลาด "การทำความสะอาดสภาพที่ไม่ถูกต้อง" เราใช้ Jenkins เวอร์ชัน 2.89
Aravind Murthy

19

ใช้สคริปต์ขั้นตอนต่อไปนี้:

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

ทำตามขั้นตอนเหล่านี้:

  1. นำทางไปยังบิลด์ล่าสุดของงานไปป์ไลน์ที่คุณต้องการทำความสะอาดพื้นที่ทำงานของ
  2. คลิกลิงก์เล่นซ้ำในเมนู LHS
  3. วางสคริปต์ด้านบนในกล่องข้อความแล้วคลิกเรียกใช้

เพิ่มoptions { skipDefaultCheckout() }สำหรับการดำเนินการที่เร็วขึ้นเล็กน้อย
AkisK

ปรับปรุงคำตอบด้วยคำแนะนำของคุณ @AkisK
Andrew Grey

ดูเหมือนว่านี่เป็นตัวเลือกเดียวที่ใช้ในการล้างเวิร์กสเปซก่อนและหลังการใช้งานไพพ์ไลน์แม้ว่าฉันไม่ต้องการแยกขั้นตอนเพื่อทำความสะอาดก็ตาม ขอบคุณ
Sergey 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
ยังทำงานร่วมกับไปป์ไลน์ dockerized มีประโยชน์มากขอบคุณ!
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 รับประกันว่าจะทำงานเมื่อสิ้นสุดการประมวลผล 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 */
        }
    }
}

สิ่งนี้ไม่ทำงานเมื่อมีสเตจทำงานบนทาสที่แตกต่างกัน!
codeGeass

1

ในกรณีของฉันฉันต้องการล้างไฟล์เก่าที่จุดเริ่มต้นของบิลด์ แต่นี่เป็นปัญหาเนื่องจากซอร์สโค้ดถูกตรวจสอบแล้ว

ทางออกของฉันคือขอ git เพื่อล้างไฟล์ใด ๆ (จากการสร้างล่าสุด) ที่ไม่ทราบเกี่ยวกับ:

    sh "git clean -x -f"

ด้วยวิธีนี้ฉันสามารถเริ่มต้น build out ใหม่ได้และหากล้มเหลวเวิร์กสเปซจะไม่ถูกล้างออกและสามารถ debuggable ได้ง่าย


0

ปัจจุบันทั้ง deleteir () และ cleanWs () ทำงานไม่ถูกต้องเมื่อใช้ปลั๊กอิน Jenkins kubernetes พื้นที่ทำงานของ pod จะถูกลบ แต่พื้นที่ทำงานหลักยังคงอยู่

มันไม่ควรเป็นปัญหาสำหรับสาขาถาวรเมื่อคุณมีขั้นตอนในการทำความสะอาดพื้นที่ทำงานก่อนที่จะทำการเช็คเอาต์หลอกลวง โดยทั่วไปจะใช้พื้นที่ทำงานเดิมซ้ำแล้วซ้ำอีก: แต่เมื่อใช้ไพพ์ไลน์แบบหลายสาขาต้นแบบจะเก็บรักษาพื้นที่ทำงานทั้งหมดและไดเรกทอรี git

ฉันเชื่อว่านี่น่าจะเป็นปัญหากับเจนกินส์การรู้แจ้งใด ๆ ที่นี่?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.