Jenkins: 从monorepo动态地git clone只需要特定作业所需的文件

90次阅读
没有评论

问题描述

在使用Jenkins时,有一个需求是从一个巨大的20GB monorepo中,只需要克隆几个子目录来运行特定的Jenkins作业。他知道可以使用git sparse checkout来解决这个问题,但是设置和维护起来非常麻烦。他可能需要运行几次作业来确保没有漏掉任何目录。而且,如果在将来添加了一个不在sparse checkout列表中的依赖项(在另一个目录中),他必须记得将其添加回去。
用户希望能够改进这个过程。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

可以使用git archive命令来从远程仓库直接获取单个文件,这样就不需要克隆整个仓库。在Jenkins Pipeline脚本中,可以使用以下命令来实现:

def cmd = "git archive --remote='${repoUrl}' '${ref}' '${fileName}' | tar -xO"
sh(cmd)

在上面的示例中,repoUrl是git仓库的远程URL,ref是要获取的引用(标签或分支),fileName是要从仓库中获取的文件。如果需要多个文件,可以将每个文件作为git archive的单独参数列出。
请注意,如果您从Pipeline脚本中运行此命令,您可能需要使用withCredentials来设置适当的SSH密钥或用户名/密码凭据以访问git仓库。

方案2

这个方案需要在第一次运行Jenkins作业时克隆整个仓库,并在作业结束时保存一个数据结构,以记录所需的文件。在后续的运行中,只需要使用git sparse-checkout命令来克隆所需的文件。
以下是一个实现这个方案的步骤:
1. 在第一次运行Jenkins作业时,使用git clone命令克隆整个仓库。
2. 在作业运行过程中,使用lsofsysdigopensnoop等工具监视作业工作目录中打开的文件。
3. 在作业结束时,创建一个数据结构,记录作业所需的文件列表,例如{JOB_NAME: [list, of, files]}
4. 运行作业多次,以确保数据的正确性。
5. 在后续的运行中,使用git sparse-checkout命令根据记录的文件列表克隆所需的文件。
如果在将来的作业运行中出现FileNotFound错误,可以推断出添加了新的依赖项,需要将新的依赖项添加到文件列表中并重新运行作业。

方案3

这个方案需要在第一次运行Jenkins作业时克隆整个仓库,并在作业结束时保存一个数据结构,以记录作业所需的文件。在后续的运行中,使用git archive命令从远程仓库直接获取所需的文件。
以下是一个实现这个方案的步骤:
1. 在第一次运行Jenkins作业时,使用git clone命令克隆整个仓库。
2. 在作业运行过程中,使用lsofsysdigopensnoop等工具监视作业工作目录中打开的文件。
3. 在作业结束时,创建一个数据结构,记录作业所需的文件列表,例如{JOB_NAME: [list, of, files]}
4. 运行作业多次,以确保数据的正确性。
5. 在后续的运行中,使用git archive命令根据记录的文件列表直接从远程仓库获取所需的文件。
如果在将来的作业运行中出现FileNotFound错误,可以推断出添加了新的依赖项,需要将新的依赖项添加到文件列表中并重新运行作业。

正文完