You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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'

关键说明

  1. 机密变量安全传递:通过PythonScript任务的arguments传入$(SMDB_PASSWORD),Azure会自动屏蔽参数中的机密值,避免日志泄露。
  2. 环境变量映射:在Python脚本内将参数转为环境变量,确保Pytest测试代码能正常读取数据库凭证。
  3. 测试逻辑兼容:完全保留原有的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:05:53