所以在磁盘上,对于多分支pipline,它看起来像这样: 工作区:
因此,对于我的作业“WindToolsService”,配置${ITEM_ROOTDIR}/builds
会产生以下路径:
C:\Jenkins\jobs\WindToolsService\branches\develop\builds
现在我想将整个C:\ Jenkins \ jobs目录移动到新磁盘,使用的正确设置是什么?
我们尝试过以下操作,但它没有用,我尝试构建作业时重新创建了C:\ Jenkins \ jobs文件夹。
我在这里缺少什么?
好的 - 这真的不可能,至少我想这样做。
原始路径结构为:C:\Jenkins\jobs\JOBNAME\branches\BRANCHNAME\builds
,但新路径为E:\builds\JOBNAME\BRANCHNAME\builds
。这意味着我无法更改设置并剪切和粘贴jobs文件夹的内容,目录结构不同。 job文件夹还包含除构建记录之外的其他作业信息。
移动整个jenkins装置我会更干净,更容易
答案 0 :(得分:3)
jobs文件夹包含构建历史之外的一些其他信息,例如它包含实际的作业定义(more info here)。此外,选项Build Record Root Directory
仅影响位于作业文件夹中的构建。因此,您需要保留作业文件夹和作业的所有子文件夹(但不是所有作业文件夹中的builds文件夹)。
显然Jenkins以不同方式扩展变量ITEM_FULL_NAME
和ITEM_ROOTDIR
。这意味着将jobs文件夹复制到新位置并不是一件简单的事情,尤其是在使用多分支管道,矩阵作业,组织文件夹或普通文件夹时。有关详细信息,请参阅评论中的讨论
无论如何,考虑到这一点,这里有一个更新的答案(旧的答案如下):
由于复制文件夹并不简单,因此需要对文件夹结构进行转换,这意味着最好让Jenkins进行移动。以下groovy脚本将通过展开不同的宏将构建文件夹移动到正确的位置。该脚本在Script Console
(Manage Jenkins
- > Script Console
)中执行。将newRootBuildsFolder
更改为您需要迁移的位置。
newRootBuildsFolder = new File("E:\builds")
def visitJob(job) {
if (job instanceof Job) {
def oldBuildsFolder = job.getBuildDir()
def newBuildsFolder = new File(newRootBuildsFolder, Jenkins.expandVariablesForDirectory('${ITEM_FULL_NAME}', job.getFullName(), job.getRootDir().getPath()))
new FilePath(oldBuildsFolder).copyRecursiveTo("**", new FilePath(newBuildsFolder))
}
if (job instanceof ItemGroup) {
for (item in job.getItems()) {
visitJob(item)
}
}
}
visitJob(Jenkins.instance)
println "Done"
请注意,如果实例很大且包含构建历史记录的负载,则可能需要几分钟或几小时。您可以通过文件系统监视脚本的进度,即转到新的构建文件夹并检查已移动的作业。
执行此脚本后,需要在Jenkins配置中更新builds文件夹;
Manage Jenkins
- > Configure System
并将Build Record Root Directory
更改为E:\builds\${ITEM_FULL_NAME}\builds
OLD ANSWER:
现在,考虑到这一点,以下内容应该有效:
C:\jenkins\jobs
的内容复制到E:\builds
。Manage Jenkins
- > Configure System
并将Build Record Root Directory
更改为E:\builds\${ITEM_FULL_NAME}\builds
E:\builds\
下的文件夹。例如。如果我们有作业X
且之前的版本是123,那么当我们为X
开始构建124的新版本时,应创建文件夹E:\builds\X\builds\124
,并创建文件夹{{ 1}}应该不。稍后,当您看到所有内容都正常工作时,您可以删除C:\jenkins\jobs\X\builds\124
下的旧版本文件夹。