Đường ống Jenkins xóa sạch không gian làm việc


141

Chúng tôi đang chạy Jenkins 2.x và yêu thích plugin Pipeline mới. Tuy nhiên, với rất nhiều nhánh trong một kho lưu trữ, không gian đĩa sẽ lấp đầy nhanh chóng.

Có plugin nào tương thích với Pipeline mà tôi có thể xóa sạch không gian làm việc trên bản dựng thành công không?

Câu trả lời:


110

Bạn có thể sử dụng deleteDir()như bước cuối cùng của đường ống Jenkinsfile (giả sử bạn không thay đổi thư mục làm việc).


7
Tôi có vấn đề với xóaDir (). Dường như ngẫu nhiên không thể xóa thư mục hiện tại khi nút được xây dựng trên một nô lệ. Việc xây dựng thất bại tất nhiên nếu điều này xảy ra. Vì vậy, hãy lưu ý nếu công việc của bạn thất bại ngẫu nhiên. Tôi không hiểu tại sao nút không chỉ làm sạch không gian làm việc khi nút bắt đầu xây dựng. Bởi vì nút có thể chạy bất cứ nơi nào bạn không thể đưa ra bất kỳ giả định nào về các tệp trong không gian làm việc.
ssindelar

1
Nhưng tôi nghĩ sẽ chỉ xóa không gian làm việc trên nút hiện tại. Trong trường hợp chung, đường ống của bạn sẽ chạy trên một số nô lệ khác nhau.
Marcus Philip

21
Tôi đặt điều này tại ăn xin ngay trước đó checkout scm.
jpbochi

2
Tôi cũng đặt nó ở đầu, trong trường hợp dự án thất bại trước khi nó kết thúc, hoặc bản dựng tiếp theo nằm trên một nô lệ khác.
davegallant

2
Đây là lệnh được ghi lại để dọn sạch không gian làm việc trong phần "Dọn dẹp và thông báo" trong tài liệu của Jenkins.
vossad01

130

Giống như @gotgenes đã chỉ ra với Phiên bản Jenkins. 2,74 , bên dưới hoạt động, không chắc chắn từ khi nào, có thể nếu ai đó có thể chỉnh sửa và thêm phiên bản ở trên

cleanWs()

Với, Jenkins Phiên bản 2.16Plugin Workspace Cleanup , tôi có, tôi sử dụng

step([$class: 'WsCleanup'])

để xóa không gian làm việc.

Bạn có thể xem nó bằng cách đi đến

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

Sau đó chọn "bước: Bước xây dựng chung" từ bước Mẫu và sau đó chọn "Xóa không gian làm việc khi quá trình xây dựng hoàn thành" từ bước Xây dựng


Điều này hoạt động với tôi: Jenkins 2.7.2, Plugin Workspace Cleanup 0.30
dsh

4
Theo PR này , bao gồm trong 0,33 , điều này được gọi trong đường ống như cleanWs.
gotgenes

93

Các giải pháp được đề cập deleteDir()cleanWs()(nếu sử dụng plugin dọn dẹp không gian làm việc ) đều hoạt động, nhưng khuyến nghị sử dụng nó trong bước xây dựng thêm thường không phải là giải pháp mong muốn . Nếu quá trình xây dựng thất bại và đường ống bị hủy bỏ, giai đoạn dọn dẹp này không bao giờ đạt được và do đó không gian làm việc không được làm sạch trên các bản dựng bị lỗi.

=> Trong hầu hết các trường hợp, có lẽ bạn nên đặt nó trong điều kiện sau bước xây dựng như always:

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

5
Điều này là hoàn toàn chính cho trường hợp sử dụng của tôi. Tôi cần lưu trữ các tạo phẩm từ công việc và chạy cleanWs()như một bước xóa chúng trước khi lệnh lưu trữ xây dựng bài đăng chạy. cleanWs()rất có thể luôn luôn được chạy như một lệnh xây dựng bài
Brandon

23
Nếu bạn chỉ có một postphần, cleanWs()có thể yên tâm được đưa vào alwaysđiều kiện, nhưng vị trí an toàn nhất là trong cleanupđiều kiện:post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

68

Trong thực tế, hàm removeDir sẽ xóa đệ quy thư mục hiện tại và nội dung của nó. Các liên kết và mối nối tượng trưng sẽ không được theo dõi mà sẽ bị xóa.

Để xóa một thư mục cụ thể của một không gian làm việc, hãy bao gồm bước xóaDir trong bước dir.

dir('directoryToDelete') {
    deleteDir()
}

10
Mặc dù OP chỉ hỏi cách xóa không gian làm việc, nhưng câu trả lời này là thông tin hữu ích nhất.
John McGehee

21

Tôi đã sử dụng removeDir () như sau:

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

Tuy nhiên, sau đó tôi cũng phải chạy Thành công hoặc Thất bại SAU luôn nhưng bạn không thể đặt hàng các điều kiện bài đăng. Trật tự hiện tại luôn luôn, thay đổi, bị hủy bỏ, thất bại, thành công và sau đó không ổn định.

