带有 maven 的 gitlab CI/CD 不会在 application.properties 中设置环境变量

Posted

技术标签:

【中文标题】带有 maven 的 gitlab CI/CD 不会在 application.properties 中设置环境变量【英文标题】:gitlab CI/CD with maven doesn't setup environment variables in application.properties 【发布时间】:2021-12-01 08:27:49 【问题描述】:

我正在尝试使用 maven 构建 CI/CD 管道。我遇到的问题是在 application.properties 我设置了这样的变量:

database.MongoPass=$MONGO_PASS
database.Secret=$SECRET
database.connectionString=$ATLAS_STRING
spring.data.mongodb.uri=$ATLAS_STRING

我无法在 gitlab 中设置它们。每次如果 gitlab 将一直构建包我无法运行它,因为连接字符串错误我得到错误: “连接字符串无效。连接字符串必须以'mongodb://'或'mongodb+srv://'开头”

这里是我在 gitlab CI/CD 设置中设置的变量示例

以及我尝试在 gitlab CI/CD 中运行的代码 echo 工作正常并显示正确的变量值 我试过的每个 mvn 脚本都不起作用

 script:
    - echo $SECRET
    - echo $MONGO_PASS
    - echo $ATLAS_STRING
    - mvn install -B #  (I hope that application properties automatically get variables from gitlab env) 
    - mvn -DSECRET=$SECRET -DMONGO_PASS=$MONGO_PASS -DATLAS_STRING=$ATLAS_STRING clean install -B #  (I found this solution on stack) 
    - mvn -Dspring-boot.run.arguments=--database.Secret=$SECRET,--database.MongoPass=$MONGO_PASS,--spring.data.mongodb.uri=$ATLAS_STRING clean install -B #  (if I change here env variables for normal string it wont't build on gitlab) 

我不知道我应该做什么,我不想在我的 repo 中保存变量,也不知道该怎么做。有人可以给我建议吗? mvn 脚本在每次运行后在工件中构建 jar 文件我下载它并运行以使用命令对其进行测试

java -jar filename.jar

更新: 春季启动后,我进行了小调查并上课测试变量:

  @PostConstruct
    public void test() 
        log.info("VARIABLES TEST");
        log.info("properties.getSecret(): ", properties.getSecret());
        log.info("properties.getConnectionString(): ", properties.getConnectionString());
        log.info("properties.getMongoPass(): ", properties.getMongoPass());
    

并且变量都没有设置:

properties.getSecret(): $SECRET
properties.getConnectionString(): $ATLAS_STRING
properties.getMongoPass(): $MONGO_PASS

gitlab-ci.yml:

image: maven:3.8.1-jdk-11

build_artifact:
  stage: build
  script:
    - export
#    - mvn install -B -P no-tests
    - mvn -DSECRET=$SECRET -DMONGO_PASS=$MONGO_PASS -DATLAS_STRING=$ATLAS_STRING clean install -B -P no-tests #  (I found this solution on stack)
