问题描述
我正在寻找一种仅在 Jenkins 步骤期间注入机密的解决方案:
application.properties:
spring.datasource.username=mySecretValue
spring.datasource.password=mySecretValue
...
当前状态:
stage('Test') {
agent {
docker {
image 'myregistry.com/maven:3-alpine'
reuseNode true
}
}
steps {
configFileProvider([configFile(fileId: 'maven-settings-my-services',variable: 'MAVEN_SETTINGS')]) {
sh 'mvn -s $MAVEN_SETTINGS verify'
}
}
...
谢谢!
解决方法
选项 1) 为该机密添加密码作业参数。但是作业必须手动运行,因为需要有人输入秘密。
// write the secret to application.property at any stage that
// prior to test and deployment stage
sh "echo spring.datasource.password=${params.DB_PASSWORD} >> application.property"
选项 2) 将机密添加为 Jenkins 字符串文本凭据。但是添加凭证需要Jenkins管理员权限,也需要考虑后续更新。
stage('test or deployment') {
environment {
DB_PASSWORD = credentials('<credential_id_of_the_secret>')
}
steps {
sh "echo spring.datasource.password=${env.DB_PASSWORD} >> application.property"
}
}
,
我这样做的一种方法是通过变量附加凭证-插件变量的秘密:
echo 'Attach properties for tests to property file:'
withCredentials([string(credentialsId: 'DB_PW',variable: 'SECRET_ENV')]) {
sh 'echo spring.mydatabase.password=${SECRET_ENV} >> ./src/main/resources/application.properties'
除了“echo”,“sed”还可以替换键的空值,而不是将属性添加到文件末尾。
我做的第二种方法是附加一个完整的属性文件,而不是一个键/值对。属性文件包含测试所需的所有属性:
echo 'Attach properties file for test runs:' withCredentials([file(credentialsId: 'TEST_PROPERTIES',variable: 'APPLICATION_PROPERTIES')]) { dir('$WORKSPACE') {
sh 'sed s#'/src/main/resources/' application.properties > TEST_PROPERTIES'
在这两种情况下,必须在运行后删除机密,否则可以在 Workspace 文件夹下以纯文本形式查看。