有什么方法可以清理Jenkins工作区吗?


Answers:


91

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

首先,安装Workspace Cleanup Plugin

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

要在构建后清理工作空间,请执行以下操作:在“ 构建后操作 ”标题下,从“ 添加构建后操作”下拉菜单中选择“ 在构建完成后删除工作空间”


非常感谢Nagendra。我可以使用工作空间清理插件解决此问题。
Karthik 2015年

如果我不清洁工作区会怎样?它是从远程URL获取更改还是一次又一次地基于同一事物构建更改?
alphaguy

@alphaguy Jenkins为您运行的每个构建都创建一个新的工作区,因此,如果不删除这些工作区,则最终您的节点将用完空间。
Miles Winther

我们可以重用工作区吗?。目前,当我推送代码时,它会从git服务器克隆,然后开始构建。这需要很长的过程,需要增加额外的构建过程!我们可以选择最新的提交吗?@MilesWinther
alphaguy

@alphaguy您可以使用参考仓库,请在此处查看答案:stackoverflow.com/a/9932036/6221831
Miles Winther

53

如果您想手动清理它,对我来说,使用我的jenkins版本(似乎不需要安装额外的插件,但是谁知道),在左列中有一个“工作区”链接,请点击您的项目,然后在“工作区”上,左侧栏上的下方会出现一个“清除当前工作区”链接。 屏幕截图


4
不幸的是,我没有看到。确定不是插件吗?
约阿希姆·布雷特纳

2
嗯,似乎“工作区清理插件”确实是“默认情况下”安装的插件之一。但是,删除它后,我仍然具有该链接,并且它似乎仍然起作用。所以...不确定它来自哪里。V2.121.3
rogerdpack

2
这项工作可行,但我不得不单击工作空间链接两次:第一个进入“工作空间”页面,第二次实际显示“清除当前工作空间”链接。我想这是您可以在答案中包含的信息。
纳纳夫

这是什么詹金斯版本?因为我的没有显示此选项(可能是我的年纪太大)。
Pedro Trujillo

V2.121.3不确定在其他版本上
rogerdpack '19

30

除了上述解决方案之外,还有一种“常见”的方式-直接从Linux机器中删除最大的空间消耗者。您可以按照以下步骤操作:

  1. 登录到詹金斯机(Putty) 在此处输入图片说明
  2. cd到Jenkins安装路径

也使用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 将列出/ etc /中占用磁盘空间的前10个目录

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

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

rm -rf theFolderToDelete

在此处输入图片说明


3
不知道为什么投票。对于Jenkins管理员来说,这听起来不错。不同意“只读”用户。
塞凯特

1.这并不能真正回答所提出的问题,并且2.我的Jenkins服务器正在Windows上运行。
mjaggard

9
@mjaggard这个问题是由其他人提出的,他没有提到它是否仅适用于Windows。他还问如何清理工作区(不限于前端/客户端)。我在这里错过任何明显的东西吗?
赛卡特

4
我完全同意@takias,这似乎是问题的有效答案。如果您有足够的权限执行此操作,那将是一个很好的选择。
PhoneixS

1
这是对“我如何在GNU / Linux机器上恢复空间”的答案,而不是jenkins特定的。
费利佩·阿尔瓦雷斯

20

工作区清理插件

在詹金斯文件中添加

cleanWs()

构建完成后,这将删除工作空间


3
我真的很感谢这个答案,因为我从其他答案中安装了插件,但这正是它可以用于我的设置的原因。除此之外,我在其他答案中也遵循了指向同一个插件的链接,但是cleanWs()在插件着陆页上却没有作为添加到我的语法的语法Jenkinsfile
亚瑟·韦伯

19

重要说明:只要当前未运行作业,就可以删除给定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来按最大到最小的顺序列出工作区。然后,它使用head抓住前10个:

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

2
这很危险,因为作业可能正在使用这些工作空间。
aleb

13

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

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

这对我不起作用,它显示java.lang.NullPointerException:无法在null object上获取属性“ items”。
文森特·格里斯

3

假设问题与清理当前作业的工作空间有关,则可以运行:

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

2

不允许发表评论,因此:

Upen的答案很好,但是如果您将Jenkins Pipeline Jobs与Freestyle Jobs混合使用,则不能。在管道作业上没有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")


1

您需要先安装此插件,然后上述选项才会出现

工作区清理插件

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

这对于确保始终从已知点开始很有用,以确保构建过程能够正常运行


3
请添加您的链接包含的一些信息。仅链接的答案不是我们在寻找的结果!:)
Chilion

2
此补充内容不再提供此答案尚未涵盖的更多信息。事实上,它增加是一个很大
利亚姆

0

如果只想删除一个目录(或文件),则可以使用Groovy和Manage Jenkins→Scripts Console运行一个将其删除的脚本。

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

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

然后,当您拥有要删除的文件夹时dh,只需添加下一个代码即可:

dh.deleteDir()

它将被删除。

注意:示例中显示的路径是针对Bitnami Jenkins安装的,您的路径可能有所不同。


0

有一个选项可以做到。配置->生成后操作
此选项至少在Jenkins 2.236版中默认存在

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.