聚会有点晚了,但这是我解决这个问题的方法。
我正在部署一个古老的 Asp.net 应用程序,该应用程序使用 WebResource.axd 并且 dll 文件中的错误时间戳导致无法找到某些嵌入式资源(404 错误)。当网络服务器时间赶上 dll 上次修改时间时,一切正常。
由于我在 Azure 托管代理(非私有)上构建,首先我在 构建作业 中运行 PowerShell 脚本来设置构建代理时区:
- task: PowerShell@2
displayName: 'Set agent timezone'
inputs:
targetType: 'inline'
script: |
Set-TimeZone -Id "E. South America Standard Time" -PassThru
现在由构建生成的构建工件是一个 zip 文件,其中包含具有正确时间戳的 dll 文件(在我的情况下为 UTC -3)。这可以通过从 DevOps 下载构建工件来验证。但是,在目标 Web 服务器上,部署的 dll 仍然具有不正确的 UTC 时间戳。
这是由 IISWebAppDeploymentOnMachineGroup 任务将选项 XmlVariableSubstitution 设置为 true 引起的。如果您查看 Web 服务器中的构建代理文件夹,就会发现问题。
c:\azagent\A1_work\1\drop 的 zip 文件确实具有正确的 UTC -3 时间戳,但由于变量替换选项,它将在 c:\azagent\A1_work 创建另一个临时 zip 文件\s 和这个有 UTC 时间戳的文件,这些是最终在您的目标文件夹中的文件。
要解决此问题,只需禁用 IISWebAppDeploymentOnMachineGroup 任务的 XmlVariableSubstitution 选项并添加 FileTransform 任务,例如:
- task: IISWebAppDeploymentOnMachineGroup@0
displayName: 'IIS Web App Deploy'
inputs:
WebSiteName: 'ParentSite'
VirtualApplication: '/virtualpath'
Package: '$(Pipeline.Workspace)\drop\myproject.zip'
RemoveAdditionalFilesFlag: true
TakeAppOfflineFlag: true
XmlVariableSubstitution: false
- task: FileTransform@1
displayName: 'Replace variables'
inputs:
folderPath: 'c:\sites\mysite\wwwroot'
fileType: xml
targetFiles: |
*.config
现在,如果您部署应用程序,您会发现目标文件夹中的文件确实具有正确的时间戳。