Jenkins 파이프 라인 작업 공간 정리


142

우리는 Jenkins 2.x를 실행 중이며 새로운 Pipeline 플러그인을 좋아합니다. 그러나 저장소에 분기가 너무 많으면 디스크 공간이 빠르게 채워집니다.

파이프 라인과 호환되는 플러그인이 있습니까? 성공적인 빌드에서 작업 공간을 지울 수 있습니까?

답변:


110

deleteDir()파이프 라인 Jenkinsfile의 마지막 단계로 사용할 수 있습니다 (작업 디렉토리를 변경하지 않았다고 가정).


7
deleteDir ()에 문제가 있습니다. 노드가 슬레이브에서 빌드 될 때 현재 디렉토리를 임의로 삭제할 수없는 것 같습니다. 이런 일이 발생하면 빌드는 실패합니다. 따라서 작업이 무작위로 실패하는지 확인하십시오. 노드가 빌드를 시작할 때 노드가 작업 공간을 정리하는 것이 아닌 이유를 이해하지 못합니다. 노드는 어디에서나 실행될 수 있기 때문에 작업 공간의 파일에 대해 어떤 가정도 할 수 없습니다.
ssindelar

1
그러나 현재 노드의 작업 공간 만 삭제한다고 생각합니다. 일반적인 경우 파이프 라인은 여러 다른 슬레이브에서 실행됩니다.
Marcus Philip

21
나는 이것을 바로 구걸에 넣었다 checkout scm.
jpbochi

2
프로젝트가 끝날 때까지 실패하거나 다음 빌드가 다른 슬레이브에있는 경우를 대비하여 처음에도 이것을 넣었습니다.
davegallant

2
Jenkins 문서 의 "정리 및 알림" 섹션 에서 작업 공간을 정리하기 위해 문서화 된 명령 입니다.
vossad01

131

@gotgenes가 Jenkins Version에서 지적한 것처럼 . 2.74 , 아래는 작동합니다. 언제든지, 누군가가 위의 버전을 편집하고 추가 할 수 있다면

cleanWs()

젠킨스 버전 2.16작업 공간 정리 플러그인 , 내가 가지고, 내가 사용

step([$class: 'WsCleanup'])

작업 공간을 삭제합니다.

당신은로 이동하여 그것을 볼 수 있습니다

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

그런 다음 샘플 단계에서 "단계 : 일반 빌드 단계"를 선택한 다음 빌드 단계에서 "빌드 완료시 작업 공간 삭제"를 선택하십시오.


이것은 나를 위해 작동합니다 : Jenkins 2.7.2, 작업 공간 정리 플러그인 0.30
dsh

4
0.33에 포함 된 이 PR 에 따르면 이것을 파이프 라인에서로 호출합니다 . cleanWs
gotgenes

93

언급 된 솔루션 deleteDir()작업 공간 정리 플러그인을cleanWs() 사용하는 경우 둘 다 작동 하지만 추가 빌드 단계에서이를 사용하도록 권장하는 것은 일반적으로 원하는 솔루션이 아닙니다 . 빌드가 실패하고 파이프 라인이 중단되면이 정리 단계에 도달하지 않으므로 실패한 빌드에서 작업 공간이 정리되지 않습니다.

=> 대부분의 경우 다음 과 같은 빌드 후 단계 조건에 배치해야합니다 always.

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

5
이것은 내 유스 케이스의 핵심이었습니다. 작업에서 아티팩트를 아카이브해야 cleanWs()하며 단계 빌드로 실행하면 사후 빌드 아카이브 명령이 실행되기 전에 아티팩트가 삭제됩니다. cleanWs()항상 빌드 후 명령으로 실행되어야합니다
Brandon

23
post섹션 이 하나만있는 경우 cleanWs()안전하게 always조건에 넣을 수 있지만 가장 안전한 지점이 cleanup조건 내에 있습니다.post { cleanup { cleanWs() } }
ᴠɪɴᴄᴇɴᴛ

68

실제로 deleteDir 함수는 현재 디렉토리와 그 내용을 반복적으로 삭제합니다. 심볼릭 링크 및 접합은 따르지 않지만 제거됩니다.

작업 공간의 특정 디렉토리를 삭제하려면 dir 단계에서 deleteDir 단계를 랩핑하십시오.

dir('directoryToDelete') {
    deleteDir()
}

10
OP가 작업 공간을 삭제하는 방법 만 물었지만이 답변이 가장 유익합니다.
John McGehee

21

다음과 같이 deleteDir ()을 사용했습니다.

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

그러나 그 후 항상 성공 또는 실패 후에도 실행해야했지만 사후 조건을 주문할 수는 없습니다. 현재 순서는 항상 변경, 중단, 실패, 성공 및 불안정합니다.

그러나, 매우 유용한 게시물에 조건이 정리 항상 마지막에 실행을 참조 https://jenkins.io/doc/book/pipeline/syntax/은

결국 내 게시물은 다음과 같습니다.

post {
    always {

    }
    success{

    }
    failure {

    }
    cleanup{
        deleteDir()
    }
}

희망적으로 이것은 일부 코너 경우에 도움이 될 수 있습니다


우리는 오류 "잘못된 조건의 정리"를 얻을, 우리는 젠킨스 버전 2.89 사용하는
아 라빈 드 머시

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
도 커화 된 파이프 라인과도 작동합니다. 매우 도움이되었습니다. 감사합니다!
mcw

1
이것은 또한 내가 보았던 유일한 답변입니다. 성가신 @libs 폴더도 죽일 수 있습니다
David Lavender

4

우리는 git 플러그인의 기능을 사용하여 깨끗한 작업 공간으로 작업하고 있는지 확인하십시오. '체크 아웃 전 정리'와 같은 동작을 추가 할 수 있습니다. 우리는 이것을 'Prune stale remote-tracking branch'에도 사용합니다.


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 {
    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"

그렇게하면 빌드 아웃 정리를 시작할 수 있으며 실패하면 작업 공간이 정리되지 않으므로 쉽게 디버깅 할 수 있습니다.


0

Jenkins kubernetes 플러그인을 사용할 때 deletedir () 및 cleanWs () 둘 다 제대로 작동하지 않습니다. 포드 작업 영역은 삭제되지만 마스터 작업 영역은 유지됩니다.

체크 아웃 사기 전에 작업 영역을 정리하는 단계가있는 경우 지속 분기에는 문제가되지 않습니다. 기본적으로 동일한 작업 공간을 반복해서 재사용 할 것입니다. 그러나 다중 분기 파이프 라인을 사용하는 경우 마스터는 전체 작업 공간과 git 디렉토리를 유지합니다

나는 이것이 젠킨스와 관련된 문제라고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.