詹金斯: 有办法清理詹金斯的工作区吗?

如何清理 Jenkins 中的工作区? 我使用 AccuRev作为版本控制工具。

我在詹金斯创建了 freestyle项目。

321410 次浏览

有一种方法可以清理 Jenkins 中的工作区,您可以在构建前或构建后清理工作区。

首先,安装 工作区清理插件

在构建之前清理工作区: 在 建设环境,下选中“在构建开始之前删除工作区”复选框。

在构建后清理工作区: 在标题 构建后操作下,从 添加生成后操作下拉菜单中选择 构建完成后删除工作区

您将需要安装此插件之前,上述选项将出现

工作区清理插件

此插件将复选框添加到所有作业配置中,以允许您在运行任何步骤(包括源代码管理)之前删除整个工作区

这对于确保始终从一个已知点开始以保证生成将如何运行非常有用

如果你想手动清理它,对于我的版本的 jenkins (似乎不需要额外的插件安装,但谁知道) ,有一个“工作空间”链接在左侧列,点击你的项目,然后在“工作空间”,然后一个“清除当前工作空间”链接出现在它的左侧列下方。 screenshot

您可以在 管好詹金斯脚本控制台中运行下面的脚本,一次性删除所有作业的工作空间。我们这样做是为了清理文件系统上的空间。

import hudson.model.*
// For each project
for(item in Hudson.instance.items) {
// check that job is not building
if(!item.isBuilding()) {
println("Wiping out workspace of job "+item.name)
item.doDoWipeOutWorkspace()
}
else {
println("Skipping job "+item.name+", currently building")
}
}

除了上述解决方案之外,还有一种更“通用”的方法——直接从 Linux 机器上删除最大的空间消耗者。你可按以下步骤办理:

  1. 登录到詹金斯机(腻子) enter image description here
  2. 到 Jenkins 安装路径的 cd 文件

使用 ls-lart 列出隐藏文件夹也,通常 jenkin 安装放在. jenkins/文件夹中

[xxxxx ~]$ ls -lart


drwxrwxr-x 12 xxxx  4096 Feb  8 02:08 .jenkins/
  1. 列出文件夹空间

Use df -h以高级显示磁盘空间

du -sh ./*/列出当前文件夹中每个子文件夹的总内存 路径。

du -a /etc/ | sort -n -r | head -n 10将列出前10个目录 占用/etc/中的磁盘空间

  1. 删除旧版本或其他大型文件夹

通常./job/文件夹或./workspace/文件夹可以是最大的 请根据需要进入并删除(不要删除整个文件夹)。

rm -rf theFolderToDelete

enter image description here

不允许发表评论,因此:

来自 抬头的答案很好,但是如果你有詹金斯管道工作混合自由式工作。管道作业上没有 DoWipeWorkspace 这样的方法。 因此,我修改了脚本,以便跳过这些步骤:

import hudson.model.*
import org.jenkinsci.plugins.workflow.job.WorkflowJob


// For each project
for(item in Hudson.instance.items) {
// check that job is not building
if(!item.isBuilding() && !(item instanceof WorkflowJob))
{
println("Wiping out workspace of job "+item.name)
item.doDoWipeOutWorkspace()
}
else {
println("Skipping job "+item.name+", currently building")
}
}

如果需要,你也可以通过职位名称进行过滤: item.getDisplayName().toLowerCase().contains("release")

重要: 删除给定 Jenkins 作业的工作区是安全的,只要该作业当前没有运行!

注意: 我假设您的 $JENKINS_HOME设置为默认值: /var/jenkins_home

清理一个工作区

rm -rf /var/jenkins_home/workspaces/<workspace>

清理所有工作区

rm -rf /var/jenkins_home/workspaces/*

除少数例外情况外,清理所有工作区

这个例子使用 grep 创建一个白名单:

ls /var/jenkins_home/workspace \
| grep -v -E '(job-to-skip|another-job-to-skip)$' \
| xargs -I {} rm -rf /var/jenkins_home/workspace/{}

清理10个最大的工作区

这个程序使用 du 和 sort 来按照从最大到最小的顺序列出工作区。然后,它用头抓住前10个:

du -d 1 /var/jenkins_home/workspace \
| sort -n -r \
| head -n 10 \
| xargs -I {} rm -rf /var/jenkins_home/workspace/{}

工作区清理插件

在詹金斯的文件添加

cleanWs()

这将在构建完成后删除工作区

假设问题是关于清理当前作业的工作区,您可以运行:

test -n "$WORKSPACE" && rm -rf "$WORKSPACE"/*

如果你只想删除一个 dir (或文件) ,你可以使用 Groovy 和 Manage Jenkins → Scripts Console 运行一个脚本来删除它。

例如,您可以使用以下命令查看文件:

dh = new File('./bitnami/jenkins/jenkins_home/workspace/jobname/folder')
dh.eachFile {
println(it)
}

然后,当你在 dh中有你想删除的文件夹时,你可以简单地附加下面的代码:

dh.deleteDir()

然后就会被删除。

注意: 示例中显示的路径用于 Bitnami Jenkins 安装,您的路径可能不同。

有一个选项可以这样做
这个选项是默认的,至少在 Jenkins 2.236版本中是这样的

对于那些在 Docker 中构建了 root用户版本的用户,以下方法可能会有所帮助:

def cleanupWorkspaceAsRoot() {
log.notice "Removing workspace contents: $WORKSPACE !"
docker.image('alpine').inside('-u root --env WORKSPACE') { // use docker instead of sudo // TODO make ALL docker builds work as non-ROOT, so there is no root-owned files
sh 'test -n "$WORKSPACE" && rm -rf "$WORKSPACE"/*'
}
}

如果使用 Windows 作为代理,则可以使用。

rmdir /s /q "folder path ending with \"

如果你使用 linux 机器作为代理,你可以使用,

rm -rvf "directory"

但我不会建议这种方法,因为它将创造多个冲突和建立失败的机会。

最好的方法是使用管道依赖。创建一个主管道以删除要删除的管道的目录,并在删除成功后运行管道。一旦完成删除,您可以使用触发器来启动新的生成,反之亦然,一旦生成完成,您可以使用触发器来删除目录。

pipeline {
agent
{
node {
label 'master'
customWorkspace "${env.JobPath}"
}
}


stages
{
stage('Start') {
steps {
sh 'ls'
}
}


stage ('Invoke_pipeline') {
steps {
build job: 'pipeline1', parameters: [
string(name: 'param1', value: "value1")
]
}
}


stage('End') {
steps {
sh 'ls'
}
}
}
}

代码来源

Https://www.jenkins.io/doc/pipeline/steps/pipeline-build-step/