如何防止 Jenkins 获取整个 TFS 工作空间?

How to prevent Jenkins to get the entire TFS workspace?

我正在尝试在本质上是 monorepo 的项目中构建一个项目。

在 Jenkins 中使用 TFS 插件,我将项目路径设置为我要构建的特定项目,并相应地在高级设置中设置本地工作文件夹。这样我就可以从 monorepo 获取所有项目依赖项,我需要使用 Jenkinsfile 中的脚本构建这个项目。至少我是这么想的。

一旦我将 Jenkins 工作区映射到存储库根目录,Jenkins 似乎就构建了整个存储库,最终由于内存不足异常而失败,完全忽略了我在 "Project path" 中设置的内容。

但即使它不会失败,为我们要构建的每个项目都拥有整个存储库的完整副本也不是一个真正现实的想法。

如何解决?停止使用 TFS 插件并在 Jenkinsfile 中执行所有 TFS 操作?

假设您有 $/Repo/project$/Repo/dependency 。你只需要将它们都拉到 Jenkins 中进行一次构建。当然,您尝试了 $/Repo root,但这给了您很多其他项目。

完全忽略我在 "Project path" 中设置的内容。您可以使用多个项目路径。

Jenkins 的 TFS 插件当前不支持从多个位置检出源

作为解决方案,正如 Ian W 指出的那样,您可以 隐藏您不感兴趣的 $\Repo 中的文件夹。签入隐藏的文件夹不会触发一个构建。很遗憾,根据您的评论,可能有很多文件夹。

另一种解决方案是创建多个作业,一些只下载您的依赖项,另一个用于构建。

例如,在 Jenkins 中创建三个作业,每个 "downstream" 另一个:

Try to build uses $/Repo/project (as workspace\TheProgram), and $/Repo/dependency (as workspace\Framework).

  • Framework-Get: normal source code triggering on TFS' Project Path of $/Repo/project. No build step.
  • TheProgram-Get: normal source code triggering on TFS' Product Path of $/Repo/dependency. No build step.
  • TheProgram-Build: No source code control. But the build steps xcopy's the source from the above two steps. Then, you can run a normal build step.

TheProgram-Build's first build step is a windows batch command:

 REM ==================================== REM First Get the
Framework folder: rmdir /s/q Framework mkdir Framework xcopy /y /q /e
..\..\Framework-Get\Workspace\Framework Framework

REM ==================================== REM Then Get the TheProgram
Folder: rmdir /s/q TheProgram  mkdir TheProgram  xcopy /y /q /e
..\..\TheProgram-Get\Workspace\TheProgram TheProgram 

The second build step was a simple call to build use msbuild or whatever you like here.

您还可以将 job1 和 job3 组合在一起以简化您的工作流程,实际上只需要两个作业。