我正在尝试为使用 maven 的 Java 应用程序之一创建 Azure DevOps 管道,在单元测试中,我有 2 个需要访问环境变量值的 secret 。
String key = System.getenv().get("MY_KEY");
String secret = System.getenv().get("MY_SECRET");
我在浏览器的管道变量下添加了 2 个值,并将它们标记为“将此值保密”,以便将值保密。
在管道中,我添加了所需的变量并用配置的变量替换了该值。
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/