如何将凭据从一个詹金斯实例导出到另一个实例?
How to export credentials from one jenkins instance to another?
我正在使用 Jenkins 中的凭据插件来管理 git 的凭据和我团队构建的数据库访问。我想将凭据从一个 jenkins 实例复制到另一个独立的 jenkins 实例。我该怎么做?
您是否尝试将 $JENKINS_HOME/users 文件夹和 $JENKINS_HOME/credentials.xml 文件复制到另一个 Jenkins 实例?
更新:TL;DR 按照 Filip Stachowiak 评论中提供的 link 进行操作,这是最简单的方法去做吧。如果它对您不起作用,请继续阅读。
复制 $HUDSON_HOME/credentials.xml 不是解决方案,因为 Jenkins 会加密密码,除非它们共享一个公共密钥,否则无法被另一个实例解密。
因此,要么在两个 Jenkins 实例 ( ) 中使用相同的加密密钥,要么您可以做的是:
- 创建相同的user/password,您需要在第 2 个 Jenkins 实例中共享,以便生成有效密码
真正重要的是 credentials.xml 中的用户 ID 是相同的。为此(参见下面的 credentials.xml 示例)用户:Jenkins 标识符 <id>c4855f57-5107-4b69-97fd-298e56a9977d</id>
在两个 credentials.xml
中必须相同
<com.cloudbees.plugins.credentials.SystemCredentialsProvider plugin="credentials@1.22">
<domainCredentialsMap class="hudson.util.CopyOnWriteMap$Hash">
<entry>
<com.cloudbees.plugins.credentials.domains.Domain>
<specifications/>
</com.cloudbees.plugins.credentials.domains.Domain>
<java.util.concurrent.CopyOnWriteArrayList>
<com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
<scope>GLOBAL</scope>
<id>c4855f57-5107-4b69-97fd-298e56a9977d</id>
<description>Para SVN</description>
<username>jenkins</username>
<password>J1ztA2vSXHbm60k5PjLl5jg70ZooSFKF+kRAo08UVts=
</password>
</com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl>
</java.util.concurrent.CopyOnWriteArrayList>
</entry>
</domainCredentialsMap>
</com.cloudbees.plugins.credentials.SystemCredentialsProvider>
我也遇到了同样的问题。对我有用的是我将 credentials.xml、config.xml 和 secrets 文件夹从现有的 jenkins 复制到新实例。重启 jenkins 后一切正常。
这对我有用。
在 Jenkins 中创建一个获取凭据并将其写入输出的作业。如果Jenkins将输出中的密码替换为****,那么先混淆一下即可(每个字符之间加一个space,字符倒转,base64编码等)
我使用 Powershell 作业对其进行 base64 编码:
[convert]::ToBase64String([text.encoding]::Default.GetBytes($mysecret))
然后使用 Powershell 将 base64 字符串转换回常规字符串:
[text.encoding]::Default.GetString([convert]::FromBase64String("bXlzZWNyZXQ="))
在尝试了好几天之后,这是我找到的将我的秘密从 Jenkins 2.176 迁移到新的干净的 Jenkins 2.249.1 的最佳解决方案jenkins-cli 对我来说是最好的方法。
这个过程非常简单,只需将凭证从旧实例转储到本地机器,或安装了 java 的 Docker pod,作为 XML 文件(未加密)和然后上传到新实例。
开始之前,您应该验证以下内容:
- 访问两个 Jenkins 实例上的凭据部分
- 从实例之一下载 jenkins-ccli.jar (https://www.your-jenkins-url.com/cli/)
- 手边有用户和 Password/Token。
Notice: In case your jenkins uses an oAuth service you will need to
create a token for your user. Once logged into jenkins at the top
right if you click your profile you can verify both username and
generate password.
现在对于特殊酱料,您必须从同一个 machine/pod:
执行两个部分
Notice: If your instances are using valid Certificates and you want to
secure your connection you must remove the -noCertificateCheck
flag from both commands.
# 旧 JENKINS 转储 #
export USER=madox@example.com
export TOKEN=f561banana6ead83b587a4a8799c12c307
export SERVER=https://old-jenkins-url.com/
java -jar jenkins-cli.jar -noCertificateCheck -s $SERVER -auth $USER:$TOKEN list-credentials-as-xml "system::system::jenkins" > /tmp/jenkins_credentials.xml
# 新 JENKINS 导入 #
export USER=admin
export TOKEN=admin
export SERVER=https://new-jenkins-url.com/
java -jar jenkins-cli.jar -noCertificateCheck -s $SERVER -auth $USER:$TOKEN import-credentials-as-xml "system::system::jenkins" < /tmp/jenkins_credentials.xml
如果您有 credentials.xml
可用并且旧的 Jenkins 实例仍然 运行,则有一种方法可以解密个人凭据,因此您可以通过 [=21] 在新的 Jenkins 实例中输入它们=].
DevOps stackexchange by kenorb.
中描述了该方法
这不会转换所有凭据以实现简单的自动迁移,但在您只有很少的凭据要迁移(手动)时会有所帮助。
总而言之,您在旧的 Jenkins 实例上访问 /script
页面,并在以下行中使用来自 credentials.xml
文件的加密凭证:
println(hudson.util.Secret.decrypt("{EncryptedCredentialFromCredentialsXml=}"))
将用户从一个 Jenkins 实例迁移到新服务器上的另一个 Jenkins -
我尝试关注 which lead to https://itsecureadmin.com/2018/03/26/jenkins-migrating-credentials/。但是我没有成功执行这些步骤。
此外,我尝试将 /var/lib/jenkins/users
(或 {JENKINS_HOME}/users
)目录导出到新服务器上的新实例。在新服务器上重新启动 Jenkins 后 - 看起来所有用户凭据都在新服务器上可用。
此外,我交叉检查了用户是否可以登录到新的 Jenkins 实例。目前有效。
PS: 此代码适用于 redhat 服务器
旧服务器:
cd /var/lib/jeknins
或 cd
进入您 Jenkins 家所在的任何地方
tar cvzf users.tgz ./users
新服务器:
cd /var/lib/jeknins
scp <user>@<oldserver>:/var/lib/jenkins/user.tgz ~/var/lib/jenkins/.
sudo tar xvzf users.tgz
systemctl restart jenkins
我正在使用 Jenkins 中的凭据插件来管理 git 的凭据和我团队构建的数据库访问。我想将凭据从一个 jenkins 实例复制到另一个独立的 jenkins 实例。我该怎么做?
您是否尝试将 $JENKINS_HOME/users 文件夹和 $JENKINS_HOME/credentials.xml 文件复制到另一个 Jenkins 实例?
更新:TL;DR 按照 Filip Stachowiak 评论中提供的 link 进行操作,这是最简单的方法去做吧。如果它对您不起作用,请继续阅读。
复制 $HUDSON_HOME/credentials.xml 不是解决方案,因为 Jenkins 会加密密码,除非它们共享一个公共密钥,否则无法被另一个实例解密。
因此,要么在两个 Jenkins 实例 (
- 创建相同的user/password,您需要在第 2 个 Jenkins 实例中共享,以便生成有效密码
真正重要的是 credentials.xml 中的用户 ID 是相同的。为此(参见下面的 credentials.xml 示例)用户:Jenkins 标识符
中必须相同<id>c4855f57-5107-4b69-97fd-298e56a9977d</id>
在两个 credentials.xml<com.cloudbees.plugins.credentials.SystemCredentialsProvider plugin="credentials@1.22"> <domainCredentialsMap class="hudson.util.CopyOnWriteMap$Hash"> <entry> <com.cloudbees.plugins.credentials.domains.Domain> <specifications/> </com.cloudbees.plugins.credentials.domains.Domain> <java.util.concurrent.CopyOnWriteArrayList> <com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl> <scope>GLOBAL</scope> <id>c4855f57-5107-4b69-97fd-298e56a9977d</id> <description>Para SVN</description> <username>jenkins</username> <password>J1ztA2vSXHbm60k5PjLl5jg70ZooSFKF+kRAo08UVts= </password> </com.cloudbees.plugins.credentials.impl.UsernamePasswordCredentialsImpl> </java.util.concurrent.CopyOnWriteArrayList> </entry> </domainCredentialsMap> </com.cloudbees.plugins.credentials.SystemCredentialsProvider>
我也遇到了同样的问题。对我有用的是我将 credentials.xml、config.xml 和 secrets 文件夹从现有的 jenkins 复制到新实例。重启 jenkins 后一切正常。
这对我有用。
在 Jenkins 中创建一个获取凭据并将其写入输出的作业。如果Jenkins将输出中的密码替换为****,那么先混淆一下即可(每个字符之间加一个space,字符倒转,base64编码等)
我使用 Powershell 作业对其进行 base64 编码:
[convert]::ToBase64String([text.encoding]::Default.GetBytes($mysecret))
然后使用 Powershell 将 base64 字符串转换回常规字符串:
[text.encoding]::Default.GetString([convert]::FromBase64String("bXlzZWNyZXQ="))
在尝试了好几天之后,这是我找到的将我的秘密从 Jenkins 2.176 迁移到新的干净的 Jenkins 2.249.1 的最佳解决方案jenkins-cli 对我来说是最好的方法。
这个过程非常简单,只需将凭证从旧实例转储到本地机器,或安装了 java 的 Docker pod,作为 XML 文件(未加密)和然后上传到新实例。
开始之前,您应该验证以下内容:
- 访问两个 Jenkins 实例上的凭据部分
- 从实例之一下载 jenkins-ccli.jar (https://www.your-jenkins-url.com/cli/)
- 手边有用户和 Password/Token。
Notice: In case your jenkins uses an oAuth service you will need to create a token for your user. Once logged into jenkins at the top right if you click your profile you can verify both username and generate password.
现在对于特殊酱料,您必须从同一个 machine/pod:
执行两个部分Notice: If your instances are using valid Certificates and you want to secure your connection you must remove the -noCertificateCheck flag from both commands.
# 旧 JENKINS 转储 #
export USER=madox@example.com
export TOKEN=f561banana6ead83b587a4a8799c12c307
export SERVER=https://old-jenkins-url.com/
java -jar jenkins-cli.jar -noCertificateCheck -s $SERVER -auth $USER:$TOKEN list-credentials-as-xml "system::system::jenkins" > /tmp/jenkins_credentials.xml
# 新 JENKINS 导入 #
export USER=admin
export TOKEN=admin
export SERVER=https://new-jenkins-url.com/
java -jar jenkins-cli.jar -noCertificateCheck -s $SERVER -auth $USER:$TOKEN import-credentials-as-xml "system::system::jenkins" < /tmp/jenkins_credentials.xml
如果您有 credentials.xml
可用并且旧的 Jenkins 实例仍然 运行,则有一种方法可以解密个人凭据,因此您可以通过 [=21] 在新的 Jenkins 实例中输入它们=].
DevOps stackexchange by kenorb.
这不会转换所有凭据以实现简单的自动迁移,但在您只有很少的凭据要迁移(手动)时会有所帮助。
总而言之,您在旧的 Jenkins 实例上访问 /script
页面,并在以下行中使用来自 credentials.xml
文件的加密凭证:
println(hudson.util.Secret.decrypt("{EncryptedCredentialFromCredentialsXml=}"))
将用户从一个 Jenkins 实例迁移到新服务器上的另一个 Jenkins -
我尝试关注 /var/lib/jenkins/users
(或 {JENKINS_HOME}/users
)目录导出到新服务器上的新实例。在新服务器上重新启动 Jenkins 后 - 看起来所有用户凭据都在新服务器上可用。
此外,我交叉检查了用户是否可以登录到新的 Jenkins 实例。目前有效。
PS: 此代码适用于 redhat 服务器
旧服务器:
cd /var/lib/jeknins
或 cd
进入您 Jenkins 家所在的任何地方
tar cvzf users.tgz ./users
新服务器:
cd /var/lib/jeknins
scp <user>@<oldserver>:/var/lib/jenkins/user.tgz ~/var/lib/jenkins/.
sudo tar xvzf users.tgz
systemctl restart jenkins