NO.95 Jenkins管理员工具之:干掉无用的本地workspace(Java版)

本文介绍了一种使用Java程序自动清理Jenkins中不再使用的任务工作空间的方法,通过对比当前存在的任务列表与磁盘上的文件夹,实现了自动删除未被Jenkins任务引用的工作空间。
部署运行你感兴趣的模型镜像

搞个大家一起用的Jenkins,30多个项目组建了500多个任务。有个节点的workspace所在盘只有100G,一来二去就满了。

下手处理。

其中一个点是:Jenkins的任务删掉了或者改名了,但是原来的Job workspace是不会删除的。

看了https://my.oschina.net/donhui/blog/677935这一篇,觉得思路可行,不过里面的Python不懂哇,写个Java版吧。

搞定后删掉了40G垃圾,洁癖如我,内心是欢喜的。


上代码。

目录结构

.\src\DelUnusedWS.java

.\bin\DelUnusedWS.class

.\lib\jenkins-cli.jar

.\runDelUnusedWS.cmd



runDelUnusedWS.cmd内容

java -classpath .\lib\jenkins-cli.jar;.\bin; DelUnusedWS http://*.*.*.*:8091/jenkins D:\jenkins\workspace
@pause



DelUnusedWS.java内容

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.OutputStream;
import java.net.URL;
import java.util.LinkedList;
import java.util.List;

import hudson.cli.CLI;

public class DelUnusedWS {
	public static void deleteFile(File file) throws Exception {
		if (file.isDirectory()) {
			for (File f : file.listFiles()) {
				deleteFile(f);
			}
		}
		file.delete();
	}

	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		String url = args[0];// Jenkins地址URL,例:"http://*.*.*.*:8091/jenkins";//
		String wsDir = args[1];// Jenkins节点本地Workspace目录,例:“D:\jenkins\workspace”
		System.out.println("url:" + url);
		System.out.println("wsDir:" + wsDir);
		List<String> arguments = new LinkedList<String>();
		// arguments.add("create-view");
		// arguments.add(viewname);
		// arguments.add("--username");
		// arguments.add(username);
		// arguments.add("--password");
		// arguments.add(password);
		arguments.add("list-jobs");// 展示所有job
		CLI cli = new CLI(new URL(url));
		OutputStream output = new ByteArrayOutputStream();
		int exit_code = cli.execute(arguments, null, output, System.err);

		String s = output.toString();
		System.out.println("jobs:" + s);

		/* 主要逻辑:逐个验证本地workspace下的目录(即job名称)是否在刚查询到的任务名称清单中存在 */
		File dir = new File(wsDir);
		for (File f : dir.listFiles()) {
			if (s.indexOf(f.getName() + '\n') == -1) {//为保证避免目录名是任务名的子串情况,加'\n'进行严格查找
				System.out.println(f.getName() + " not exists!");
				deleteFile(f);
				if (f.exists()) {
					System.out.println(f.getName() + " can 【not】 be deleted!");
				} else {
					System.out.println(f.getName() + " was deleted!");
				}

			}
		}
		System.out.println("Done!");
	}

}

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

