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

rab*_*ens 6 git maven gitlab

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

pom.xml我的主POM包含:

<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>
Run Code Online (Sandbox Code Playgroud)

当我这样做时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]
Run Code Online (Sandbox Code Playgroud)

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

添加一个developerConnection没有帮助.

尝试使用SVN时,它失败并显示"拒绝访问:

<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>
Run Code Online (Sandbox Code Playgroud)

给我:

[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.
Run Code Online (Sandbox Code Playgroud)

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

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

Oki*_*Oth 5

我通过这样的电话遇到了同样的问题

mvn deploy scm:tag
Run Code Online (Sandbox Code Playgroud)

我正在使用 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.
Run Code Online (Sandbox Code Playgroud)

问题是这个调用

/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
Run Code Online (Sandbox Code Playgroud)

但这个调用并不是真正必要的,因为我在 git 存储库的根目录中启动 mvn。相反,像下面这样的命令行调用可以工作。

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

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

<scm>
    <developerConnection>scm:git:origin</developerConnection>
</scm>
Run Code Online (Sandbox Code Playgroud)

我在Linux操作系统下开发,所以我没有测试它是否也可以在Windows系统上运行。

  • 您好,此解决方案仅适用于release:prepare目标,并且release:perform失败。对我来说,为了解决这个失败,我覆盖了release:perform目标上的**connectionUrl** url参数:`sh"mvn -X release:perform -DconnectionUrl='scm:git:ssh://git@scm .git.test.fr/devops/project-plugin.git' -DreleaseVersion=${params.TAG_TO_BUILD} -DdevelopmentVersion=${params.NEXT_SNAPSHOT}"`。但我认为您也可以将 **localCheckout** 参数设置为 true 以允许发布:prepare 使用本地签出而不是从上游存储库签出。 (2认同)

Rom*_*ain 5

正如一些人所说,这些解决方法可以使发布的准备阶段工作,但不能使执行阶段工作(在我的例子中就是这样)。通过找到输入数据以放置developperConnection标签的正确方法,我终于成功地发布了完整的版本:

<scm>
    <developerConnection>scm:git:git@gitlab.company.com:groupProject/project.git</developerConnection>
    <tag>HEAD</tag>
</scm>
Run Code Online (Sandbox Code Playgroud)

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


rab*_*ens 3

编辑:我在这里提出的解决方法不起作用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

然后,我可以在标签上创建 Jenkins 作业或我喜欢的内容release-1.3.0来处理发布。

-- 旧答案供参考--

经过摸索和尝试各种事情后,我取得了一些进展:我必须让 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>
Run Code Online (Sandbox Code Playgroud)

与 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>
Run Code Online (Sandbox Code Playgroud)

现在release:prepare可以工作,但release:perform失败,因为它想从ssh://git@my-git-server.example.com:10022/somebody/my-project.git/.git.