如何在Azure Pipeline中将机密变量传入pytest?
解决Azure Pipeline中PDM运行Pytest无法读取机密变量的问题
修改思路
将原有的script任务替换为PythonScript任务,通过任务的arguments参数传递机密变量(规避环境变量传递的异常),在Python脚本内部设置环境变量后调用PDM运行Pytest。
修改后的YAML示例
jobs: - job: IntegrationTests variables: - group: <some_variable_group> # 确保环境已安装PDM(若未预装) - script: | python -m pip install --upgrade pip pip install pdm displayName: 'Install PDM' # 用PythonScript任务执行集成测试 - task: PythonScript@0 inputs: scriptSource: 'inline' script: | import os import subprocess import sys # 从脚本参数中获取所有测试所需变量 db_user = sys.argv[1] db_password = sys.argv[2] db_host = sys.argv[3] db_database = sys.argv[4] variable_file = sys.argv[5] test_title = sys.argv[6] # 设置测试代码可读取的环境变量 os.environ['DB_USER'] = db_user os.environ['DB_PASSWORD'] = db_password os.environ['DB_HOST'] = db_host os.environ['DB_DATABASE'] = db_database # 执行PDM运行Pytest的命令,保留原测试参数 subprocess.run( [ 'pdm', 'run', 'pytest', '--variables', variable_file, '--test-run-title', test_title, '--napoleon-docstrings', '--doctest-modules', '--color=yes', '--junitxml=junit/test-results.xml', 'integration' ], check=True ) arguments: '$(SMDB_USER) $(SMDB_PASSWORD) $(SMDB_HOST) $(SMDB_DATABASE) $(VARIABLE_FILE) $(TEST_TITLE)' displayName: 'Run Integration Tests via PDM'
关键说明
- 机密变量安全传递:通过
PythonScript任务的arguments传入$(SMDB_PASSWORD),Azure会自动屏蔽参数中的机密值,避免日志泄露。 - 环境变量映射:在Python脚本内将参数转为环境变量,确保Pytest测试代码能正常读取数据库凭证。
- 测试逻辑兼容:完全保留原有的Pytest参数,保证测试逻辑和输出结果与之前一致。
简化版本(仅机密变量通过参数传递)
若非机密变量希望直接通过Azure变量替换,可使用以下写法:
jobs: - job: IntegrationTests variables: - group: <some_variable_group> - task: PythonScript@0 inputs: scriptSource: 'inline' script: | import os import subprocess import sys # 仅从参数获取机密密码 db_password = sys.argv[1] # 其他变量直接通过Azure变量替换获取 os.environ['DB_USER'] = '$(SMDB_USER)' os.environ['DB_PASSWORD'] = db_password os.environ['DB_HOST'] = '$(SMDB_HOST)' os.environ['DB_DATABASE'] = '$(SMDB_DATABASE)' subprocess.run( [ 'pdm', 'run', 'pytest', '--variables', '$(VARIABLE_FILE)', '--test-run-title', '$(TEST_TITLE)', '--napoleon-docstrings', '--doctest-modules', '--color=yes', '--junitxml=junit/test-results.xml', 'integration' ], check=True ) arguments: '$(SMDB_PASSWORD)' displayName: 'Run Integration Tests'
内容的提问来源于stack exchange,提问作者Ivajlo Iliev
相关产品推荐
相关产品推荐

