配置 jenkins 将开源项目发布到私有 nexus

Posted

技术标签:

【中文标题】配置 jenkins 将开源项目发布到私有 nexus【英文标题】:configuring jenkins to publish open source projects to private nexus 【发布时间】:2014-05-19 18:23:59 【问题描述】:

简而言之,我如何配置 jenkins 以在发生更改时将未发布的开源工件持续自动地发布到私有关系存储库?

加长版:

考虑一个我的代码依赖的开源项目,只有该项目不会将自身发布到任何存储库。因此,如果代码没有频繁更改,我可以手动克隆并发布到我的私人关系。问题是,开源项目变化太频繁,我不想手动跟踪项目状态。我想以某种方式在 jenkins 中创建一个工作,将开源项目构建并发布到我的私人存储库。该项目是一个 scala + sbt 项目,我的代码也是如此,所以我想发布 ivy 风格 而不是 maven 风格

我对此的看法:

理想情况下,我会让 jenkins 运行操作:compile test publish-local,如果一切顺利,我将(以某种方式)发布生成的工件。但是:

我不知道如何(如果可能的话)使用 sbt(甚至 Ivy),就像我使用 maven 部署生成的 jar 一样。 我可以使用一个分叉的项目,修改后的build.sbt 将包括publishTo 密钥,并引用我的.credentials 并让jenkins 到compile test publish 它到我的私人关系,但我必须git pull 从原始存储库到我的分叉存储库的更改,我希望这能自动发生... 我可以使用一个 hacky 解决方案,比如 jenkins 会运行 2 个不同的作业。第一个将由原始的 SCM 拉动触发,并执行一个脚本,将更改从原点拉到分叉的 repo(与上面的项目符号相同)。第二个作业将取决于第一个作业,并且每次执行第一个作业时都会触发。这项工作将构建和发布分叉的回购。但这个解决方案听起来太复杂和hacky。肯定有更简单的方法来做到这一点...

那么,处理这种情况的好方法是什么?

【问题讨论】:

【参考方案1】:

我在这里看到两件事:

您正在查看项目的 SNAPSHOT 版本,并且代码在不断变化。 Ivy 和 Maven 都可以配置为检查最新的SNAPSHOT,如果有变化就下载它。 您正在查看 Release 存储库,但官方发布的速度很快。您只是想使用最新的。 Ivy 和 Maven 都可以配置为自动提取最新的可用版本(尽管我都抱怨你没有指定的版本)。

如果您使用 Nexus,您可以同时设置 Ivy 和 Maven 以覆盖使用的默认主存储库 http://repo1.maven.org,并将您的本地 Nexus 存储库视为所有 Maven 存储库的世界主存储库。如果您的本地 Nexus 存储库具有该工件,它将将该本地工件下载到构建中。如果没有,您的本地 Nexus 存储库将出去并获取请求的工件。

如果您以这种方式设置本地 Nexus 存储库,并且您 部署 (Maven) 或 发布 (Ivy) 您的 jar 到 公共存储库 em>,jar 将存储在您的本地 Nexus 存储库中,而不是远程存储库中。

现在,如果您想查看是否有新版本可用,您可以使用http://search.maven.org rest API 和一些脚本编写工作来检查该工件是否有新版本。然后,您将该 repo 检查设置为 Jenkins 作业。 Jenkins 将运行此脚本,下载最新的 jar(如果已更改),然后将其发布部署到您的本地 Nexus 存储库中。

如果您想构建最新版本,您可以设置 Jenkins 来轮询远程第三方 repo。如果该 repo 是 Git 或 Subversion repo,则轮询不会占用大量资源(尽管我每天只轮询该 repo 不超过一次,只是为了善良)。然后,那个远程仓库只是另一个本地 Jenkins 工作。添加发布/部署插件并将该工件发布/部署到您的本地 Nexus 存储库。

【讨论】:

没有工件可供下载。我必须自己建造它。每当主分支发生变化时,我都想构建和发布工件。问题是,为了发布该项目,我需要更改 build.sbt 文件中的 publishTo 键,因此它会发布到 my 私有关系,而不是原始关系(在这种情况下,没有定义)。所以我问,我是否可以以某种方式向 nexus 发布一个已经发布到 ~/.ivy2/local 的工件。可能吗?如果是这样,如何?我不想自己维护资源(尽管一个小的build.xml 文件就可以了......) 您可以更改 ivysettings-public.xml 以指向您的 Nexus 存储库。如果你需要第三方 jar,Ivy 会查询你的 Nexus repo,你的 Nexus repo 会下载它。就 Ivy 而言,您的 Nexus 存储库就是世界。如果您设置<ivy:publish resolver="public"/>,它将发布到您的 Nexus 存储库。 我已经多次阅读您的答案和评论,但我仍然找不到我正在寻找的答案。似乎我不明白你的答案,或者你没有完全理解我的问题。澄清一下:(1) 我必须构建我自己依赖的 github 项目,因为它没有被发布。 (2) 我使用 sbt 作为构建工具,所以也是我所依赖的开源。 我们使用 Ivy,但使用 maven 通过 Jenkins 发布。因此,您可以使用 sbt 构建并使用 Maven 部署到您的存储库。我们使用 Artifactory,但这也适用于 Nexus。这是我的$HOME/.m2/settings.xml。这指向我的 Artifactory 存储库。我们在那里发布并从那里获取开源 jars。这是我的promote.sh 脚本。 Jenkins Promotion Plugin 使用它来将我们的工件部署到我们的 Maven 存储库。顺便说一句,脚本假定 jar 位于 Jenkins 的 target/maven/[jar.name] 中。 只是为了澄清。我们将自己的东西发布到我们的 Maven 存储库。这些不是公共工件。如果您想要一个公共工件,您可以询问我们的 Maven 存储库,它会从一个公共 Maven 存储库中获取它。对于开发人员来说,我们的 Maven 存储库是他们唯一需要的公共和自发布工件的存储库。

以上是关于配置 jenkins 将开源项目发布到私有 nexus的主要内容,如果未能解决你的问题,请参考以下文章

jenkins配置Maven的私有仓库Nexus

Jenkins-部署到 kubernetes

jenkins持续集成工作原理

Jenkins maven 发布凭证

msbuild怎么添加 到环境变量

尝试将 jenkins 与 github 连接的私有 ssh 密钥问题