Maven和Gitlab:release:prepare使用错误的SCM URL

时间:2015-03-18 10:52:48

标签: git maven gitlab

我正在尝试在Gitlab服务器上托管的多模块项目上执行mvn release:prepare

我的主POM的pom.xml包含:

<scm>
    <connection>scm:git:http://my-git-server.example.com/git/somebody/my-project.git</connection>
    <url>http://my-git-server.example.com/git/somebody/my-project</url>
</scm>

当我mvn release:prepare -DautoVersionSubmodules=true时,它编译所有内容并运行测试,但随后失败:

[INFO] Executing: /bin/sh -c cd /home/somebody/git/my-project && git tag -F /tmp/maven-scm-1594218362.commit my-project-1.0.0
[INFO] Working directory: /home/somebody/git/my-project
[INFO] Executing: /bin/sh -c cd /home/somebody/git/my-project && git push http://my-git-server.example.com/git/somebody my-project-1.0.0
[INFO] Working directory: /home/somebody/git/my-project
...
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.3.2:prepare (default-cli) on project iwes-lib-master: Unable to tag SCM
[ERROR] Provider message:
[ERROR] The git-push command failed.
[ERROR] Command output:
[ERROR] fatal: repository 'http://my-git-server.example.com/git/somebody/' not found
[ERROR] -> [Help 1]

所以它告诉我maven-release-plugin认为我的Git存储库的父目录是存储库,在那里拯救。

添加developerConnection无济于事。

尝试使用SVN时,“Access Denied:

”失败
<scm>
    <connection>scm:git:http://my-git-server.example.com/git/somebody/my-project.git</connection>
    <developerConnection>ssh://git@my-git-server.example.com:10022/somebody/my-project.git</developerConnection>
    <url>http://my-git-server.example.com/git/somebody/my-project</url>
</scm>

给了我:

[INFO] Executing: /bin/sh -c cd /home/jra/Documents/git/my-project && git push ssh://git@my-git-server.example.com:10022/somebody my-project-master-1.0.0
....
[ERROR] Access denied.

因此,它再次使用父目录。

如何强制发布插件使用我在那里声明的真实URL?

5 个答案:

答案 0 :(得分:2)

编辑:我在这里提出的解决方法对release:perform不起作用,事实上,直到今天我才找到可行的解决方案。我正在手动进行发布,我将在下面介绍。

我对此问题进行了更多调查,我认为这是一个错误。我为它提交了一份JIRA:MRELEASE-900

我转储了maven-release-plugin,我现在正在通过以下方式手动执行发布(例如:版本1.3.0,快照版本是1.3.0-SNAPSHOT):

  1. git checkout master && git pull只是为了确定
  2. git checkout -b release-1.3 && git push -u origin release-1.3
  3. cd path/to/my/master/project
  4. mvn versions:set,它要求我指定1.3.0-SNAPSHOT的新版本,我输入1.3.0
  5. git commit -a所以新版本已签入
  6. git tag release-1.3.0
  7. git push && git push --tags - 此时,分支release-1.3.0中有一个标记release-1.3,其中所有相关的POM版本号均为1.3.0
  8. git checkout master
  9. git merge release-1.3 - 尚未提交,我首先更新版本。
  10. mvn versions:set,设置新的SNAPSHOT版本,根据我的惯例,这将是1.4.0-SNAPSHOT
  11. git commit -a
  12. git push
  13. 然后,我可以在标记release-1.3.0上创建Jenkins作业或我喜欢的内容来处理发布。

    - 旧答案供以下参考 -

    在探索并尝试各种各样的事情后,我取得了一些进展:我必须让maven-release-plugin认为my-project.git是一个目录,并在URL中添加一个虚假文件。

    以下作品:

    <scm>
        <connection>scm:git:http://my-git-server.example.com/git/somebody/my-project.git/.git</connection>
        <developerConnection>scm:git:http://my-git-server.example.com/git/somebody/my-project.git/.git</developerConnection>
        <url>http://my-git-server.example.com/git/somebody/my-project</url>
    </scm>
    

    与tSSH相同:

    <scm>
        <connection>scm:git:http://my-git-server.example.com/git/somebody/my-project.git/.git</connection>
        <developerConnection>ssh://git@my-git-server.example.com:10022/somebody/my-project.git/.git</developerConnection>
        <url>http://my-git-server.example.com/git/somebody/my-project</url>
    </scm>
    

    现在release:prepare有效,但release:perform失败,因为它想从ssh://git@my-git-server.example.com:10022/somebody/my-project.git/.git下载。

