如何用Python脚本在Jenkins中将文件夹移动至另一文件夹下
解决Jenkins文件夹跨层级复制/移动的问题
你遇到的错误是因为python-jenkins库的copy_job方法在处理文件夹时,要求源与目标必须处于同一父目录下。直接将folder2复制到folder1/folder2时,源的父目录是deployment,目标的父目录是folder1,不符合该方法的限制,因此报错。
以下是两种可行的解决办法:
方法一:先复制到同层级临时目录,再移动到目标路径
这种方式更贴近“移动”的需求,先复制原文件夹到同层级临时位置,再通过Jenkins的移动API将其转移到目标目录:
import jenkins import requests from requests.auth import HTTPBasicAuth # 初始化Jenkins连接 jenkins_url = "https://comp.com/" server = jenkins.Jenkins(jenkins_url, username="xxxx", password="******") auth = HTTPBasicAuth("xxxx", "******") # 1. 将folder2复制到同层级临时目录 temp_folder = "deployment/temp_folder2" server.copy_job("deployment/folder2", temp_folder) # 2. 调用Jenkins移动API,将临时文件夹移到folder1下并重命名为folder2 move_data = { "from": "job/deployment/job/temp_folder2", "to": "job/deployment/job/folder1/job/folder2", "json": '{"redirectTo": "."}' } response = requests.post(f"{jenkins_url}/moveItem", data=move_data, auth=auth) response.raise_for_status() # 确保请求成功 # 3. (可选)删除原folder2 server.delete_job("deployment/folder2")
方法二:递归复制文件夹内的所有任务
如果只需要迁移文件夹内的任务,可先在目标位置创建空文件夹,再逐个复制原文件夹下的任务:
import jenkins jenkins_url = "https://comp.com/" server = jenkins.Jenkins(jenkins_url, username="xxxx", password="******") # 1. 在folder1下创建folder2文件夹(若已存在则跳过) folder_config = '''<?xml version='1.1' encoding='UTF-8'?> <com.cloudbees.hudson.plugins.folder.Folder plugin="folder@6.7.0"> <description></description> <properties/> <folderViews class="com.cloudbees.hudson.plugins.folder.views.DefaultFolderViewHolder"> <views> <hudson.model.AllView> <owner class="com.cloudbees.hudson.plugins.folder.Folder" reference="../../.."/> <name>All</name> <filterExecutors>false</filterExecutors> <filterQueue>false</filterQueue> <properties class="hudson.model.View$PropertyList"/> </hudson.model.AllView> </views> <tabBar class="hudson.views.DefaultViewsTabBar"/> </folderViews> <healthMetrics> <com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric> <nonRecursive>false</nonRecursive> </com.cloudbees.hudson.plugins.folder.health.WorstChildHealthMetric> </healthMetrics> <icon class="com.cloudbees.hudson.plugins.folder.icons.StockFolderIcon"/> </com.cloudbees.hudson.plugins.folder.Folder> ''' try: server.create_job("deployment/folder1/folder2", folder_config) except jenkins.JenkinsException: pass # 2. 获取folder2下的所有任务并逐个复制到目标文件夹 jobs = server.get_jobs(folder_path="deployment/folder2") for job in jobs: job_name = job["name"] source_path = f"deployment/folder2/{job_name}" target_path = f"deployment/folder1/folder2/{job_name}" server.copy_job(source_path, target_path) # 3. (可选)删除原folder2 server.delete_job("deployment/folder2")
注意事项
- 确保操作的Jenkins账号拥有创建、复制、删除文件夹/任务的权限
- 替换代码中的Jenkins地址、用户名、密码为实际信息
- 方法二中的文件夹配置XML需匹配你Jenkins的folder插件版本,可通过现有文件夹的
/config.xml页面获取
内容的提问来源于stack exchange,提问作者Heinz
相关产品推荐
相关产品推荐

