VSTS在线门户:在发布时取消嵌套构建文件夹

时间:2017-08-28 17:20:25

标签: azure-devops azure-pipelines azure-pipelines-build-task azure-pipelines-release-pipeline

我正在尝试为一个相当大的解决方案设置自动构建+部署。单个解决方案在“$(Build.ArtifactStagingDirectory)”位置生成2个zip文件夹,这些文件夹包含所有正确的文件。出于测试/故障排除的目的,我只查看其中一个zip文件,但最终这两个站点都必须以这种方式部署。

但是,要获取实际文件,您必须通过 14 不必要的子文件夹。更复杂的是,基于构建配置的某些元素(其中一些是由于git repo中的文件夹结构),其中大约8个是可变的。

我不想要任何这些子文件夹。另一个问题是我实际上并不想要100%的平面文件;我需要2个子文件夹的文件夹包含在最终解压缩的目录中。 (最终目录是IIS站点的物理路径。)有没有办法做到这一点?

我试过了:

  • 将生成的zip文件解压缩到临时目录,然后重新打包,全部在构建机器上。

    • 要使其工作,我必须手动指定14个子目录。另外,我无法使用“发布工件”将生成的zip文件上传到VSTS,所以我不知道如何将它放到服务器盒上。
  • 从VSTS下载已发布的zip文件,在发布计算机上本地解压缩,然后将内容复制到正确的目录。

    • 仅当我手动指定目录中包含的14个文件夹时才有效。我试图用通配符隐藏14个文件夹,但只是成功复制过多的嵌套结构 - 我猜测“源文件夹”参数不支持通配符(我必须在“内容”部分实际执行此操作或任务失败了。)
  • 使用复制对话框中的“拼合文件夹”高级选项。

    • 这将删除所有文件夹结构,这不是我想要的。我需要在最终目录中包含2个包含子文件夹的文件夹。

如果不能仅仅部分压扁构建步骤生成的zip,我会很感激帮助找出我可以使用变量提取多少这种非常复杂的路径。

2 个答案:

答案 0 :(得分:2)

有一种非常简单的方法,可以将PackageTmp文件夹中的仅内容和子目录的内容移动到构建工件文件夹,而无需在其上面放置不必要的文件夹结构,而无需使用“扁平文件夹”选项(因为您可能希望将文件夹结构保持在PackageTmp下):

首先,在“构建解决方案”任务中,设置类似于以下内容的“ MS构建参数”:

/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=false /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.binariesdirectory)"

请注意,/p:PackageAsSingleFile=false设置为false;您现在还不想将其压缩。另请注意设置/p:PackageLocation="$(build.binariesdirectory)。您不希望将输出直接转到默认情况下配置的工件过渡目录。

接下来,添加一个Powershell任务,并添加以下内联脚本:

$folder = Get-ChildItem -Directory -Path '.\*' -Include 'PackageTmp' -Recurse
Write-Host "##vso[task.setvariable variable=PathToPackageTmpFolder]$($folder.FullName)"

这会将到PackageTmp文件夹的标准路径存储在名为PathToPackageTmpFolder的变量中。在高级选项下,将工作目录设置为$(build.binariesdirectory)

现在添加“复制文件”任务,以仅将PackageTmp及其子文件夹的内容移动到工件登台目录。将源文件夹设置为$(PathToPackageTmpFolder),将内容设置为**,将目标文件夹设置为$(build.artifactstagingdirectory)。一切就绪!

答案 1 :(得分:1)

这是MSBuild部署/发布到包操作,部署到服务器后将不会保留文件夹结构。

您可以指定/p:PackageTempRootDir="" msbuild参数来忽略项目路径的文件夹结构。

另一种方法是,您可以通过FileSystem方法发布项目,然后通过存档文件任务存档文件。