如何从凭证存储下载詹金斯秘密文件?

How do I download a jenkins secret file from the credential store?

我只能上传现有的 jenkins 秘密文件,不能下载现有文件。

如何下载我上传的现有机密文件以确认其内容?

如果您有 shell 访问权限和 sudo/root/Jenkins Unix 用户 权限machine 运行 Jenkins,您可以通过执行以下操作来检索秘密文件:

  • 在某些有权访问机密文件的 Jenkins 作业中,select 配置
  • Configuration界面上,在Build Environment下,select Use secret text(s)或文件.
  • 单击添加 -> 秘密文件。这将创建一个新的 Secret file 绑定。
  • Select 特定凭据,然后从其下方的下拉菜单中 select 您要检索的秘密文件。假设您的秘密文件存储在文件名 my-secret-file.txt.
  • 为这个秘密文件分配一个变量,例如MY_SECRET_FILE_TXT.
  • 现在,在 Pre Steps 下,单击 Add pre-build step -> Execute shell .
  • Command 文本区域,添加以下 shell 脚本:

    echo "executing user is $(whoami)"
    
    # remove my-secret-file.txt before possibly getting an overwriting error
    rm -f $WORKSPACE/my-secret-file.txt
    
    echo "Jenkins project workspace: $WORKSPACE"
    cp $MY_SECRET_FILE_TXT $WORKSPACE
    
  • 单击保存 以保存此配置。

下次为该项目触发构建时,秘密文件应出现在该项目的工作区中,即位置 $WORKSPACE/my-secret-file.txt。例如,在我的 Ubuntu 14.04.5 LTS 安装包和守护程序 jenkins 上,该位置是 /var/lib/jenkins/workspace/$JENKINS_PROJECT_NAME/my-secret-file.txt

如果您可以访问 Jenkins 实例的脚本控制台(例如通过在浏览器中访问 https://jenkins.example.com/script),您可以 运行 以下脚本:

import com.cloudbees.plugins.credentials.*;
import com.cloudbees.plugins.credentials.domains.Domain;
import org.jenkinsci.plugins.plaincredentials.impl.FileCredentialsImpl;

println "Jenkins credentials config file location=" + SystemCredentialsProvider.getConfigFile();
println ""

def fileName = "my-secret-file.txt"

SystemCredentialsProvider.getInstance().getCredentials().stream().
  filter { cred -> cred instanceof FileCredentialsImpl }.
  map { fileCred -> (FileCredentialsImpl) fileCred }.
  filter { fileCred -> fileName.equals( fileCred.getFileName() ) }.
  forEach { fileCred -> 
    String s = new String( fileCred.getSecretBytes().getPlainData() )
    println "XXXXXX BEGIN a secret file with fileName=" + fileName + " XXXXXXXXXXXX"
    println s
    println "XXXXXX END a secret file with fileName=" + fileName + " XXXXXXXXXXXX"
    println ""
  }

fileName更改为您要打印的文件名。 此脚本将打印出 Jenkins 凭证存储的全局域中文件名为 fileName 的文件内容。

此脚本的可修复警告:

脚本控制台的标记答案很棒。

还有这个脚本会列出所有可以从控制台 运行 获得的秘密: https://github.com/tkrzeminski/jenkins-groovy-scripts/blob/master/show-all-credentials.groovy

我通常通过创建这样的作业来从 jenkins 中提取秘密:

Jenkins 屏蔽了输出中的所有键,因此打印出来时只需替换一个字符即可。如果你的密钥中有另一个 0,它将显示为 *******,你可以尝试替换一个不同的字符,或者将它分成两半并在不同的行上打印两半,或者另一个类似的技巧。

您也可以像这样直接将其粘贴到文件中。

echo $HELLO > slack-key.txt