如何将 Jenkins 作业与相关的 git 存储库和多个分支一起使用
How to use Jenkins job(s) with dependent git repositories and multiple branches
我们有 2 个 git 存储库,Platform 和 US(我们还有其他特定于地理区域的存储库,这就是它们分开的原因,但它们在这里不一定相关)。美国依赖于平台。
我们正在使用 git-flow(这意味着新功能在它们自己的分支中,例如 feature/some-product
,develop
分支更稳定并且代表 QA 就绪构建,master
分支是稳定的并且用于发布)。 (如果一个功能同时具有平台部分和美国部分,那么每个部分都会有一个同名的分支。)我们决定这些功能的 Jenkins 作业不应该 运行 mvn deploy
因为我们不想要将它们发布到快照存储库并且可能不应该 运行 mvn install
因为我们不希望不同的功能分支从 Jenkins 的本地存储库中获取它(虽然我们不太确定)。我们认为他们应该只确保所有内容都可以编译并且单元测试通过 (mvn verify
)。
这就是问题所在, 因为这些是单独的 git 存储库,我们没有对编译的 jar 做任何事情(install
或deploy
),
- 我们如何安全地将平台作业中编译的 jar 暴露给美国而不将它们暴露给其他开发人员或作业(或者这是否只是一个问题
mvn install
)或
- 一个 Jenkins 作业如何为特定分支构建 Platform 和 US?
如果我们只有一个活跃开发的分支(或者我们使用的是颠覆),这将不是问题。
我们有一些想法(以及对每个想法的担忧)
- 对于功能分支使用不同的版本(例如,
8.1.0-SNAPSHOT-some-product
)。
- 对于每个 功能分支来说,这似乎是很多工作。
- 它似乎会用 "stale" 个罐子堵塞本地存储库,我们需要担心清除它们。
- 以某种方式使用
git submodule
检查平台和美国的 feature/some-product
并使用 mvn verify --reactor
或将顶级项目作为模块的简单 pom 文件。
- 如何让 Jenkins 添加子模块?
- 如果子模块已经存在,则需要一个完整的 git 存储库,这似乎是多余的。
--reactor
并不总是有效。
- 如何提供pom文件?
- 就做
mvn install
。
feature/other-thing
可能只在美国,所以在平台 feature/some-product
发布到 Jenkins 本地存储库后(这可能与美国 feature/other-thing
的平台 develop
有很大不同将针对正常构建),它(我们认为)会导致 US feature/other-thing
在错误的意义上失败(或通过!)(假设如果它是针对 Platform develop
编译的,它可能会得到一个不同的结果)。
我不必亲自解决这个问题....这是我对如何看待这个问题的看法:
如果您必须为两个分支只做一份工作(一个坏主意),您可以使用参数化构建插件来传递文本字符串 "US" 或 "Platform" 并在 shell 将检查相关回购分支的脚本。
但是,这消除了让回购轮询启动构建的能力。你必须在 cron 上设置一个构建计划,无论如何你都会得到一个新的构建,即使 repo 没有改变(除非你的批处理/ shell 脚本足够聪明来检查变化) .
我看不出有任何理由不拥有两个独立的 Jenkins Jobs,每个分支一个。
如果一个作业需要访问 .jars(又名构建工件),那么您始终可以从 jenkins 服务器上的作业 "LATEST" URL 引用任何其他 jar 的工件。确保作业指定需要存档的工件。
我最终解决这个问题的方法是使用 maven 版本插件。我必须确保所有模块都是顶级项目中的托管依赖项,但这可能是一个不同的问题。另外,我是确定这一点,即使与父项目相同,美国项目也需要明确声明其版本。
他们都轮询 git,但如果构建成功,平台作业也会触发 US。
版本插件的工作方式要求您分两步完成。在job中添加2个"Invoke top-level Maven targets",第二个就是clean deploy
。第一个对于平台和美国来说有点不同。
平台:mvn versions:set -DnewVersion=yourBranchName-${project.version}
.
美国:mvn versions:update-parent -DparentVersion=yourBranchName-${project.version} versions:set -DnewVersion=yourBranchName-${project.version}
如果 b运行ch 仅存在于 US 存储库中,那么显然不要将 Platform 设为一个,而 US 一个与 Platform one 的命令相同。
我 运行 进入 的最后一个问题最初是我将新版本作为 ${project.version}-yourBranchName
但这里的问题是作业正在部署的存储库只接受快照,并且因为版本没有以 -SNAPSHOT
结尾,所以它给出了错误代码 400。
我们有 2 个 git 存储库,Platform 和 US(我们还有其他特定于地理区域的存储库,这就是它们分开的原因,但它们在这里不一定相关)。美国依赖于平台。
我们正在使用 git-flow(这意味着新功能在它们自己的分支中,例如 feature/some-product
,develop
分支更稳定并且代表 QA 就绪构建,master
分支是稳定的并且用于发布)。 (如果一个功能同时具有平台部分和美国部分,那么每个部分都会有一个同名的分支。)我们决定这些功能的 Jenkins 作业不应该 运行 mvn deploy
因为我们不想要将它们发布到快照存储库并且可能不应该 运行 mvn install
因为我们不希望不同的功能分支从 Jenkins 的本地存储库中获取它(虽然我们不太确定)。我们认为他们应该只确保所有内容都可以编译并且单元测试通过 (mvn verify
)。
这就是问题所在, 因为这些是单独的 git 存储库,我们没有对编译的 jar 做任何事情(install
或deploy
),
- 我们如何安全地将平台作业中编译的 jar 暴露给美国而不将它们暴露给其他开发人员或作业(或者这是否只是一个问题
mvn install
)或 - 一个 Jenkins 作业如何为特定分支构建 Platform 和 US?
如果我们只有一个活跃开发的分支(或者我们使用的是颠覆),这将不是问题。
我们有一些想法(以及对每个想法的担忧)
- 对于功能分支使用不同的版本(例如,
8.1.0-SNAPSHOT-some-product
)。- 对于每个 功能分支来说,这似乎是很多工作。
- 它似乎会用 "stale" 个罐子堵塞本地存储库,我们需要担心清除它们。
- 以某种方式使用
git submodule
检查平台和美国的feature/some-product
并使用mvn verify --reactor
或将顶级项目作为模块的简单 pom 文件。- 如何让 Jenkins 添加子模块?
- 如果子模块已经存在,则需要一个完整的 git 存储库,这似乎是多余的。
--reactor
并不总是有效。- 如何提供pom文件?
- 就做
mvn install
。feature/other-thing
可能只在美国,所以在平台feature/some-product
发布到 Jenkins 本地存储库后(这可能与美国feature/other-thing
的平台develop
有很大不同将针对正常构建),它(我们认为)会导致 USfeature/other-thing
在错误的意义上失败(或通过!)(假设如果它是针对 Platformdevelop
编译的,它可能会得到一个不同的结果)。
我不必亲自解决这个问题....这是我对如何看待这个问题的看法:
如果您必须为两个分支只做一份工作(一个坏主意),您可以使用参数化构建插件来传递文本字符串 "US" 或 "Platform" 并在 shell 将检查相关回购分支的脚本。
但是,这消除了让回购轮询启动构建的能力。你必须在 cron 上设置一个构建计划,无论如何你都会得到一个新的构建,即使 repo 没有改变(除非你的批处理/ shell 脚本足够聪明来检查变化) .
我看不出有任何理由不拥有两个独立的 Jenkins Jobs,每个分支一个。
如果一个作业需要访问 .jars(又名构建工件),那么您始终可以从 jenkins 服务器上的作业 "LATEST" URL 引用任何其他 jar 的工件。确保作业指定需要存档的工件。
我最终解决这个问题的方法是使用 maven 版本插件。我必须确保所有模块都是顶级项目中的托管依赖项,但这可能是一个不同的问题。另外,我是确定这一点,即使与父项目相同,美国项目也需要明确声明其版本。
他们都轮询 git,但如果构建成功,平台作业也会触发 US。
版本插件的工作方式要求您分两步完成。在job中添加2个"Invoke top-level Maven targets",第二个就是clean deploy
。第一个对于平台和美国来说有点不同。
平台:mvn versions:set -DnewVersion=yourBranchName-${project.version}
.
美国:mvn versions:update-parent -DparentVersion=yourBranchName-${project.version} versions:set -DnewVersion=yourBranchName-${project.version}
如果 b运行ch 仅存在于 US 存储库中,那么显然不要将 Platform 设为一个,而 US 一个与 Platform one 的命令相同。
我 运行 进入 的最后一个问题最初是我将新版本作为 ${project.version}-yourBranchName
但这里的问题是作业正在部署的存储库只接受快照,并且因为版本没有以 -SNAPSHOT
结尾,所以它给出了错误代码 400。