我在您的日志中看到两个需要解决的单独问题。
无法连接到`/usr/share/tomcat6/.gnupg/S.gpg-agent':没有这样的文件或目录
gpg-agent需要在构建主机上作为守护进程运行,它将连接到套接字以侦听请求。也许它已经在运行,但是 Jenkins 正在错误的目录中寻找它的套接字,因为GNUPGHOME
它被设置为一些不寻常的值。或者可能gpg-agent
没有运行,需要启动一个新实例。
类似此脚本的内容可用于安全地附加到现有gpg-agent
实例或启动新实例。
#!/bin/bash
# Decide whether to start gpg-agent daemon.
# Create necessary symbolic link in $GNUPGHOME/.gnupg/S.gpg-agent
SOCKET=S.gpg-agent
PIDOF=`pgrep gpg-agent`
RETVAL=$?
if [ "$RETVAL" -eq 1 ]; then
echo "Starting gpg-agent daemon."
eval `gpg-agent --daemon `
else
echo "Daemon gpg-agent already running."
fi
# Nasty way to find gpg-agent's socket file...
GPG_SOCKET_FILE=`find /tmp/gpg-* -name $SOCKET`
echo "Updating socket file link."
cp -fs $GPG_SOCKET_FILE $GNUPGHOME/.gnupg/S.gpg-agent
您可能需要替换pgrep
为pidof
,具体取决于您的外壳。
如果您最终启动了一个新代理,您可以通过运行来检查您的密钥是否已加载到其中gpg --list-keys
。如果您没有看到它列出,您需要使用添加它gpg --import
。按照 Jenkins 文档使用凭证。
解决gpg-agent
问题可能会解决您的其他问题,因此请先检查您的工作是否正常,然后再执行其他任何操作。
参考:
gpg:跳过“信用”:密码错误
GPG 密钥受密码保护。rpm
要求输入此密码并希望手动输入。当然,Jenkins 是以非交互方式运行的,所以这是不可能的。我们需要某种方式来提供密码短语,rpm
以便它可以将其转发到gpg
,否则我们需要gpg
通过某种缓存机制直接提供密码短语。
期望方法
rpm --addsign
通过将我们的调用包装在一个期望脚本中,我们可以使用expect
无头输入密码。这种做法相当普遍。假设以下脚本名为rpm_sign.exp
:
#!/usr/bin/expect -f
set password [lindex $argv 0]
set files [lrange $argv 1 1]
spawn rpm --define --addsign $files
expect "Enter pass phrase:"
send -- "$password\r"
expect eof
此脚本可在 Jenkins shell 步骤或管道中使用,如下所示:
echo "Signing rpms ..."
sh "./rpm_sign.exp '${GPG_PASSPHRASE}' <list-of-files>"
请注意,通过一些修改,可以指定您希望使用哪个 GPG 身份来签署您的 RPM。这是通过--define {_gpg_name $YOUR_KEY_ID_HERE}
在包装脚本中作为参数传递给 rpm 来完成的。注意TCL语法。由于我们在 Jenkins 上执行此操作,它可能提供多组凭据,我认为这是相关信息。
参考:
其他方法
还有其他解决方案可能更适合您的配置。一种这样的解决方案是使用RpmSignPlugin,它expect
在引擎盖下使用。其他解决方案可以在unix.stackexchange.com上的这篇帖子中找到。