如何在Azure DevOps流水线构建Python项目时注入环境专属常量
如何在Azure DevOps构建阶段注入Python环境专属常量
当然可以实现!我来给你分享几种实用方案,完美适配你这种生成whl包、无法在部署后通过环境变量配置的场景:
方案1:模板文件替换法(最直观易维护)
这个方法的核心是先在代码里放一个带占位符的模板配置,然后在构建阶段用流水线变量替换占位符,生成最终的配置文件打包进whl。
代码端准备
- 在你的项目目录下创建一个模板配置文件,比如
config_template.py:
# config_template.py API_URL = "{{API_URL}}" SECRET_KEY = "{{SECRET_KEY}}" ENDPOINT = "{{ENDPOINT}}"
- 项目里的其他模块直接导入最终生成的
config.py来使用这些常量就行。
Azure DevOps流水线配置
- 创建环境专属变量组:分别为NPRD和PROD创建变量组(比如
NPRD_Config_Vars、PROD_Config_Vars),把对应环境的URL、端点填进去,敏感值(比如SECRET_KEY)记得勾选「Keep this value secret」,避免泄露。 - 添加替换脚本步骤:根据你使用的代理类型(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 - 关联变量组到对应流水线:把NPRD变量组绑定到NPRD构建流水线,PROD变量组绑定到PROD流水线,这样不同流水线构建时会自动加载对应环境的配置。
- 确保配置文件被打包:检查你的
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一样,为两个环境分别创建变量组,保密变量标记为敏感。
- 注入环境变量:在执行打包命令前,把流水线变量转为系统环境变量:
- 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)" - 执行打包命令:运行
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流水线配置
- 创建变量组:同上。
- 生成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
相关产品推荐
相关产品推荐

