【问题标题】:Azure Pipelines: use local time for file modified timestamp instead of UTCAzure Pipelines:使用本地时间作为文件修改的时间戳,而不是 UTC
【发布时间】:2019-12-19 22:59:45
【问题描述】:

我有多阶段 Azure Pipeline 在托​​管代理上构建 .NET Core 3.1 Web API。

当站点部署到我们的本地 IIS 服务器并且我在文件资源管理器中查看它们时,构建程序集的“修改日期”时间戳落后 13 小时,就好像它显示的是 UTC 而不是本地时间.同一框中的其他文件显示当地时间。我想让我部署的文件也显示当地时间。

我该怎么做?

【问题讨论】:

  • 关于如何“显示当地时间”,您应该参考您使用的软件的用户手册(Windows资源管理器?)。当文件被修改时,Windows会根据UTC设置时间,微软有明确的文档,不能更改,docs.microsoft.com/en-us/windows/win32/sysinfo/file-times
  • 我在 IIS 服务器上更改的任何其他文件都会接收本地时间;为什么这些会有所不同?

标签: iis azure-devops azure-pipelines


【解决方案1】:

您可以尝试 Nick.McDermaid 提供的链接中的方法。

使用 Microsoft 托管代理运行 bash 脚本:

echo "checking date"
date
echo "setting date to Asia/Kolkata"
sudo timedatectl set-timezone "Asia/Kolkata"
date

结果:

2019-07-05T20:26:48.5992486Z checking date
2019-07-05T20:26:48.5992954Z Fri Jul  5 20:26:48 UTC 2019
2019-07-05T20:26:48.5993264Z setting date to Asia/Kolkata
2019-07-05T20:26:48.9107025Z Sat Jul  6 01:56:48 IST 2019

您可以在代理上操作本地时间。

【讨论】:

【解决方案2】:

聚会有点晚了,但这是我解决这个问题的方法。

我正在部署一个古老的 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

现在,如果您部署应用程序,您会发现目标文件夹中的文件确实具有正确的时间戳。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 2019-08-15
    • 2012-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多