01:42:32 Started by user Admin 01:42:32 Running as SYSTEM 01:42:32 Building on the built-in node in workspace E:\Jenkins\workspace\UE\5.5.4\Echo_BuildForUGS_01 01:42:32 Executor number at runtime: 0 01:42:32 ... p4 login + 01:42:32 ... p4 login -s + 17:33:14 ... p4 client -o Jenkins-Build-Echo-UE-5.5.4 + 17:33:14 ... p4 info + 17:33:14 ... p4 info + 17:33:14 ... p4 client -o Jenkins-Build-Echo-UE-5.5.4 + 17:33:15 ... p4 client -i + 17:33:15 ... View: + 17:33:15 ... p4 counter change + 17:33:15 ... p4 changes -m1 -ssubmitted //Jenkins-Build-Echo-UE-5.5.4/...@650 + 17:33:16 P4: found 650 revision in //Jenkins-Build-Echo-UE-5.5.4/...@650 17:33:16 ... p4 changes -m1 -ssubmitted //Jenkins-Build-Echo-UE-5.5.4/...@1,650 + 17:33:19 P4: found 650 revision in //Jenkins-Build-Echo-UE-5.5.4/...@1,650 17:33:19 ... p4 repos -C + 17:33:19 P4: builds: 650 17:33:19 ... p4 login + 17:33:19 ... p4 login -s + 17:33:19 ... p4 client -o Jenkins-Build-Echo-UE-5.5.4 + 17:33:19 ... p4 info + 17:33:19 ... p4 info + 17:33:19 ... p4 client -o Jenkins-Build-Echo-UE-5.5.4 + 17:33:19 17:33:19 P4 Task: establishing connection. 17:33:19 ... server: ssl:192.168.2.4:1668 17:33:19 ... node: a849e4696f69 17:33:19 Building on Node: built-in 17:33:19 ... p4 login + 17:33:19 ... p4 login -s + 17:33:19 ... p4 client -o Jenkins-Build-Echo-UE-5.5.4 + 17:33:19 ... p4 info + 17:33:19 ... p4 info + 17:33:19 ... p4 client -o Jenkins-Build-Echo-UE-5.5.4 + 17:33:19 17:33:19 P4 Task: establishing connection. 17:33:19 ... server: ssl:192.168.2.4:1668 17:33:19 ... node: a849e4696f69 17:33:19 17:33:19 P4 Task: reverting all pending and shelved revisions. 17:33:19 ... p4 revert E:\Jenkins\workspace\UE\5.5.4\Echo_BuildForUGS_01/... + 17:33:19 P4 Task: attempt: 1 01:33:22 ERROR: P4: Task Exception: hudson.AbortException: P4JAVA: Error(s): 01:33:22 Path '/E:\Jenkins\workspace\UE\5.5.4\Echo_BuildForUGS_01/...' is not under client's root 'E:\Jenkins\workspace\UE\5.5.4\Echo_BuildForUGS_01'. 01:33:22 01:33:25 Finished:
03-26
<think>好的,我现在需要解决用户在Jenkins中遇到的P4错误:“revert path not under client root”。首先,我得理解这个错误的含义。根据Perforce的文档,当尝试执行的操作涉及到不在客户端工作区根目录下的路径时,就会出现这个错误[^1]。也就是说,用户可能在配置Jenkins的P4插件时,指定的文件路径超出了客户端定义的根目录范围。 接下来,我应该检查几个可能的配置错误。首先是客户端的根目录设置。用户需要确认在Jenkins的P4插件配置中,客户端(Workspace)的根目录是否正确。这通常在Jenkins的“Manage Jenkins” -> “System Configuration” -> “Perforce”部分设置。如果根目录设置不正确,比如路径拼写错误或者目录结构不符,就会导致此问题。 然后,查看工作区视图(View)的映射是否正确。Perforce客户端的工作区视图定义了哪些 depot 路径被映射到本地的哪个目录。如果视图中的映射不正确,例如路径映射超出了客户端的根目录,或者使用了错误的通配符,就会触发这个错误。例如,假设客户端根目录是`/home/user/workspace`,而视图中有一条映射是`//depot/project/... //client_workspace/...`,这样是正确的。但如果映射写成`//depot/... //client_workspace/project/...`,可能导致路径超出根目录的范围[^2]。 还要检查Jenkins任务中的文件路径参数。用户可能在构建任务中指定了某个文件或目录的路径,而这个路径相对于客户端根目录来说是无效的。例如,如果客户端根目录是`/jenkins/workspace`,而任务中尝试操作`/jenkins/workspace/../other_dir`,这样的相对路径可能会解析到根目录之外,从而引发错误。 另外,权限问题也不容忽视。虽然错误提示直接指向路径问题,但有时用户权限不足可能导致客户端配置无法正确读取,进而引发类似错误。需要确认运行Jenkins服务的用户(如jenkins用户)是否有权限访问客户端根目录及其所有子目录。 可能的解决方案包括:首先,验证并修正客户端的根目录设置,确保与实际的本地路径一致。其次,检查工作区视图的映射,确保所有depot路径都正确映射到客户端根目录下的子目录。如果任务中使用了动态生成的路径,需要添加校验步骤,确保路径不会超出根目录。此外,可以尝试在Perforce插件中使用绝对路径而非相对路径,避免路径解析错误。 如果用户仍然遇到问题,建议启用Perforce插件的详细日志,查看体的路径解析过程,这有助于定位是哪个步骤的路径配置错误。同时,参考Perforce的官方文档和Jenkins插件的说明文档,确认所有配置项是否符合要求。 最后,考虑是否有其他因素,比如多个客户端配置的冲突,或者Jenkins节点配置问题(在分布式构建环境下,不同节点的路径可能不一致)。需要确保所有相关节点上的客户端配置都正确无误。</think>### Jenkins P4 "revert path not under client root" 错误解决方案 #### 错误原因 该错误表明 Jenkins 的 Perforce 插件尝试操作的路径超出了客户端定义的根目录范围[^1]。常见原因包括: 1. **客户端根目录配置错误** 2. **工作区视图(View)映射不匹配** 3. **任务中使用了相对路径或非法路径符号** 4. **权限问题导致路径解析异常** --- #### 解决步骤 1. **检查客户端根目录配置** - 进入 Jenkins 全局配置:`Manage Jenkins > Configure System > Perforce` - 确认 `Client Workspace` 的根目录路径与实际物理路径完全一致 - 示例正确配置: ```plaintext Client name: jenkins-client-prod Root: /opt/jenkins/workspaces/p4_prod # 必须是绝对路径 ``` 2. **验证工作区视图映射** - 在 Perforce 客户端执行 `p4 client` 命令查看视图 - 确保映射规则不包含越界路径: ```plaintext //depot/source/... //jenkins-client-prod/source/... # 正确:映射到客户端根目录下 //depot/docs/... //jenkins-client-prod/../docs/... # 错误:`..` 会跳出根目录 ``` 3. **检查任务中的路径参数** - 在 Jenkins 任务的 `Perforce` 配置模块中: - 避免使用 `../` 等相对路径符号 - 推荐使用基于客户端根目录的绝对路径: ```plaintext ✔️ 正确://depot/source/build.sh ❌ 错误:../../depot/source/build.sh ``` 4. **添加路径校验步骤(Python 示例)** ```python import os client_root = "/opt/jenkins/workspaces/p4_prod" target_path = os.path.abspath(os.path.join(client_root, "subdir/file.txt")) if not target_path.startswith(client_root): raise ValueError(f"路径 {target_path} 超出客户端根目录!") ``` 5. **启用详细日志排查** - 在 Jenkins 系统配置中增加日志级别: ```plaintext org.jenkinsci.plugins.p4 = FINE ``` - 日志会显示类似关键信息: ```plaintext [P4] Reverting files at: //depot/outside/path [P4] Client root: /opt/jenkins/workspaces/p4_prod ``` --- #### 进阶排查 - **权限验证** 使用 `p4 protects` 命令确认 Jenkins 服务账号对目标路径有 `write` 权限: ```bash p4 protects //depot/source/... # 输出应包含:write user jenkins * //depot/source/... ``` - **多节点环境同步** 在分布式构建环境中,确保所有 Jenkins agent 节点的客户端配置一致: ```plaintext Agent1 路径: /opt/jenkins/workspaces/p4_prod Agent2 路径: /mnt/shared/workspaces/p4_prod # 必须同步修改 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值