Jenkins Pipeline 中安全配置敏感环境变量须通过 Credentials 系统管理,使用 credentials() 或 withCredentials 注入,禁止硬编码;凭证按类型(Secret text、Username/password 等)创建并绑定唯一 credentialsId,作用域可控、自动清理、权限隔离。

在 Jenkins Pipeline 中安全配置敏感环境变量,核心是不硬编码、不暴露值、作用域可控。所有密码、密钥、令牌必须通过 Jenkins 内置的 Credentials 系统管理,并按需注入,而非写死在 Jenkinsfile 或 job 配置里。
凭证必须预先在 Jenkins 中创建并加密存储
登录 Jenkins → Credentials → System → Global credentials → Add Credentials,根据类型选择:
- Secret text:适合 API Token、JWT 密钥、Slack Bot Token 等纯文本敏感串
-
Username with password:适合数据库账号、私有仓库登录,Jenkins 会自动拆分为
XXX_USR和XXX_PSW两个变量 - SSH Username with private key:用于 Git over SSH、远程服务器部署等场景
- Secret file:适用于证书(.pem、.crt)、kubeconfig、JSON 密钥文件等二进制内容
每项凭证需设置唯一 credentialsId(如 prod-db-pass),后续 Pipeline 中只引用该 ID,真实内容始终不落地、不显示。
声明式 Pipeline 中安全注入凭证
推荐使用 environment 块配合 credentials() 函数,让凭证以环境变量形式全局或阶段级生效:
pipeline {
agent any
environment {
DB_PASSWORD = credentials('prod-db-pass')
AWS_ACCESS_KEY_ID = credentials('aws-prod-key-id')
AWS_SECRET_ACCESS_KEY = credentials('aws-prod-key-secret')
}
stages {
stage('Deploy') {
steps {
sh 'echo "Connecting to DB..." && ./deploy.sh'
}
}
}
}
注意:credentials() 只在声明式 Pipeline 的 environment 中可用;脚本式 Pipeline 必须改用 withCredentials 块。
脚本式 Pipeline 或多凭证组合时用 withCredentials
当需要同时注入用户名/密码 + 私钥 + 文件,或需控制作用域(比如仅某一步骤可见),必须用 withCredentials:
node {
stage('Build & Push') {
withCredentials([
usernamePassword(
credentialsId: 'docker-hub-cred',
usernameVariable: 'DOCKER_USER',
passwordVariable: 'DOCKER_PASS'
),
sshUserPrivateKey(
credentialsId: 'deploy-key',
keyFileVariable: 'SSH_KEY',
usernameVariable: 'SSH_USER'
),
file(credentialsId: 'tls-cert', variable: 'CERT_PATH')
]) {
sh '''
docker login -u $DOCKER_USER -p $DOCKER_PASS
scp -i $SSH_KEY $CERT_PATH $SSH_USER@prod-server:/etc/nginx/
'''
}
}
}
关键点:withCredentials 内部定义的变量在块外不可访问;临时文件(如 CERT_PATH)构建结束后自动删除,无残留风险。
权限与隔离建议
避免所有项目共用同一套凭证:
- 对不同环境(dev/staging/prod)创建独立 credentialsId,如
dev-db-cred、prod-api-token - 启用基于 Matrix 的权限控制,限制普通用户仅能查看/使用指定 credentials
- 定期轮换高危凭证(如生产数据库密码、云平台密钥),Jenkins 中只需更新 credentialsId 对应内容,Pipeline 脚本无需改动
- 禁用 Jenkins 主节点的直接 shell 访问权限,防止绕过 Pipeline 直接读取凭据文件


















