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

如何在Azure DevOps流水线构建Python项目时注入环境专属常量

如何在Azure DevOps构建阶段注入Python环境专属常量

当然可以实现!我来给你分享几种实用方案,完美适配你这种生成whl包、无法在部署后通过环境变量配置的场景:

方案1:模板文件替换法(最直观易维护)

这个方法的核心是先在代码里放一个带占位符的模板配置,然后在构建阶段用流水线变量替换占位符,生成最终的配置文件打包进whl。

代码端准备

  1. 在你的项目目录下创建一个模板配置文件,比如config_template.py:
# config_template.py
API_URL = "{{API_URL}}"
SECRET_KEY = "{{SECRET_KEY}}"
ENDPOINT = "{{ENDPOINT}}"
  1. 项目里的其他模块直接导入最终生成的config.py来使用这些常量就行。

Azure DevOps流水线配置

  1. 创建环境专属变量组:分别为NPRD和PROD创建变量组(比如NPRD_Config_Vars、PROD_Config_Vars),把对应环境的URL、端点填进去,敏感值(比如SECRET_KEY)记得勾选「Keep this value secret」,避免泄露。
  2. 添加替换脚本步骤:根据你使用的代理类型(Windows/Linux)选择对应的脚本:
    • Windows代理用PowerShell:
    # 替换占位符并生成最终config.py
    (Get-Content ./your_project_name/config_template.py) `
        -replace '{{API_URL}}', '$(API_URL)' `
        -replace '{{SECRET_KEY}}', '$(SECRET_KEY)' `
        -replace '{{ENDPOINT}}', '$(ENDPOINT)' | 
    Set-Content ./your_project_name/config.py
    
    • Linux/macOS代理用Bash:
    # 替换占位符
    sed -i 's/{{API_URL}}/'"$(API_URL)"'/g' ./your_project_name/config_template.py
    sed -i 's/{{SECRET_KEY}}/'"$(SECRET_KEY)"'/g' ./your_project_name/config_template.py
    sed -i 's/{{ENDPOINT}}/'"$(ENDPOINT)"'/g' ./your_project_name/config_template.py
    # 重命名为最终配置文件
    mv ./your_project_name/config_template.py ./your_project_name/config.py
    
  3. 关联变量组到对应流水线:把NPRD变量组绑定到NPRD构建流水线,PROD变量组绑定到PROD流水线,这样不同流水线构建时会自动加载对应环境的配置。
  4. 确保配置文件被打包:检查你的setup.py或pyproject.toml,确认config.py会被包含在whl包中(只要文件在项目目录下,默认都会被打包,除非你加了排除规则)。

方案2:通过setup.py动态注入常量

这个方法利用setuptools的打包流程,在执行打包命令时动态读取流水线环境变量,生成配置文件。

代码端修改setup.py

修改项目根目录的setup.py,添加一个生成配置的函数,在打包前自动生成配置文件:

from setuptools import setup
import os

def generate_env_config():
    # 读取流水线注入的环境变量,生成配置内容
    config_content = f'''
API_URL = "{os.getenv('API_URL')}"
SECRET_KEY = "{os.getenv('SECRET_KEY')}"
ENDPOINT = "{os.getenv('ENDPOINT')}"
'''
    # 写入到项目目录的config.py
    with open('./your_project_name/config.py', 'w') as f:
        f.write(config_content.strip())

# 打包前先生成配置文件
generate_env_config()

setup(
    name="your_package_name",
    version="0.1.0",
    packages=["your_project_name"],
    # 其他项目配置...
)

Azure DevOps流水线配置

  1. 同样创建变量组:和方案1一样,为两个环境分别创建变量组,保密变量标记为敏感。
  2. 注入环境变量:在执行打包命令前,把流水线变量转为系统环境变量:
    • Bash步骤:
    export API_URL=$(API_URL)
    export SECRET_KEY=$(SECRET_KEY)
    export ENDPOINT=$(ENDPOINT)
    
    • PowerShell步骤:
    $env:API_URL = "$(API_URL)"
    $env:SECRET_KEY = "$(SECRET_KEY)"
    $env:ENDPOINT = "$(ENDPOINT)"
    
  3. 执行打包命令:运行python setup.py bdist_wheel,此时setup.py会自动生成包含环境专属常量的config.py,并打包进whl。

方案3:生成JSON/YAML配置文件(灵活适配多格式)

如果偏好非Python格式的配置文件,也可以生成JSON或YAML,然后在项目里加载使用。

代码端准备

创建一个配置加载模块,比如config_loader.py:

import json
import os

def load_config():
    config_path = os.path.join(os.path.dirname(__file__), 'config.json')
    with open(config_path, 'r') as f:
        return json.load(f)

# 加载配置并导出常量
config = load_config()
API_URL = config['API_URL']
SECRET_KEY = config['SECRET_KEY']
ENDPOINT = config['ENDPOINT']

Azure DevOps流水线配置

  1. 创建变量组:同上。
  2. 生成JSON配置文件:用Bash脚本快速生成:
cat > ./your_project_name/config.json << EOF
{
    "API_URL": "$(API_URL)",
    "SECRET_KEY": "$(SECRET_KEY)",
    "ENDPOINT": "$(ENDPOINT)"
}
EOF

然后执行打包命令,确保config.json被包含在whl中。

关键注意事项

  • 保密变量安全:Azure DevOps的保密变量会自动在日志中被屏蔽,不用担心敏感值泄露,放心用来替换SECRET_KEY这类内容。
  • 环境隔离要严格:一定要确保NPRD和PROD流水线分别绑定对应的变量组,绝对不能混配环境配置。
  • 打包后验证:构建完成后可以下载whl包解压,检查配置文件里的常量是否正确注入,避免出现占位符未替换的情况。
  • 忽略生成的配置文件:把config.py或config.json添加到.gitignore,别把环境专属配置提交到代码仓库里。

内容的提问来源于stack exchange,提问作者FreeGor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 15:57:33