我正在使用Jenkins构建Maven Java项目并将它们部署到Nexus存储库.我也使用Git,虽然我更习惯Subversion,所以我的Git知识有限.
我想Jenkins/Maven:
我收集Git合并可以实现:http://twasink.net/2011/09/20/git-feature-branches-and-jenkins-or-how-i-learned-to-stop-worrying-about-破碎构建/
我也读了很多关于maven-release-plugin.
我不确定如何达到上述结果.如果我将SCM细节硬编码到每个项目的POM中,那么不会maven-release-plugin仅仅在该存储库上而不是Jenkins的本地存储库中执行操作吗?
如果我使用Jenkins将环境变量传递给Maven以指定版本号的解决方案,那么我希望在我的IDE中有本地版本解析问题.
尝试在之前成功发布的maven项目上执行发布.
当我执行mvn release:prepare时,系统会提示我发布标记和新快照标记以及项目构建.
但当它试图推向遥控器时,我明白了
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.0:prepare (default-cli) on project NeuralAnalysis: Unable to tag SCM
[ERROR] Provider message:
[ERROR] The git-push command failed.
[ERROR] Command output:
[ERROR] To ssh://gitosis@10.41.129.2/NeuralAnalysis.git
[ERROR] ! [rejected] NeuralAnalysis-1.5.6 -> NeuralAnalysis-1.5.6 (non-fast-forward)
[ERROR] error: failed to push some refs to 'ssh://gitosis@10.41.129.2/NeuralAnalysis.git'
[ERROR] To prevent you from losing history, non-fast-forward updates were rejected
事实上,尝试 git push ssh://gitosis@10.41.129.2/NeuralAnalysis.git NeuralAnalysis-1.5.6手动执行,也会以同样的抱怨退出.
表演git pull'已经是最新的'.git branch显示我在'主人'.git push origin给'一切都是最新的'.
使用Tower查看存储库显示'master','origin/master'和'NeuralAnalysis-1.5.6'在最后一次提交时都是相同的.工作目录包含release.properties和pom.xml.releaseBackup文件.
它看起来像整个存储库的一切都很好.
我们使用git repository和maven release插件.在第一个构建步骤中,我们将所有更改提取到本地存储库,然后在下一个中运行mvn release:prepare release:perform.release:prepare更新工作区,更新pom文件中的版本,在存储库中创建标记,运行所有测试,构建jar等.如果没问题,则将本地存储库更改推送到远程更改(更新后的poms和标记创建).
问题在于,当有人同时推动一些变化时,从maven推送失败.错误消息是:
error: failed to push some refs to 'http://<my_repository>'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again. See the 'Note about
fast-forwards' section of 'git push --help' for details.
Run Code Online (Sandbox Code Playgroud)
有人有类似的问题吗?怎么解决?
根据文档,Maven版本:执行目标检查项目,然后分叉一个新的Maven实例来构建它.由于某种原因,forked实例似乎忽略了用户settings.xml,这导致我的情况出错,因为该文件具有用于在父pom中组成存储库URL的属性的定义.
用户的settings.xml
"nexus"配置文件中始终处于活动状态的属性的定义.
<profiles>
<profile>
<id>nexus</id>
<properties>
<dist.url>http://host.com/nexus/content/repositories</dist.url>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
Run Code Online (Sandbox Code Playgroud)Parent的pom.xml
使用定义的属性来组成存储库的URL.
<distributionManagement>
<repository>
<id>nexus</id>
<url>${dist.url}/releases</url>
</repository>
</distributionManagement>
Run Code Online (Sandbox Code Playgroud)执行命令:
mvn release:perform
Run Code Online (Sandbox Code Playgroud)输出(表示已成功检出,构建,测试和打包项目):
[INFO] Uploading: ${dist.url}/releases/com/acme/access/my-project/1.0/my-project-1.0.jar
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] BUILD FAILURE
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [INFO] Total time: 3.659s
[INFO] [INFO] Finished at: Wed Aug 01 14:40:23 EDT 2012
[INFO] [INFO] Final Memory: 21M/307M
[INFO] [INFO] ------------------------------------------------------------------------
[INFO] [WARNING] The requested profile "nexus" could not be activated because it …Run Code Online (Sandbox Code Playgroud)我正在从TeamCity运行maven构建并使用build.vcs.number将Subversion修订版写入我的清单.在使用Subversion作为VCS的任何Maven构建中,TeamCity补充道
-Dbuild.vcs.number=1234
Run Code Online (Sandbox Code Playgroud)
到maven命令行,其中1234是正在构建的分支中的最新修订版.
然后在我的pom.xml中,我有
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
<manifestEntries>
<build>${build.vcs.number}</build>
</manifestEntries>
</archive>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
这一切都正常,直到我运行Maven release:perform(也来自TeamCity),此时$ {build.vcs.number}变为null,即使我在TeamCity构建日志中可以看到该属性是在命令中传入的线.
maven-release-plugin文档暗示Maven在执行目标期间的某个时刻运行分叉进程 - 这就是我遇到问题的原因吗?
有没有办法可以确保将此特定属性传递给该分叉进程?
我正在运行maven发布插件(org.apache.maven.plugins:maven-release-plugin:2.3.2),并注意到scm的密码在通过via.properties文件时以明文形式保存命令行.我想知道是否有办法解决这个问题.
我正在使用Hudson自动执行发布过程,svn用户名和密码通过Hudson传递到命令行.这样做的原因是执行发布准备的人可以更改,我有多个hudson作业共享一个settings.xml来发布不同的项目.
我传递的参数如下:-Dtag = $ {svn.label} -DreleaseVersion = $ {maven.releaseVersion} -DdevelopmentVersion = $ {maven.developmentVersion} -Dusername = $ {svn.username} -Dpassword = $ { svn.password} -DscmCommentPrefix ='[maven-release-plugin] $ {env.BUILD_URL}'
release.properties文件是在发布期间创建的:prepare,但我不认为它是必要的,因为我在命令行中传递了所有信息.创建此release.properties文件时,它包含纯文本密码.这是有问题的,因为可以使用hudson来浏览工作区,因此任何有权访问hudson的人都可以通过浏览器打开文件来查看密码.
有没有办法不创建release.properties文件,或者不保存文件中的密码?我意识到加密的密码可以保存在settings.xml文件中,但是此文件在多个作业之间共享,并且不能由运行作业的人员编辑.
我有一个像这样的maven项目基础设施:
/trunk/all/pom.xml
/trunk/all/libs/lib1/pom.xml
/lib2/pom.xml
...
/trunk/all/projects/p1/pom.xml
/p2/pom.xml
...
Run Code Online (Sandbox Code Playgroud)
你看,我有很多库和许多使用这些库的项目.
所有这些都结合到一个多模块项目中,因为我喜欢
mvn test在完成一些全局重构之后,只做一个单独的编译和测试我的所有代码.目前,我的所有模块都是版本1.0-SNAPSHOT.
现在我想发布项目,p2并且所有库都p2使用(例如lib1和lib2)版本1.0.从那以后,我做了一些修改代码lib1,但没有上lib2.
我希望下一个版本p2是版本1.1,lib1在版本中使用1.1(它自上一版本以来已被修改),但lib2仍然在版本中1.0(因为它没有被修改).
更一般:如果我发布了一个版本,我想增加自上次发布以来发布项目的次要编号以及所有已更改的库.
我是否必须自己照顾所有模块版本,或者是否有能够为我完成所需工作的插件?
我正在使用maven和Jenkins进行自动构建.我正在为Maven寻找最好的开源存储库管理.这样我就可以通过资源库经理在Maven和jenkins之间进行整合.
maven-plugin maven maven-release-plugin jenkins binary-repository
我有一个maven项目,存储在我们的GIT存储库中.当我发布这个项目时mvn release:prepare,mvn release:perform有时它会在后面的步骤中失败,但无论如何都会为此版本创建一个标记.此标记不会被删除mvn release:rollback,如果我再次尝试准备该版本,则会因此标记已存在错误而失败:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.5.2:prepare (default-cli) on project lwl-module: Unable to tag SCM
[ERROR] Provider message:
[ERROR] The git-tag command failed.
[ERROR] Command output:
[ERROR] fatal: tag 'lwl-module-1.5.1' already exists
[ERROR] -> [Help 1]
[ERROR]
Run Code Online (Sandbox Code Playgroud)
有没有办法mvn release:rollback删除我们的GIT存储库中的最后一个标签?
我正在使用此版本插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.2</version>
</plugin>
Run Code Online (Sandbox Code Playgroud) 精简版
有人能告诉我如何在Azure DevOps构建管道中设置"命令行脚本"任务,该管道将更改推送到本地Git存储库(事实上,管道所基于的Git存储库)?
无论我尝试什么,我的脚本总是在打印后超时Pushing commits to git.
更长的版本
我们正在将现有的Java/Maven项目从Jenkins构建服务器迁移到Azure DevOps构建环境,我正在尝试设置一个模仿Jenkins"Release Staging"功能的构建管道.
我的第一次尝试是直接在签出的源上调用Maven发布插件.这涉及到几个障碍,其中大部分都是我能够以某种方式克服的:
git config在推送之前调用单独的"命令行脚本"任务来解决.git checkout master.设置完成后,我的Maven调用脚本会运行到释放插件尝试推送到Git的位置; 读取日志文件中的相应行
[INFO] Executing: cmd.exe /X /C "git push https://xxx.visualstudio.com/YYY/_git/zzz refs/heads/master:refs/heads/master"
[INFO] Working directory: D:\a\1\s</code>
Run Code Online (Sandbox Code Playgroud)
之后,在超时发生之前没有任何事情发生(至少没有记录任何内容):
##[error]The operation was canceled.
##[section]Finishing: Maven pom.xml
Run Code Online (Sandbox Code Playgroud)
为了找出导致这个问题的原因,我尝试了一些事情,其中包括:
git push直接从脚本调用,但没有成功.我现在已经没有想法如何git push接到工作电话了 - 这里是否有人可以帮助我?
PS:你可能会说,就Azure DevOps而言,我是一个新手,所以我肯定不知道该系统的所有技巧和功能.特别是,我不知道是否有任何东西提供与Maven发布插件相同的功能.我们确实使用Azure DevOps包管理,但我们希望为快照和发布版本(Nexus等工具的方式)保留单独的订阅源,因此我们必须有一个机制来自动推进版本号,签出和返回构建包装模块并将其发布到发布订阅源.
如果有人可以提出另一种方法来实现这一点,我也愿意接受建议.