Tuy nhiên, có một điều kiện bài đăng rất hữu ích, dọn dẹp luôn chạy sau cùng, xem https://jenkins.io/doc/book/pipeline/syntax/

Vì vậy, cuối cùng bài viết của tôi là như sau:

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

Hy vọng rằng điều này có thể hữu ích cho một số trường hợp góc


Chúng tôi gặp lỗi "dọn dẹp điều kiện không hợp lệ", chúng tôi đang sử dụng phiên bản Jenkins 2.89
Aravind Murthy

18

Sử dụng tập lệnh đường ống sau:

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

Thực hiện theo các bước sau:

  1. Điều hướng đến bản dựng mới nhất của công việc đường ống mà bạn muốn làm sạch không gian làm việc của.
  2. Nhấp vào liên kết Phát lại trong menu LHS.
  3. Dán đoạn script trên vào hộp văn bản và nhấp Run

Thêm options { skipDefaultCheckout() }để thực hiện nhanh hơn một chút.
AkisK

Câu trả lời được cải thiện với đề xuất của bạn @AkisK
Andrew Gray

Có vẻ như đây là tùy chọn duy nhất hoạt động để dọn sạch không gian làm việc TRƯỚC và KHÔNG SAU khi thực hiện một đường ống, mặc dù tôi không muốn có một bước riêng để làm sạch. Cảm ơn bạn
Serge Pleshakov

11

Nếu bạn đã sử dụng không gian làm việc tùy chỉnh trong Jenkins thì xóaDir () sẽ không xóa thư mục @tmp.

Vì vậy, để xóa @tmp cùng với không gian làm việc, hãy sử dụng như sau

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

Đoạn mã này cũng sẽ hoạt động cho không gian làm việc mặc định.


1
Cũng hoạt động với một đường ống dockerized. Rất hữu ích, cảm ơn!
mcw

1
Đây cũng là câu trả lời duy nhất tôi thấy có thể giết chết thư mục @libs phiền phức
David Lavender

4

Chúng tôi đảm bảo rằng chúng tôi đang làm việc với một không gian làm việc sạch sẽ bằng cách sử dụng một tính năng của plugin git. Bạn có thể thêm các hành vi bổ sung như 'Làm sạch trước khi thanh toán'. Chúng tôi cũng sử dụng điều này cho 'Prune stale các nhánh theo dõi từ xa'.


4

Sử dụng tiện ích mở rộng 'WipeWorkspace' dường như cũng hoạt động. Nó đòi hỏi hình thức dài hơn:

checkout([
   $class: 'GitSCM',
   branches: scm.branches,
   extensions: scm.extensions + [[$class: 'WipeWorkspace']],
   userRemoteConfigs: scm.userRemoteConfigs
])

Thêm chi tiết tại đây: https://support.cloudbees.com/hc/en-us/articles/226122247-How-to-Customize-Checkout-for-Pipeline-Multibranch-

Các tiện ích mở rộng GitSCM có sẵn tại đây: https://github.com/jenkinsci/git-plugin/tree/master/src/main/java/hudson/plugins/git/extensions/impl


2

Đối với Jenkins 2.190.1, điều này hoạt động chắc chắn:

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

1

Dọn dẹp : Vì phần bài của Đường ống được đảm bảo chạy khi kết thúc thực thi Đường ống, chúng tôi có thể thêm một số thông báo hoặc các bước khác để thực hiện quyết toán, thông báo hoặc các nhiệm vụ cuối Đường ống khác.

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

Điều này không hoạt động khi có các giai đoạn chạy trên các nô lệ khác nhau!
codeG ass

1

Trong trường hợp của tôi, tôi muốn xóa các tệp cũ khi bắt đầu xây dựng, nhưng điều này có vấn đề vì mã nguồn đã được kiểm tra.

Giải pháp của tôi là yêu cầu git xóa bất kỳ tệp nào (từ bản dựng cuối cùng) mà nó không biết về:

    sh "git clean -x -f"

Bằng cách đó, tôi có thể bắt đầu xây dựng sạch, và nếu thất bại, không gian làm việc không được dọn sạch và do đó dễ dàng gỡ lỗi.


0

Hiện tại cả hai bị xóa () và CleanWs () không hoạt động đúng khi sử dụng plugin Jenkins kubernetes, không gian làm việc pod bị xóa nhưng không gian làm việc chính vẫn tồn tại

nó không phải là một vấn đề đối với các chi nhánh liên tục, khi bạn có một bước để làm sạch không gian làm việc trước khi thanh toán lừa đảo. Về cơ bản, nó sẽ tái sử dụng cùng một không gian làm việc lặp đi lặp lại: nhưng khi sử dụng các đường ống đa chức năng, chủ sẽ giữ toàn bộ không gian làm việc và thư mục git

Tôi tin rằng đây có phải là một vấn đề với Jenkins, có giác ngộ nào ở đây không?

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.