【问题标题】:How to copy files from artifact directory to azure app service?如何将文件从工件目录复制到 azure app 服务?
【发布时间】:2020-06-11 06:14:57
【问题描述】:

一点背景:

我已经为 .NET 创建了 azure CI/CD 管道,在 CI 步骤中,有一个步骤可以吞下 css/js。不知何故,我注意到在我生成的工件中,吞噬的 css/js 没有出现。所以,根据帖子中的最后一个答案(Gulp-compiled CSS folder missing from the Azure DevOps pipeline Build Artifact ) 我设法找到生成的 css/js 的路径并将其复制到 $(Build.ArtifactStagingDirectory) (通过在 gulp 之后和发布工件任务之前添加复制文件任务)。如下图所示,您可以看到标记为蓝色框的文件夹现在已复制到$(Build.ArtifactStagingDirectory)

现在提出问题:

我认为在发布管道中,用于将其部署到 azure 应用程序的工件是“SampleWebApplication.zip”。现在,我不确定如何将我的 css/js 文件夹复制到 azure 应用程序,因为当我看到 azure 应用程序的站点文件夹时,资产文件夹中仍然不存在这些 css 和 js 文件夹。

EDIT-1

下面附上管道任务的截图:

还附加了“构建解决方案”和“发布工件”任务的 YAML

构建解决方案 YAML:-

#Your build pipeline references an undefined variable named ‘Parameters.solution’. Create or edit the build pipeline for this YAML file, define the variable on the Variables tab. See https://go.microsoft.com/fwlink/?linkid=865972
#Your build pipeline references the ‘BuildPlatform’ variable, which you’ve selected to be settable at queue time. Create or edit the build pipeline for this YAML file, define the variable on the Variables tab, and then select the option to make it settable at queue time. See https://go.microsoft.com/fwlink/?linkid=865971
#Your build pipeline references the ‘BuildConfiguration’ variable, which you’ve selected to be settable at queue time. Create or edit the build pipeline for this YAML file, define the variable on the Variables tab, and then select the option to make it settable at queue time. See https://go.microsoft.com/fwlink/?linkid=865971

steps:
- task: VSBuild@1
  displayName: 'Build solution'
  inputs:
    solution: '$(Parameters.solution)'
    msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\"'
    platform: '$(BuildPlatform)'
    configuration: '$(BuildConfiguration)'

发布工件 YAML

#Your build pipeline references an undefined variable named ‘Parameters.ArtifactName’. Create or edit the build pipeline for this YAML file, define the variable on the Variables tab. See https://go.microsoft.com/fwlink/?linkid=865972

steps:
- task: PublishBuildArtifacts@1
  displayName: 'Publish Artifact'
  inputs:
    PathtoPublish: '$(build.artifactstagingdirectory)'
    ArtifactName: '$(Parameters.ArtifactName)'

【问题讨论】:

  • 我认为您需要检查 SampleWebApplication.zip 是否包含带有更新文件的 assets 文件夹。
  • 不,它不包含。但是要检查 gulp 是否真的在创建文件,然后我将发布工件任务的“发布到路径”位置从 $(Build.ArtifactStagingDirectory) 更改为 $(build.SourcesDirectory) 然后我可以看到 gulp 编译的 CSS 和 JS 存在于assets 文件夹,但我不确定它为什么不在 .zip 中。

标签: azure continuous-integration azure-pipelines-release-pipeline


【解决方案1】:

您应该认识到发布的工件 drop 和生成的文件 SampleWebApplication.zip 之间的区别。

不确定您使用哪个任务来部署到 Azure 应用服务,但据我所知,相关的部署任务总是将 xx.zip 部署到 Web 应用程序。也就是说deploy任务只取SampleWebApplication.zip,并不关心发布的工件。

所以您应该确保SampleWebApplication.zip 包含css/js 文件夹。部署任务只部署xx.zip,它不会关心工件是否包含css/js 文件夹。您应该关注如何在生成 xx.zip 时包含 css/js 文件夹,而不是使用复制任务将这些文件夹复制到 drop 工件...

如果您正在配置 asp.net 核心项目,请查看this document 以获取更多有用信息。我认为您应该在 dotnet publish 步骤之前或期间包含 css/js 文件夹,但不要在那之后。

