Azure DevOps中同Slot部署DotNet6项目与WebJobs的问题
同一Azure App Service部署槽同时部署主项目与WebJobs的解决方案
方案一:CI阶段合并主项目与WebJobs产物后统一部署
核心思路是分别构建主项目和WebJobs,将WebJobs的输出文件放到主项目解压包的App_Data/jobs/triggered/[WebJob名称]目录下,重新打包后一次性部署,彻底避免两次部署的覆盖问题。
具体YAML任务步骤
- 构建主项目并生成部署包
- task: VSBuild@1 inputs: solution: '**/YourMainProject.sln' msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(Build.ArtifactStagingDirectory)/MainApp.zip"' platform: '$(BuildPlatform)' configuration: '$(BuildConfiguration)'
- 解压主项目部署包到临时目录
- task: ExtractFiles@1 inputs: archiveFilePatterns: '$(Build.ArtifactStagingDirectory)/MainApp.zip' destinationFolder: '$(Build.ArtifactStagingDirectory)/MainAppUnzipped' cleanDestinationFolder: true
- 构建WebJobs项目并输出到文件系统
- task: VSBuild@1 inputs: solution: '**/YourWebJobProject.sln' msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=FileSystem /p:publishUrl="$(Build.ArtifactStagingDirectory)/WebJobOutput" /p:SkipInvalidConfigurations=true' platform: '$(BuildPlatform)' configuration: '$(BuildConfiguration)'
- 将WebJobs文件复制到主项目的WebJobs指定目录
- task: CopyFiles@2 inputs: sourceFolder: '$(Build.ArtifactStagingDirectory)/WebJobOutput' contents: '**' targetFolder: '$(Build.ArtifactStagingDirectory)/MainAppUnzipped/App_Data/jobs/triggered/YourWebJobName' cleanTargetFolder: true
注意:
YourWebJobName替换为你的WebJob实际名称;触发型WebJobs用triggered目录,持续运行型用continuous,目录结构必须严格遵循Azure规范。
- 重新打包合并后的项目文件
- task: ArchiveFiles@2 inputs: rootFolderOrFile: '$(Build.ArtifactStagingDirectory)/MainAppUnzipped' includeRootFolder: false archiveType: 'zip' archiveFile: '$(Build.ArtifactStagingDirectory)/CombinedApp.zip' replaceExistingArchive: true
- 部署合并后的包到目标部署槽
- task: AzureRmWebAppDeployment@4 inputs: ConnectionType: 'AzureRM' azureSubscription: '$(YourAzureSubscription)' appType: 'webApp' WebAppName: '$(YourWebAppName)' deployToSlotOrASE: true ResourceGroupName: '$(YourResourceGroupName)' SlotName: '$(YourSlotName)' packageForLinux: '$(Build.ArtifactStagingDirectory)/CombinedApp.zip'
方案二:通过主项目.csproj配置自动包含WebJobs
如果不想在CI阶段做额外的文件复制和打包操作,可以直接在主项目的.csproj文件中添加配置,让MSBuild在构建主项目时自动将WebJobs的输出文件打包到指定路径。
主项目.csproj配置示例
在主项目的.csproj文件中添加以下ItemGroup配置:
<ItemGroup> <!-- 引用WebJobs项目的输出文件,替换为你的WebJobs项目相对路径 --> <None Include="..\YourWebJobProject\bin\$(Configuration)\net6.0\**"> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory> <!-- 指定发布后的相对路径,确保WebJobs能被Azure识别 --> <DestinationRelativePath>App_Data/jobs/triggered/YourWebJobName/%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath> </None> </ItemGroup>
添加配置后,直接用原有的VSBuild@1任务构建主项目,生成的部署包会自动包含WebJobs文件,无需额外CI任务,直接部署即可。
关键注意事项
- WebJobs的目录结构必须严格符合Azure要求:触发型WebJobs放在
App_Data/jobs/triggered/[JobName],持续运行型放在App_Data/jobs/continuous/[JobName],目录名称即为WebJob在Azure中的显示名称。 - 重新打包时确保
includeRootFolder设为false,避免包内多一层根目录导致路径错误。 - 如果WebJobs依赖第三方库,需确保构建时将所有依赖文件一并输出并复制到目标目录。
内容的提问来源于stack exchange,提问作者Hamid
相关产品推荐
相关产品推荐

