如何在发布步骤中获取我的工件提取到的目录?

Posted

技术标签:

【中文标题】如何在发布步骤中获取我的工件提取到的目录?【英文标题】:How to get the directory my artifact is extracted to during a release step? 【发布时间】:2017-12-20 16:48:58 【问题描述】:

我正在使用 VSTS 来部署 asp.net Web 应用程序。我们正在改变部署转换后的 web.config 文件的方式,因为我们在最近的生产帖子中被烧毁,因为在“IIS Web App 部署期间文件未正确转换。我们的新计划是使用 CodeAssassin.ConfigTransform”nuget任务,并且我们所有的配置转换都作为构建的一部分进行转换。这些可以由我们的开发人员在本地进行验证/检查,并合并到构建工件中。

所以对于我的问题, 基本上在我的构建工件中,在我的 web 项目的根目录下,我们会找到转换后的 web.config 文件,例如web.dev.config.transformed、web.qa.config.transformed、web.dev.config.transformed等

作为我发布过程中的一个新步骤,对于每个环境,我想在“IIS Web App Deploy”任务将更改推送到网络服务器之前,在我的工件中复制正确的文件。在所有变量替换之后的一个非常基本的级别上,复制命令看起来像这样。

copy-item ?????web.dev.config.transformed -Destination ?????web.config

我需要更换?????与我的工件已被提取的路径,例如

C:\vstsagent\A1\_work\r1\a\temp_web_package_7996773376015784\Content\C_C\VSTS_agent\_work\6\s\My.Web.Project\obj\Release\Package\PackageTmp\

我查看了每个构建/发布变量(感谢 Gian Maria Dump all environment variables during a TFS / VSTS Build),但我没有看到类似可以从变量访问的路径。

我显然在这里遗漏了一些简单的东西......因为其他任务有这些信息可供他们使用?

任何帮助表示赞赏!

【问题讨论】:

由于深入研究 web 部署包 zip 的复杂性,我最终放弃了这项工作。现在我正在使用在 VSTS 项目的变量中指定的 Web 部署参数。 【参考方案1】:

首先,temp_web_package_XXX.zip 文件由 IIS Web App Deploy 任务 生成,如果启用 File Transforms & Variable Substitution(解压你的包> 进行转换 > 将文件存档到临时包 (temp_web_package_xxx.zip)),因此您不需要处理临时包文件。

其次,您只需要处理您的包文件(例如,提取包文件> 将文件复制到文件夹)和路径喜欢$(System.DefaultWorkingDirectory)/[build definition name]/[Artifact name (Specified in Publish Build Artifacts task)]/*.zip

您可以通过在 Visual Studio BuildMSBuild 任务中指定 /P:PackageTempRootDir="" MSBuild 参数从包中删除源路径结构。对于 dotnet core 项目,使用 .NET Core(命令:发布;检查 Zip 已发布项目选项)任务。

之后,文件夹结构喜欢[WebApp]\Content\D_C\PackageTmp

【讨论】:

【参考方案2】:

您要查找的变量是$(System.DefaultWorkingDirectory)

这将为您提供路径的第一部分。之后,您可以像这样附加自己的文件夹和文件:

$(System.DefaultWorkingDirectory)\My.Web.Project\obj\Release\Package\PackageTmp\

您也可以在您的构建定义中使用Copy File task (v2),然后检查Flatten Files。这将从工件的路径中删除您不需要的目录。这将使您更轻松地使用您的版本中的工件

【讨论】:

但是这个值从哪里来(在我上面的例子中)? temp_web_package_7996773376015784 @Wouter de Kort 如果我将 $(System.DefaultWorkingDirectory) 用于自定义任务的打字稿文件中,它是否工作? IE。 let buildsPath = $(System.DefaultWorkingDirectory) @xtreampb 在构建 NodeJS 任务(使用 javascript 或 TypeScript)时,您可以使用 process.env["INPUT_SAMPLESTRING"] 作为环境变量访问属性。请参阅github.com/Microsoft/vsts-task-lib/blob/master/node/docs/… 了解更多信息。

以上是关于如何在发布步骤中获取我的工件提取到的目录?的主要内容,如果未能解决你的问题,请参考以下文章

如何删除 maven 获取的缓存本地工件?

如何在 .gitlab-ci.yml 中指定通配符工件子目录?

从 gitlab-ci dir 中获取所有工件并使其成为工件

从第二个关系中拉出文物

如何在Nexus 2.x中提供对工件的最新快照的URL访问?

如何从VSTS CI管道为解决方案中的每个项目单独发布工件?