答案 1 :(得分:2)

我在同一个问题上遇到了类似的问题

mvn deploy scm:tag

我使用gitlab安装,也不允许这样的通话

[INFO] Executing: /bin/sh -c cd /home/user/prog/gitlab/test-user_server && git tag -F /tmp/maven-scm-482134407.commit test-user_server-1.1-SNAPSHOT
[INFO] Working directory: /home/user/prog/gitlab/test-user_server
[INFO] Executing: /bin/sh -c cd /home/user/prog/gitlab/test-user_server && git push user@gitlab.my.server:testplus/test-user_server.git refs/tags/test-user_server-1.1-SNAPSHOT
[INFO] Working directory: /home/user/prog/gitlab/test-user_server
[ERROR] Provider message:
[ERROR] The git-push command failed.
[ERROR] Command output:
[ERROR] Permission denied, please try again.

问题是这个电话

/bin/sh -c cd /home/user/prog/gitlab/test-user_server && git push user@gitlab.my.server:testplus/test-user_server.git refs/tags/test-user_server-1.1-SNAPSHOT

但是这个调用并不是必需的,因为我在git存储库的根目录中启动了mvn。而是像下面那样的命令行调用。

git push origin refs/tags/test-user_server-1.1-SNAPSHOT

所以我将我的pom.xml中的scm配置修改为如下所示的字符串,它对我来说就像魅力一样。

<scm>
    <developerConnection>scm:git:origin</developerConnection>
</scm>

我是在Linux操作系统下开发的,所以我没有测试它是否也适用于Windows系统。

答案 2 :(得分:2)

正如一些人所说,这些解决方法可以使工作成为发布的准备阶段而不是执行阶段(在我的情况下就是这样)。 我终于通过找到输入数据以放置developperConnection标记的正确方法来完成一个完整的发布工作:

<scm>
    <developerConnection>scm:git:git@gitlab.company.com:groupProject/project.git</developerConnection>
    <tag>HEAD</tag>
</scm>

在我的案例中接受了许多其他URL格式,但最终在发布的执行或准备阶段失败(scm:git:ssh:// git @ gitlab ...例如有这个问题)。 我不知道这个解决方案是否特定于Gitlab或者我的项目,但我花了很多时间找到这个解决方法......

答案 3 :(得分:0)

我有同样的问题,在我的情况下,插件推送远程使用正确版本更新的pom,但是当试图生成标记时它失败,因为它试图将标记推送到父目录。

按下以掌握使用正确版本更新的pom

git push git@myGitLabURL:parent/project.git refs/heads/master:refs/heads/master 

但是当它试图推动标签时

push git@myGitLabURL:parent refs/tags/v1.46 

有人解决了吗?

答案 4 :(得分:0)

在Windows 10上(如果使用gitlab),scm部分可能看起来像(例如):

   <scm>
     <url>https://gitlab.yourdomain.com/yourproject</url>
     <connection>scm:git:https://gitlab.yourdomain.com/yourproject.git</connection>
     <developerConnection>scm:git:https://gitlab.yourdomain.com/yourproject.git</developerConnection>
    <tag>HEAD</tag>
   </scm>

mvn命令行中(在下面)提供用户名和密码可以解决运行shell提示脚本时Maven-on-Windows10失败或读取用户名错误:

    mvn release:clean release:prepare -Dusername=someUserName -Dpassword=somePassword

:如果您需要在用户名和密码中提供非标准字符(例如fred@somedomain.comsome#pwd!方面),则需要使用URL编码在命令行上如下:

    mvn release:clean release:prepare -Dusername=fred%40somedomain.com -Dpassword=some%23pwd%21