Azure Dev Ops Release调用Entity Framework Migrations脚本找不到文件问题
问题原因
- Azure DevOps的生成阶段和发布阶段默认运行在相互独立的代理工作环境中,生成阶段写入本地代理目录的临时文件不会自动流转到发布阶段的运行环境,因此发布阶段访问相同硬编码路径时找不到对应文件。
- 生成阶段未将生成的迁移脚本上传为管道构件,临时生成的文件会在生成作业结束后被清理,后续阶段无法读取。
- 硬编码绝对路径存在兼容性问题:不同代理节点的工作目录盘符、路径序号可能存在差异,固定写死的
D:\a\1\路径在更换代理后会直接失效。
解决方法
- 第一步:调整生成阶段的文件留存配置
在Generate Migration Scripts步骤后新增发布构建构件任务:- 待发布路径选择迁移脚本的输出目录,建议优先使用Azure DevOps预定义变量替代硬编码路径,比如将迁移脚本生成到
$(Build.ArtifactStagingDirectory)/migrations,直接填写该路径作为待发布目录 - 设置构件名称为
db-migration-scripts,发布位置选择「Azure Pipelines」
- 待发布路径选择迁移脚本的输出目录,建议优先使用Azure DevOps预定义变量替代硬编码路径,比如将迁移脚本生成到
- 第二步:调整发布阶段的文件引用逻辑
在发布阶段执行数据库部署步骤之前,新增下载构建构件任务:- 选择对应生成管道的
db-migration-scripts构件,下载路径填写$(System.DefaultWorkingDirectory) - 后续部署步骤引用sql文件时,使用
$(System.DefaultWorkingDirectory)/db-migration-scripts/CarehomeBookingContext.sql即可,不要使用硬编码的绝对路径
- 选择对应生成管道的
- 可选排查方案:如果调整后仍报错,可以在发布阶段的部署步骤前新增一个命令行任务,Windows代理执行
dir /s $(System.DefaultWorkingDirectory),Linux/macOS代理执行ls -R $(System.DefaultWorkingDirectory),输出当前工作目录的完整文件结构,确认文件路径和文件名是否符合预期。
内容的提问来源于stack exchange,提问作者Matthew Watts
相关产品推荐
相关产品推荐

