凭证(credentials)
# 前言
曾经听过前辈经过的一句话,一个好的 Git 仓库应该是可以随时开源的,换言之,也就是说仓库中不应该出现任何秘钥信息,一旦开源(或泄露)必定存在安全风险,而 CI 脚本常常也存在与项目仓库中,脚本中不可避免会用到秘钥。
# 配置入口
- Manage Jenkins
- Security
- 凭据(Credentials)
- 全局
- Add Credentials
# 类型
通用属性
- ID:流水线必填,如
jenkins-aws-secret-key-id
,用于在流水线时调用credentials('id')
# Secret Text(Secret 文本)
常用于存储第三方 API 的 Token
- Secret:秘钥内容
pipeline {
agent {
// 此处定义 agent 的细节
}
environment {
AWS_ACCESS_KEY_ID = credentials('jenkins-aws-secret-key-id')
AWS_SECRET_ACCESS_KEY = credentials('jenkins-aws-secret-access-key')
}
stages {
stage('Example stage 1') {
steps {
//
}
}
stage('Example stage 2') {
steps {
//
}
}
}
}
# Username with password(带密码的用户名)
常用于存储账号、密码
- 用户名:账号
- Treat username as secret:将用户名视为秘钥,即不会在流水线输出中明文打印
- 密码:密码
environment {
BITBUCKET_COMMON_CREDS = credentials('jenkins-bitbucket-common-creds')
}
这实际设置了下面的三个环境变量:
BITBUCKET_COMMON_CREDS
- 包含一个以冒号分隔的用户名和密码,格式为username:password
。BITBUCKET_COMMON_CREDS_USR
- 附加的一个仅包含用户名部分的变量。BITBUCKET_COMMON_CREDS_PSW
- 附加的一个仅包含密码部分的变量。
# Secret file(Secret 文件)
常用于:
- 太笨拙而不能直接输入 Jenkins(超长秘钥)
- 二进制格式,比如 GPG 文件
- File:秘钥文件
# SSH Username with Private Key
常用于存储 Jenkins 的私钥,通常是重新生成的,当然也可以从其他设备复制过来。
- ID:如
jenkins-ssh-private-key
- username:
- Treat username as secret:将 username 视为秘钥
- Private Key - Enter directly:选中,输入公私钥文本
- Passphrase:口令短语
创建公私钥
在 Jenkins 的宿主机执行:
ssh-keygen
# 回车×N
cat ~/.ssh/id_rsa # 私钥,存储到Jenkins中
cat ~/.ssh/id_rsa.pub # 公钥,上传到Github等
// 通常在片段生成器中生成
withCredentials(bindings: [certificate(aliasVariable: '', \
credentialsId: 'jenkins-certificate-for-xyz', \
keystoreVariable: 'CERTIFICATE_FOR_XYZ', \
passwordVariable: 'XYZ-CERTIFICATE-PASSWORD')]) {
// some block
}
// 使用
node {
withCredentials([string(credentialsId: 'mytoken', variable: 'TOKEN')]) {
sh /* 错误! */ """
set +x
curl -H 'Token: $TOKEN' https://some.api/
"""
sh /* 正确 */ '''
set +x
curl -H 'Token: $TOKEN' https://some.api/
'''
}
}
# 参考
上次更新: 2023/11/19, 11:33:20