通过 Jenkins/Maven 从 Nexus 暂存库中发布
Releasing from Nexus staging repository via Jenkins/Maven
我有一个 Java 项目。有些部分是 jar
个文件,有些是 war
个文件。我还有 Jenkins 和 Nexus Pro,当团队中的开发人员提交 SVN 时,Jenkins 构建会自动启动。
使用 Maven 版本插件,我可以 mvn versions:set -DnewVersion=1.0.$SVN_REVISION
作为预构建步骤,然后 mvn clean test deploy
。在此过程结束时,我已将 my-artifact-1.0.1234.jar
上传到我的 Nexus Pro 暂存存储库。
由于我们在 CI 类型的环境中工作,我们可能有一百个(或更多)暂存构建。在适当的时候,QA 团队希望将某个构建提升到 "later" 环境(想想 QA,或 SIT,或其他什么。这里的环境更像是锁定状态。)
我想要的工作流程是这样的:
- 有人决定将 Build 1.0.1357 升级为 QA
- 他们进入 Jenkins,从事 "Promote to QA" 工作
- 他们会在下拉列表中看到 Nexus 暂存存储库中所有可能构建的列表。他们 select 一个,然后单击 "Run" 按钮。
- 该工件 "released" 从 Nexus Staging 到 Nexus Releases,并进一步部署到 QA 环境。 (我不太关心 "and deployed to QA" 部分——我已经知道该怎么做了。为了我的故事的完整性,它被包含在这里。)
我已经知道我可以从命令行执行此操作,并且它正在运行:
mvn nexus-staging:rc-list -DserverId=nexus -DnexusUrl=http://my.nexus.ip:8081/nexus
mvn nexus-staging:rc-release -DserverId=nexus -DnexusUrl=http://my.nexus.ip:8081/nexus -DstagingRepositoryId=abcd-1000 -Ddescription="Release from CLI."
我遇到的问题是您必须在命令行中指定 stagingRepositoryId
。我该如何着手完成这项工作?
我认为您可以通过使用 SNAPSHOT 和发布存储库轻松实现您正在尝试做的事情。
因此,您在 SNAPSHOT 构建中进行正常开发,一旦准备好进行测试,您就可以创建一个标记构建,从 POM 中的版本中删除 SNAPSHOT。所有这些都可以使用 jenkins 和 Nexus 来实现。
此外,您的版本中不需要 SVN 修订号,增量内部版本号就足够了,可以通过发布插件进行管理。
总结一下:
- 假设您正在开发 1.0 版。
- 因此,您采用 pom 版本为 1.0-0-SNAPSHOT 的初始分支。这里 1.0 代表版本号,'-0'代表我们计划部署的下一个标签版本号。
- 现在,一旦您准备好部署或希望您的 QA 团队进行测试。您 运行 使用 maven 发布插件的作业或脚本来创建标签。将使用 1.0-0 版本创建标签构建 [快照已删除,因此它将转到发布存储库] 并上传到存储库,分支中的版本也将增加到 1.0-1-SNAPSHOT [因此现在分支中的更改将更改为如果需要任何更改,发布并部署 1.0-1]
以上所有步骤都是使用 Maven 发布插件和 运行 通过 jenkins 作业自动完成的。
我的工作有上述设置。
OP 表示 'SNAPSHOT' 不在图片中。
在那种情况下,这个 post 回答了查询:automate deployment to sonatype's oss maven repository [看第二个答案]
我正在做的是解析
的输出
mvn nexus-staging:rc-list -DserverId=nexus -DnexusUrl=http://my.nexus.ip:8081/nexus
然后将所需的存储库与您的特定逻辑相匹配。对我来说使用 python 是最好的解决方案(但你可以用任何语言自己做):
output = subprocess.check_output("mvn nexus-staging:rc-list -DserverId=nexus -DnexusUrl=http://my.nexus.ip:8081/nexus")
for line in output.split('\n'):
if "repo" in line:
stagingRepositoryId = "repo-" + line[8:23]
考虑输出为
[INFO] repo_qa-3514 OPEN Implicitly created (auto staging).
[INFO] repo_qa-3518 Implicitly created (auto staging).
[INFO] repo_qa-3521 OPEN Implicitly created (auto staging).
[INFO] repo-2011 OPEN Implicitly created (auto staging).
您将运行第二条命令解析为:
mvn nexus-staging:rc-release -DserverId=nexus -DnexusUrl=http://my.nexus.ip:8081/nexus -DstagingRepositoryId=repo-2011 -Ddescription="Release from CLI."
我有一个 Java 项目。有些部分是 jar
个文件,有些是 war
个文件。我还有 Jenkins 和 Nexus Pro,当团队中的开发人员提交 SVN 时,Jenkins 构建会自动启动。
使用 Maven 版本插件,我可以 mvn versions:set -DnewVersion=1.0.$SVN_REVISION
作为预构建步骤,然后 mvn clean test deploy
。在此过程结束时,我已将 my-artifact-1.0.1234.jar
上传到我的 Nexus Pro 暂存存储库。
由于我们在 CI 类型的环境中工作,我们可能有一百个(或更多)暂存构建。在适当的时候,QA 团队希望将某个构建提升到 "later" 环境(想想 QA,或 SIT,或其他什么。这里的环境更像是锁定状态。)
我想要的工作流程是这样的:
- 有人决定将 Build 1.0.1357 升级为 QA
- 他们进入 Jenkins,从事 "Promote to QA" 工作
- 他们会在下拉列表中看到 Nexus 暂存存储库中所有可能构建的列表。他们 select 一个,然后单击 "Run" 按钮。
- 该工件 "released" 从 Nexus Staging 到 Nexus Releases,并进一步部署到 QA 环境。 (我不太关心 "and deployed to QA" 部分——我已经知道该怎么做了。为了我的故事的完整性,它被包含在这里。)
我已经知道我可以从命令行执行此操作,并且它正在运行:
mvn nexus-staging:rc-list -DserverId=nexus -DnexusUrl=http://my.nexus.ip:8081/nexus
mvn nexus-staging:rc-release -DserverId=nexus -DnexusUrl=http://my.nexus.ip:8081/nexus -DstagingRepositoryId=abcd-1000 -Ddescription="Release from CLI."
我遇到的问题是您必须在命令行中指定 stagingRepositoryId
。我该如何着手完成这项工作?
我认为您可以通过使用 SNAPSHOT 和发布存储库轻松实现您正在尝试做的事情。 因此,您在 SNAPSHOT 构建中进行正常开发,一旦准备好进行测试,您就可以创建一个标记构建,从 POM 中的版本中删除 SNAPSHOT。所有这些都可以使用 jenkins 和 Nexus 来实现。
此外,您的版本中不需要 SVN 修订号,增量内部版本号就足够了,可以通过发布插件进行管理。
总结一下:
- 假设您正在开发 1.0 版。
- 因此,您采用 pom 版本为 1.0-0-SNAPSHOT 的初始分支。这里 1.0 代表版本号,'-0'代表我们计划部署的下一个标签版本号。
- 现在,一旦您准备好部署或希望您的 QA 团队进行测试。您 运行 使用 maven 发布插件的作业或脚本来创建标签。将使用 1.0-0 版本创建标签构建 [快照已删除,因此它将转到发布存储库] 并上传到存储库,分支中的版本也将增加到 1.0-1-SNAPSHOT [因此现在分支中的更改将更改为如果需要任何更改,发布并部署 1.0-1]
以上所有步骤都是使用 Maven 发布插件和 运行 通过 jenkins 作业自动完成的。
我的工作有上述设置。
OP 表示 'SNAPSHOT' 不在图片中。 在那种情况下,这个 post 回答了查询:automate deployment to sonatype's oss maven repository [看第二个答案]
我正在做的是解析
的输出mvn nexus-staging:rc-list -DserverId=nexus -DnexusUrl=http://my.nexus.ip:8081/nexus
然后将所需的存储库与您的特定逻辑相匹配。对我来说使用 python 是最好的解决方案(但你可以用任何语言自己做):
output = subprocess.check_output("mvn nexus-staging:rc-list -DserverId=nexus -DnexusUrl=http://my.nexus.ip:8081/nexus")
for line in output.split('\n'):
if "repo" in line:
stagingRepositoryId = "repo-" + line[8:23]
考虑输出为
[INFO] repo_qa-3514 OPEN Implicitly created (auto staging).
[INFO] repo_qa-3518 Implicitly created (auto staging).
[INFO] repo_qa-3521 OPEN Implicitly created (auto staging).
[INFO] repo-2011 OPEN Implicitly created (auto staging).
您将运行第二条命令解析为:
mvn nexus-staging:rc-release -DserverId=nexus -DnexusUrl=http://my.nexus.ip:8081/nexus -DstagingRepositoryId=repo-2011 -Ddescription="Release from CLI."