在Spring Boot应用程序属性文件中使用Jenkins变量

7

我有一个使用Spring Boot编写的应用程序,从Vault中获取密码,我想在Spring Boot应用程序的属性文件中使用这些密码。

def VAR = new groovy.json.JsonSlurper().parseText(secret)[0].VARKEY
if(VAR != ''){
    echo "Vault Secret pulled Successfully pass is "+VAR
}else{
    echo "Vault Secret Not Found"
}

这段代码成功地设置了变量VAR,那么我该如何使用VAR来设置Spring Boot应用程序的应用属性文件中某个值呢?

谢谢。

3个回答

5

若要通过application.properties读取:

将VAR的值设置为java系统或环境变量,并在application.properties中读取,如下:

my.app.prop=${ENV_VARIABLE}

用于Jenkins文件的读取:

为了在Jenkins文件中读取它,请编写一个Groovy脚本,并像这样读取属性:System.properties [ENV_VARIABLE]

注意:我假设您的Spring Boot应用程序和Jenkins运行在同一个JVM上。


如何在Jenkins文件中设置此项的任何详细信息? - AnonymousAlias
我认为他提倡的想法是在application.properties文件中将属性定义为环境变量的引用,然后在运行时将实际值作为环境变量传递...在您的情况下,您可能会按照此处描述的方式设置环境变量:https://dev59.com/U2kv5IYBdhLWcg3wtS4N - Izzy
@MickO'Gorman 我原以为你的问题只是想通过 application.properties 文件来读取它,我已经编辑了我的答案,让它可以从 Jenkins 文件中读取。希望这样说得通。 - GAK
好的,我会接受这个答案。其他的答案也是正确的,但这个是最先回答并且回来进行编辑的。 - AnonymousAlias

4

您可以使用spring-cloud-starter-config启动程序依赖项以更加清晰和可信地执行此操作,并避免重复造轮子。我经常使用它并保证它能够完美运行。

依赖项是:

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-vault-config</artifactId>
            <version>2.0.0.RELEASE</version>
        </dependency>

使用方法:您必须在application.properties文件中声明所有要从vault映射值的属性(假设这些是默认值)。

然后,您必须声明一个带有@VaultPropertySource注释的Spring Configuration,如下所示:

@Configuration
@Profile("prod")
@VaultPropertySource(
    value = {
      "secret/${spring.application.name}/spring.mail.username",
      "secret/${spring.application.name}/spring.mail.password",
    })
public class VaultConfig {

  @Bean
  @ConditionalOnProperty("spring.cloud.vault.enabled")
  public VaultTemplate vaultTemplate(
      @Value("${spring.cloud.vault.host:localhost}") final String host,
      @Value("${spring.cloud.vault.port:8200}") final String port,
      @Value("${spring.cloud.vault.scheme:https}") final String scheme,
      SessionManager sessionManager) {
    VaultEndpoint vaultEndpoint = VaultEndpoint.create(host, Integer.valueOf(port));
    vaultEndpoint.setScheme(scheme);
    return new VaultTemplateExtension(
        vaultEndpoint, new HttpComponentsClientHttpRequestFactory(), sessionManager);
  }
}

注意:

  1. 我使用了@Profile注释只是为了展示如何仅为配置文件进行配置。

  2. vaultTemplate方法从指定的属性或以冒号分隔的默认值中接收其valut服务器配置值。

  3. 您可以使用@ConditionalOnProperty来决定何时启用对vault密钥映射的属性。

就这样。现在您的props已经有了从保险库获取的值。您可以看到它如何清洁地将值填充到属性中。

唯一需要确保的是,您需要在@VaultPropertySourcevalue属性中指定从vault中接收值的属性。


不确定这对我是否有效,因为在我们公司,我们使用另一个团队创建的方法推送和拉取保险库密码,所以我可以使用其他团队的方法在我的Jenkins文件中拉取密码,但是明天我会尝试一下看看它是否有效。 - AnonymousAlias
@MickO'Gorman 我认为你必须编辑你的问题,并将这个评论添加到问题中,因为问题不是很清楚。 - Vinay Prajapati

1

另一种方法是使用JAVA类读取jenkins变量并写入属性文件,然后从属性文件中读取。例如,假设USERNAME是您用于构建jenkins作业的字符串参数之一,则可以使用以下代码在JAVA类中访问它。

System.getProperty("USERNAME");

你可以像GAK提到的那样,直接将内容读取到属性文件中。 例如。
${env.JOB_NAME}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接