maven - 从 Azure 管道 maven 构建的单元测试访问安全变量

标签 maven unit-testing azure-devops environment-variables azure-pipelines

我正在尝试为使用 maven 的 Java 应用程序之一创建 Azure DevOps 管道,在单元测试中,我有 2 个需要访问环境变量值的 secret 。

String key = System.getenv().get("MY_KEY");
String secret = System.getenv().get("MY_SECRET");

我在浏览器的管道变量下添加了 2 个值,并将它们标记为“将此值保密”,以便将值保密。

enter image description here

在管道中,我添加了所需的变量并用配置的变量替换了该值。
variables:
  MY_KEY: $(MY_KEY_VAL)
  MY_SECRET: $(MY_SECRET_VAL)

但是,当我运行构建管道时,由于 'key' 和 'secret' 值上的空值,它在单元测试中失败。

我怎样才能解决这个问题?我在配置上做错了什么吗?

更新

正如 Ben 在下面提到的,不可能在托管代理上设置环境变量。为了在构建管道期间运行所有单元测试并仍然保持 key 和 secret 的安全,我修改了单元测试以从项目根目录上的文件中读取 key 和 secret 。而是将包含 key 和 secret 的文件添加到 git repo,它被添加为管道库上的安全文件,并被授予管道访问权限。

在流水线上,我能够使用“DownloadSecureFile”任务下载安全文件。
- task: DownloadSecureFile@1
  displayName: Download API secrets
  name: configfile
  inputs:
    secureFile: 'service_api_keys'

使用 bash 将文件移动到项目根目录。
- bash: mv $(configfile.secureFilePath) ./

运行构建过程,该过程将读取单元测试执行的 secret 。

最佳答案

System.getenv() 读取运行 java 代码的机器的系统环境变量。并且管道中定义的变量在代理范围内而不是机器范围内。也许这就是单元测试无法获取变量的原因。

可能没有直接的方法来实现这一点。正如 Ben Smith 提到的,您可以重构代码以从 json 文件中获取 key / secret 并添加 Set Json Property在 maven 任务运行单元测试之前,使用您在管道中定义的变量更新 json 文件。查询 here有关此任务的详细用法。

作为另一种解决方法,您可以在自托管的 linux 代理上运行您的管道,并尝试添加一个 bash 脚本任务来为您的 linux 代理设置环境变量(我测试并发现设置环境变量不适用于共享托管代理人)。查询 here关于如何为linux设置环境变量。

查询 here创建自托管 linux 代理的说明。

希望你会发现以上有帮助!

关于maven - 从 Azure 管道 maven 构建的单元测试访问安全变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58518114/

相关文章:

automated-tests - 在 VSTS 中通过命令行测试运行程序发布测试结果

azure - 编译时间与运行时 Azure Pipelines

java - 如何在服务器上运行 Maven Java 应用程序

Java:我自己的 MANIFEST.MF 文件在 maven 构建的 jar 中不生效

c++ - Visual C++ 项目 : best unit test setup

Azure 应用服务计划 'out of space' 但门户显示 99% 的可用空间

java - Jenkins 无法为我的 Selenium 项目编译 Maven

NetBeans + Maven、类路径

c# - 使用 Azure DocDB 创建用于单元测试的 ResourceResponse 对象

java - 为什么在 Assert.assertNotNull 中调用 void 函数是有效的?