Câu trả lời:
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).
checkout scm
.
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.16 và Plugin 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
Các giải pháp được đề cập deleteDir()
và 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()
}
}
}
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
post
phầ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() } }
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()
}
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
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:
options { skipDefaultCheckout() }
để thực hiện nhanh hơn một chút.
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.
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'.
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
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 */
}
}
}
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.
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?