【发布时间】:2022-01-06 16:27:47
【问题描述】:
背景
我正在开发一个模板化的管道解决方案,这样团队就可以在 Jenkins 中运行的每项工作中始终如一地构建、测试和扫描他们的项目。其中一个项目使用 Maven 进行依赖管理,并且需要传递 Jenkins 凭据才能运行集成测试。
什么有效?
通过命令行参数传递凭据可以正常工作。比如……
withCredentials([
[
$class: 'UsernamePasswordMultiBinding',
credentialsId: 'TEST',
usernameVariable: 'TEST_USERNAME',
passwordVariable: 'TEST_PASSWORD'
]
]) {
sh 'mvn clean install -D test_username=$TEST_USERNAME -D test_password=$TEST_PASSWORD'
}
想要的方法和结果是什么?
我强烈希望通过每个插件的配置(即 Maven Surefire 插件)将这些变量传递给底层插件。这种首选方法的理由是利用结构化方法来管理系统属性。我尝试了多种方法,包括通过设置 Surefire 配置的 <argLines> 元素和设置 <systemPropertyValues> 元素来传递参数,但是这两种方法都不起作用。此外,最好通过 YAML 文件引用这些属性以实现外部化配置,但我不反对访问这些信息的其他方法如果无法在配置文件中引用凭据变量。。 p>
pom.xml
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.22.2</version>
<configuration>
<!-- Tacking 'env.' to the beginning of each variable name does not make a difference; tests still fail. -->
<argLines>-D test_username=${TEST_USERNAME} -D test_password=${TEST_PASSWORD}</argLines>
<systemPropertyVariables>
<test_username>${TEST_USERNAME}</test_username>
<test_username>${TEST_PASSWORD}</test_username>
</systemPropertyVariables>
</configuration>
</plugin>
bootstrap-test.yaml
datasource:
jdbc_url: *omitted*
username: ${test_username}
password: ${test_password}
不工作是什么意思?
如果我尝试通过在配置部分中指定系统属性来在 Jenkins 环境中运行测试,那么测试会失败。顺便说一句,我将这些凭据传递给 Spring Boot,但 entityManagerFactory (org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder) 无法初始化。
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [com/acme/Config.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: Unable to resolve persistence unit root URL
我担心这个问题可能是由于 Spring Boot 无法访问混淆凭据,或者尝试在 Maven 生命周期中太晚访问配置文件中的系统属性。
我也不完全反对通过命令行传递系统属性,但模板化解决方案需要包含一种有效(安全)的方式来收集不同的凭证类型以传递给 Maven 调用。
更新 1:
在导出变量后在本地(顺便说一下,在 Windows 机器上)运行此项目确实有效,但在 Jenkins 中不起作用。在本地工作的方法涉及在 Surefire 插件配置部分设置环境或系统属性变量。我确实使用 env. 对 Jenkins 创建的环境变量进行了前缀引用。
更新 2:
使用 Maven antrun 插件,我能够回显 Jenkins 导出的掩码。
【问题讨论】:
-
您是否尝试将它们作为“秘密”存储在 Jenkins 中?我这样做是为了在我的应用程序中解密加密文件。我认为如果您将它们存储为(例如)“MAVEN_PWD”,您应该能够在运行时检索它们。
-
@hfontanez 是的,测试仍然无法解析外部化变量。您是如何访问您提到的项目中的这些变量的?命令行参数、Surefire 插件配置等?
-
#1 您使用的是脚本化管道还是声明性管道? #2 像 maven 这样的 Java 框架并不关心 jenkins 如何管理它的变量。通常那些使用环境变量来避免硬编码值。有没有适合你的选择,使用环境变量?
-
@JRichardsz 我正在使用声明性管道并开放使用环境变量。
-
@MikeDeitrick 不幸的是我不记得了,我不再受雇于我做这件事的地方。但是,我认为 JRichardsz 很喜欢。
标签: java maven jenkins credentials