使用标准 Maven 插件发布时如何将密码短语传递给私钥

How to pass passphrase to private key when releasing with standard maven plugin

我正在尝试使用标准 Maven 发布插件和 Bitbucket 管道发布我的 Maven 项目。我创建了自己的 docker 图像,其中私钥受密码保护。我的 Bitbucket 帐户允许从这个 docker 图像提交,并且 Bitbucket 管道能够在构建时通过环境变量注入私钥密码。

问题是 maven 发布插件会忽略所有内容并要求输入密码,这是不可接受的手动步骤。

我的 settings.xml 在 /root/.m2 中看起来像

<server>
    <id>bitbucket.org</id>
    <privateKey>/root/.ssh/id_rsa</privateKey>
    <passphrase>${env.BB_PIPELINES_MAVEN_3_3_9_JDK_8_SSH_PASSPHRASE</passphrase>
</server>

我正在使用最新版本和 scm 插件,分别为 2.5.3 和 1.9.5

在我的 pom.xml 中有服务器 属性

<project.scm.id>bitbucket.org</project.scm.id>

我的 scm url 就像

<scm>
    <url>https://bitbucket.org/user/repo</url>
    <developerConnection>scm:git:git@bitbucket.org:user/repo</developerConnection
    <connection>scm:git:git@bitbucket.org:user/repo</connection>
</scm>

我尝试使用 ssh-agent,它似乎可以工作,但看起来 ssh-agent 也不允许在命令行中传递密码。

有什么办法可以解决吗?

我设法使用 expect 和 ssh-agent 做了一些解决方法。

在我的 .bashrc 中,我已将

eval `ssh-agent -s`
/root/load-private-key.sh $BITBUCKET_PIPELINES_MAVEN_3_3_9_JDK_8_SSH_PASSPHRASE

我的 load-private-key.sh 文件看起来像

#!/usr/bin/expect -f
set password [lindex $argv 0];
set timeout 10
spawn ssh-add /root/.ssh/id_rsa
expect "Enter passphrase for /root/.ssh/id_rsa: "
sleep 1
send $password\n
expect "Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)"

现在每个构建会话都从加载到内存中的私钥开始,它可以被标准的 maven 发布插件使用。