git - mvn release 使用特定的私钥推送到 git
问题描述
我希望有人可以帮助解决这个问题。我正在尝试配置mvn release
插件,pom.xml
以便将更新的 pom 版本和标签作为release:prepare
. 至关重要的是,它需要使用特定用户的 ssh 私钥,因为最终这将成为我们 CI 堆栈的一部分。
在pom.xml
我目前有一个非常简单的发布插件配置:
<build>
<plugins>
<!-- release plugin -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.3</version>
</plugin>
pom 中的scm
设置如下所示:
<scm>
<connection>scm:git:git://ssh@bitbucket.org/**account**/**project**.git</connection>
<developerConnection>scm:git:ssh://git@bitbucket.org/**account**/**project**.git</developerConnection>
<url>https://bitbucket.org/**account**/**project**</url>
</scm>
而且我在 pom 中有以下属性(尽管不确定是否使用了它 - 我在一个松散相关的问题上找到了对它的引用):
<properties>
<project.scm.id>bitbucket.org</project.scm.id>
最后,我在 mvn 中有以下内容settings.xml
:
<servers>
<server>
<id>bitbucket.org</id>
<privateKey>~/.ssh/bitbucket-read-write-access</privateKey>
<passphrase></passphrase>
</server>
私钥文件~/.ssh/bitbucket-read-write-access
存在,并且该文件夹中没有其他密钥(我特意去掉了默认的id_rsa
)
当我运行mvn release:perform
时,它在尝试推送到 repo 时失败:
[INFO] Executing: /bin/sh -c cd /home/nathanrussell/projects/**project** && git push ssh:********@bitbucket.org/**account**/**project**.git refs/heads/master:refs/heads/master
[INFO] Working directory: /home/nathanrussell/projects/**project**
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 13.162 s
[INFO] Finished at: 2018-11-09T15:25:36Z
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-release-plugin:2.5.3:prepare (default-cli) on project **project**: Unable to commit files
[ERROR] Provider message:
[ERROR] The git-push command failed.
[ERROR] Command output:
[ERROR] git@bitbucket.org: Permission denied (publickey).
[ERROR] fatal: Could not read from remote repository.
[ERROR]
[ERROR] Please make sure you have the correct access rights
[ERROR] and the repository exists.
我可以让它正确推送的唯一方法是将文件重命名为~/.ssh/bitbucket-read-write-access
让~/.ssh/id_rsa
我相信:
- 与私钥关联的用户对 repo 具有正确的权限,并且公钥与 repo 用户正确关联
- 在选择/使用所需的私钥方面,我的
pom.xml
和/或配置settings.xml
不太正确
(在任何人建议之前,我不能简单地将密钥重命名为,~/.ssh/id_rsa
因为当我们在 CI 堆栈上运行它时,它已经有一个用于其他目的的默认 ssh 密钥)
对此的任何想法或帮助将不胜感激
一些附加信息:
如果我这样做export GIT_SSH_COMMAND="ssh -i ~/.ssh/bitbucket-read-write-access"
,git push
它会很好地推动,这进一步让我相信私钥/公钥配置正确;这是错误的 mvn 配置。
解决方案
为了让这个工作,我使用了GIT_SSH_COMMAND
我在原始问题中写的方法的变体。
虽然GIT_SSH_COMMAND
在我的开发机器上工作,但git
我们的 CI 堆栈上的版本相当旧(1.7.1)并且GIT_SSH_COMMAND
不受支持!(GIT_SSH_COMMAND
在 2.10 中引入)
我通过GIT_SSH
环境变量和shell脚本的组合得到了这个:
export GIT_SSH=/var/home/teamcity/.ssh/ssh-using-bitbucket-read-write-access.sh
和
$ cat /var/home/teamcity/.ssh/ssh-using-bitbucket-read-write-access.sh
#!/bin/bash
ssh -i ~/.ssh/bitbucket-read-write-access $*
感觉有点骇人听闻,但它确实有效。
推荐阅读
- android-studio - Android Studio 和 Intelij Idea 中不可用的设备
- c# - 如何解决“Package Google Authenticator 1.2.1 已使用 .NETFramework 恢复”,但我不想升级到最新版本(C#)
- c# - 带有 EF Core 5.0 的 ASP Core 3.1 API
- python - 在 Python 3.8 中没有附加类的 TypedDict 的键入键、值
- amazon-web-services - AWS 过滤和导出日志
- python-3.x - 一对多关系sqlite3的问题
- c# - 我的网络应用程序从法语资源中获取翻译,我知道为什么
- scala - 如何使用 AsyncHttpClientCatsBackend 忽略 Scala 上的 SSL 认证?
- appgallery - 当我上传包时,一直出现错误:“上传失败”
- python - Django 无法加载带有静态文件的简单静态页面