【讨论】:

  • 我同意在将 css/js 添加到 .zip 之前,仅将 css/js 复制到工件文件夹中是行不通的。我将它们复制到工件中,因为以确保实际创建更新的 gulp 编译文件。但我仍然不确定如何将这些 css 和 js 文件夹添加到 .zip
  • @PrashantTomar 您如何在构建管道中创建 xx.zip?在您的问题中分享有关经典 Ui/yaml 的详细信息。我们需要知道创建 xx.zip 的任务。 (也许 dotnet 发布?)
  • 我已在问题的 EDIT-1 部分中添加了构建管道的屏幕截图和 YAML,用于构建解决方案和发布工件任务。
  • 我认为您的 zip 来自 VS 构建步骤中的 /p:DeployOnBuild=true /p:WebPublishMethod=Package。这意味着,您首先创建了 xx.zip,然后在该步骤之后使用其他步骤创建 css/js 文件......顺序很重要。
  • 我在“构建解决方案”之前尝试了“npm install”和“gulp”任务,但仍然没有成功。
【解决方案2】:

我设法找到了两种解决方法。该问题似乎特定于“构建解决方案”任务。当构建转到$(Build.ArtifactStagingDirectory) 时,它不包括 gulp 生成的 CSS 和 JS 文件。但是作为per this post on stack overflow,我将构建输出目录从/p:PackageLocation="$(Build.ArtifactStagingDirectory)更改为/p:PackageLocation="$(Build.BinariesDirectory),然后测试了

第一个解决方法

将“Publish artifact”任务的“Path to Publish”从 $(Build.ArtifactStagingDirectory) 更改为 $(Build.BinariesDirectory),它还包括被吞并的 CSS 和 JS 文件。 p>

第二种解决方法

  1. 我将“构建解决方案”任务的“发布路径”的参数从/p:PackageLocation="$(Build.ArtifactStagingDirectory) 更改为/p:PackageLocation="$(Build.BinariesDirectory),如第一次解决方案中所述

  2. 创建一个任务“Archive $(Build.BinariesDirectory)”文件任务以将文件从$(build.binariesdirectory) 压缩到$(Build.ArtifactStagingDirectory),如下面的截图所示:

    李>

  1. 创建“Extract File”任务以解压缩$(Build.ArtifactStagingDirectory)/GeneratedArtifacts.zip 中存在的 .zip 文件,它将提取所有压缩的工件,例如“Publish”所需的 .cmd 和 .zip 文件任务”,存在于$(Build.ArtifactStagingDirectory)GeneratedArtifacts.zip 中。就是这样!!

GeneratedArtifacts.zip 包含如下截图所示的最终文件,供您参考:

最后,对于第一个解决方法 - publish artifacts 任务将发布 $(Build.BinariesDirectory) 中存在的所有文件,对于第二个解决方法 - publish artifacts 任务将发布 $(Build.ArtifactStagingDirectory)

中存在的所有文件

更准确地说,下面是第一个解决方法的 Publish Artifact 任务的屏幕截图:

下面是第二个解决方法的 Publish Artifact 任务的屏幕截图:

第一个解决方法似乎很干净,并且包含较少的构建管道步骤,所以我遵循了它,但也考虑编写第二个解决方法,因为它可能是如果第一个解决方法对某人不起作用,也许第二个起作用。

【讨论】:

  • 太棒了!感谢您在这里分享您的解决方案,您可以 Accept it as an Answer ,这样它可以帮助遇到相同问题的其他社区成员,我们可以存档这个帖子,谢谢。
【解决方案3】:

我可以看到您正在将 Azure DevOps 用于您的 CI。另一种解决方案是从 Web 根目录压缩文件,包括目录结构,并将它们作为“安全文件”添加到 DevOps(配置 Azure KeyVault 后在库/安全文件下找到此文件)。

然后添加一个管道任务以将安全文件(使用“下载安全文件”任务)下载到您的构建服务器。确保向此任务添加“参考名称”,以便在后续步骤中参考下载的文件路径。

然后添加一个独立的“Azure App Service Deploy”步骤来部署这个 zip 文件。选择“Zip deploy”的部署方法,并在“Package or folder”部分引用您下载的安全文件,如$(secureFileReferenceName.secureFilePath)

这有效地将 zip 文件从安全存储下载到构建代理,并将其解压缩到应用服务中的 wwwroot。

希望有更简单的方法!

【讨论】:

    猜你喜欢
    • 2016-06-30
    • 1970-01-01
    • 2017-03-06
    • 1970-01-01
    • 2021-12-06
    • 2018-06-04
    • 2022-11-28
    • 1970-01-01
    • 2022-01-17
    相关资源
    最近更新 更多