#    - mvn -Dspring-boot.run.arguments=--database.Secret=$SECRET,--database.MongoPass=$MONGO_PASS,--spring.data.mongodb.uri=$ATLAS_STRING clean install -B -P no-tests #  (if I change here env variables for normal string it wont't build on gitlab)
  artifacts:
    paths:
      - target/*.jar
    expire_in: 10 minutes

管道结果示例:

Running with gitlab-runner 14.4.0-rc1 (bc99a056)
  on docker-auto-scale ed2dce3a
Preparing the "docker+machine" executor
00:23
Using Docker executor with image maven:3.8.1-jdk-11 ...
Pulling docker image maven:3.8.1-jdk-11 ...
Using docker image sha256:5b508b1fe19e290255c9e077a1c7af028a576cabb70eab4abdfee574599f729f for maven:3.8.1-jdk-11 with digest maven@sha256:aaf506d47cd2ec8f62fc1ff74065eda5614738e8ea61bad9b32da0360b9498cd ...
Preparing environment
00:01
Running on runner-ed2dce3a-project-16772800-concurrent-0 via runner-ed2dce3a-srm-1634103033-dfd4e8e6...
Getting source from Git repository
00:03
$ eval "$CI_PRE_CLONE_SCRIPT"
Fetching changes with git depth set to 50...
Initialized empty Git repository in /builds/**/***/.git/
Created fresh repository.
Checking out 60bf3869 as feature/branch
Skipping Git submodules setup
Executing "step_script" stage of the job script
$ mvn -DSECRET=$SECRET -DMONGO_PASS=$MONGO_PASS -DATLAS_STRING=$ATLAS_STRING clean install -B -P no-tests
***
Downloading all dependencies 
***
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:00 min
[INFO] Finished at: 2021-10-13T05:34:25Z
[INFO] ------------------------------------------------------------------------
Uploading artifacts for successful job
00:07
Uploading artifacts...
target/*.jar: found 1 matching files and directories 
Uploading artifacts as "archive" to coordinator... ok  id=1674250996 responseStatus=201 Created token=z2qnoeL8
Cleaning up project directory and file based variables
00:00
Job succeeded


【问题讨论】:

在 gitlab 中,您需要保护您的分支才能访问环境变量。试试看 让脚本的第一行为export。然后你可以看到有什么可用的。如果一切都如预期的那样,gitlab 没问题,而问题出在其他地方。 能否请您添加您的gitlab-ci.yml 文件以及您的管道日志的输出或屏幕截图? @KumarAshutosh protected 分支在变量受到保护时需要,所以在我的情况下我不需要受保护的分支。无论如何,我尝试了受保护的并且仍然相同。 @ThorbjørnRavnAndersen 我做到了,变量没问题,maven 不想把它们移到应用程序中 【参考方案1】:

有根据的猜测:您还没有为您的 application.properties 属性文件启用maven filtering。

如果不进行过滤,这些占位符将不会被替换。

所以在你的 pom 文件中有这样的东西:

<project>
  ...
  <build>
    ...
    <resources>
      <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
      </resource>
      ...
    </resources>
    ...
  </build>
  ...
</project>

【讨论】:

没用 :( @BartoszKolej 您是否确认已启用过滤并在 maven 构建期间替换值? 如果我在我的机器上运行 maven build 它可以完美地构建具有正确值的工作 jar 文件,问题仅在 gitlab CI 相同的构建命令上,但我在 application.properties 中的变量始终保持如下:$ ATLAS_STRING 您的解决方案是正确的,我唯一需要更改的是在这篇文章中:***.com/questions/36501017/… 示例:database.MongoPass=$MONGO_PASS 到 database.MongoPass=@MONGO_PASS@ 然后它适用于春季启动:)【参考方案2】:

尝试以下步骤并确保每个步骤都正常工作:

    检查您的分支是否受到保护。如果它不受保护,您将无法访问已定义的环境变量。

    使用export命令检查环境变量是否设置正确:

    script:
        - export
        # - <other commands>
    

    在您的 POM 文件中将过滤设置为 true。

    将 application.properties 更改为以下内容:

    database.MongoPass=$MONGO_PASS$
    database.Secret=$SECRET$
    database.connectionString=$ATLAS_STRING$
    spring.data.mongodb.uri=$ATLAS_STRING$
    

【讨论】:

当变量受到保护时需要 1 个受保护的分支,所以在我的情况下,我不需要受保护的分支。无论如何,我尝试了受保护的并且仍然相同。 2 export 告诉我 env 变量是正确的 3 过滤没有帮助。 过滤会起作用! @BartoszKolej

以上是关于带有 maven 的 gitlab CI/CD 不会在 application.properties 中设置环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Maven GitLab CI/CD 管道中将 JaCoCo 报告 HTML 转换为 PDF

你能在 GitLab CI/CD 中添加外部 Maven 库吗

用于 Maven 部署的 Gitlab CI/CD 的适当阶段是啥?

gitlab 的 CI/CD 配置管理

带有 gitlab CI/CD 的 Rails .env

基于Jenkins+maven+gitlab+harbor+Rancher+k8s的CI/CD实现(尚未完成,还在更新中)