如何在发布步骤中获取我的工件提取到的目录?
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 Build 或 MSBuild 任务中指定 /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/… 了解更多信息。以上是关于如何在发布步骤中获取我的工件提取到的目录?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 .gitlab-ci.yml 中指定通配符工件子目录?
从 gitlab-ci dir 中获取所有工件并使其成为工件