【问题标题】:Maven and Gitlab: release:prepare uses the wrong SCM URLMaven 和 Gitlab:release:prepare 使用了错误的 SCM URL
【发布时间】:2015-05-21 02:53:15
【问题描述】:

我正在尝试在托管在 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 时,失败并显示“拒绝访问:

<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?

【问题讨论】:

  • 我不确定您是否找到了解决方案,但也许我的 scm 修改也适合您

标签: git maven gitlab


【解决方案1】:

这是 release:prepare 和 release:perform 都运行良好的解决方案:

pom.xml:

<scm>
        <connection>scm:git:origin</connection>
        <developerConnection>scm:git:origin</developerConnection>
        <url>http://git-url/testci</url>
        <tag>HEAD</tag>
    </scm>
  1. mvn 发布准备

    git remote set-url origin http://YOUR-USERNAME:YOUR-PASSWORD@$CI_SERVER_HOST/testci.git

    mvn clean -DskipTests -Darguments=-DskipTests release:prepare -e -DreleaseVersion=$ReleaseVersion -DdevelopmentVersion=$NextVersion-SNAPSHOT -Dtag="$TD-$ReleaseVersion" -DscmDevelopmentCommitComment="准备下一次开发迭代 $NextVersion -SNAPSHOT" -X -B

  2. mvn 发布执行

    mvn 发布:执行 -DconnectionUrl='scm:git:http://git-url/testci.git' -Dusername="YOUR-USERNAME" -Dpassword="YOUR-PASSWORD" -e -Darguments="- Dmaven.javadoc.skip=true -Dmaven.test.skip=true" -s ci_settings.xml -B

【讨论】:

    【解决方案2】:

    在 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 命令行(如下)中提供用户名和密码可以避免 maven-on-Windows10 在运行 shell 提示脚本或读取用户名时出错:

        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
    

    【讨论】:

      【解决方案3】:

      编辑:我在这里提出的解决方法不适用于release:perform,事实上,直到今天我还没有找到可行的解决方案。我现在正在手动发布,如下所述。

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

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

      1. git checkout master &amp;&amp; git pull 只是为了确定
      2. git checkout -b release-1.3 &amp;&amp; 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 &amp;&amp; git push --tags - 此时,分支release-1.3 中有一个标签release-1.3.0,其中所有相关的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

      然后我可以在标签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 下载。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

        • 帮助我使用 gitlab.com
        【解决方案5】:

        我在这样的电话中遇到了同样的问题

        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 系统。

        【讨论】:

        • 您好,此解决方案仅适用于 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 使用本地签出而不是从上游存储库进行签出。
        【解决方案6】:

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

        推送以掌握更新正确版本的pom

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

        但是当它试图推送标签时

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

        有人解决了吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-12-31
          • 1970-01-01
          • 1970-01-01
          • 2010-12-17
          • 2012-03-20
          • 1970-01-01
          • 2021-05-22
          • 1970-01-01
          相关资源
          最近更新 更多