【问题标题】:Using a Jenkins variable in application properties file of spring boot app在 Spring Boot 应用程序的应用程序属性文件中使用 Jenkins 变量
【发布时间】:2020-03-11 19:29:03
【问题描述】:

我有一个从保险库中提取秘密的 Spring Boot 应用程序,我想在 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,那么我如何在 spring boot 应用程序中使用 VAR 设置我的应用程序属性文件中的某些东西的值?

谢谢

【问题讨论】:

    标签: java spring spring-boot jenkins groovy


    【解决方案1】:

    通过 application.properties 读取:

    将VAR的值设置为java系统或环境,在application.properties中读取就好

    my.app.prop=${ENV_VARIABLE}
    

    用于阅读 Jenkins 文件:

    为了在 jenkins 文件中读取它,编写一个 groovy 脚本并读取 System.properties[ENV_VARIABLE] 之类的属性

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

    【讨论】:

    • 关于如何在 Jenkins 文件中设置的详细信息?
    • 我认为他提倡的想法是您将 application.properties 文件中的属性定义为对环境变量的引用,然后在运行时将实际值传递给...作为环境变量,这在您的情况下,您可能会按照此处所述进行设置:stackoverflow.com/questions/10413936/…
    • @MickO'Gorman 我认为您最初的问题只是通过 application.properties 文件阅读它,我已经编辑了从 jenkins 文件中阅读它的答案。希望这是有道理的。
    • 好的,接受这个答案,其他的也是正确的,但这是第一个,你回来编辑。
    【解决方案2】:

    您可以使用spring-cloud-starter-config starter pom 依赖项以一种更清洁且值得信赖的方式完成此操作,并避免重新发明轮子。我已经用过很多次了,可以保证它的作用就像魅力一样。

    依赖是:

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

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

    然后你必须声明一个带有@VaultPropertySource 注释的弹簧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 秘密映射。

    就是这样。现在您的道具具有保险库中的值。您可以看到它将值填充到属性中的干净程度。

    只有一件事要确保,您需要在@VaultPropertySourcevalue 属性中指定从保管库接收值的属性。

    【讨论】:

    • hmm 不确定这是否对我有用,因为在我们公司,我们使用另一个团队创建的方法推送和拉取保管库机密,因此我可以使用另一个团队在我的 Jenkins 文件中提取机密团队方法,虽然我明天会试一试,看看它是否有效。
    • @MickO'Gorman 我认为您必须编辑您的问题并在问题中添加此评论,因为问题可能不太清楚。
    【解决方案3】:

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

    System.getProperty("USERNAME");
    

    您也可以将它直接读入 GAK 提到的属性文件中。 例如

    ${env.JOB_NAME}
    

    【讨论】:

      猜你喜欢
      • 2021-03-12
      • 1970-01-01
      • 2018-12-13
      • 2018-08-03
      • 2018-03-23
      • 2018-08-29
      • 2015-11-21
      • 2020-06-30
      • 2019-04-15
      相关资源
      最近更新 更多