【问题标题】:msbuild behaving differently from command line vs Jenkinsmsbuild 的行为与命令行与 Jenkins 不同
【发布时间】:2017-01-10 11:32:11
【问题描述】:

我有一份创建和部署网站包的 Jenkins 工作。

当我从 Jenkins 运行作业时,它会为每个项目创建一个包,并且部署包不包含 webjobs。但是,命令行中的相同 msbuild 命令确实会创建一个更大的包文件,其中包括其中的 webjobs。

我尝试使用相同的用户帐户 Jenkins 服务运行 msbuild 命令行,并且效果也很好。

如果我比较两个 msbuild 输出日志,我会发现一些差异是命令行 msbuild 日志包括的主要差异:

Target "DiscoverWebJobs" in file "E:\Jenkins\jobs\Queue - Publish\workspace\tvdQueue\packages\Microsoft.Web.WebJobs.Publish.1.0.12\tools\webjobs.wap.targets" from project "E:\Jenkins\jobs\Queue - Publish\workspace\tvdQueue\WebAPI\WebAPI.csproj" (target "Build" depends on it):
    Task "Message"
      WebJobs: reading [E:\Jenkins\jobs\Publish job\workspace\Project\WebAPI\Properties\webjobs-list.json]
    Done executing task "Message".
    Using "ReadWebJobsConfigFile" task from assembly "E:\Jenkins\jobs\Publish job\workspace\Project\packages\Microsoft.Web.WebJobs.Publish.1.0.12\tools\Microsoft.Web.WebJobs.Publish.Tasks.dll".
    Task "ReadWebJobsConfigFile"
    Done executing task "ReadWebJobsConfigFile".
    Task "Message"
      WebJobs: WebJobs found: [../blah1.csproj;../blah2.csproj;../blah3.csproj;]
    Done executing task "Message".
    Done building target "DiscoverWebJobs" in project "WebAPI.csproj"

我尝试在 Jenkins 命令行中添加目标“DiscoverWebJobs”,但它说找不到...我花了很多时间尝试不同的选项,从不同的帐户运行,使用 powershell,...但是没什么,我敢肯定这很傻。

如果 zip 包文件不包含 webjobs 文件,当我进行部署时,它不会更新 webjobs。我可以单独部署每个 zip 文件,但是有一些 webjobs,如果有人包含一个新的,它将不会被部署,这使得该项目的持续集成设置毫无用处。

【问题讨论】:

  • 如果您从 jenkins 以详细的详细信息运行(将 /v:d 传递给 msbuild 命令),日志可能会解释为什么跳过该目标。查找包含“WebJobs”的行,例如目标 DiscoverWebJobs 被跳过,因为 ...
  • 我比较了来自 Jenkins 和命令行的 msbuild 日志,但没有跳过目标,只有仅从命令行运行但从 Jenkins 作业完成 msbuild 时它们不运行的目标。

标签: jenkins msbuild azure-webjobs msbuild-4.0 webjob


【解决方案1】:

检查Microsoft WebJobs Publish 1.0.12 nuget 包中的webjobs.wap.targetswebjobs.targets,以下msbuild 参数会影响DiscoverWebJobs 目标是否运行。您可以使用带有 msbuild 的 /p: 开关设置/覆盖它们的值。

  • SkipApp_DataFolder(必须是False
  • WebJobsExtendWebPublish(必须是true
  • WebJobsConfigFile(该路径下需要存在文件)

如果存在以下文件,则不需要设置/覆盖最后一个:E:\Jenkins\jobs\Queue - Publish\workspace\tvdQueue\WebAPI\Properties\webjobs-list.json

【讨论】:

  • 我上面指定的路径下的webjobs-list.json文件内容是什么?
  • { "$schema": "schemastore.org/schemas/json/webjobs-list.json", "WebJobs": [ { "filePath": "../blah1/blah1.csproj" }, { "filePath": ".. /blah2/blah2.csproj" }, { "filePath": "../blah3/blah3.csproj" } ] }
  • 但别担心@weir,我终于修好了(见我接受的答案)。您的第一条评论让我思考,所以我给了您一个有用的答案投票,谢谢!我不知道为什么这些目标会被添加两次...可能是 nuget 包问题...
  • 干得好!旧的Import 可能是由于 1.0.11 包的uninstall.ps1 中发生一些运行时错误而保留的。
【解决方案2】:

终于成功了!我的解决方法是删除解决方案中所有 csproj 文件中重复的“Microsoft.Web.WebJobs.Publish”目标导入。

<Import Project="..\packages\Microsoft.Web.WebJobs.Publish.1.0.12\tools\webjobs.targets" Condition="Exists('..\packages\Microsoft.Web.WebJobs.Publish.1.0.12\tools\webjobs.targets')" />

我有版本 1.0.11 和 1.0.12,所以我删除了旧版本,它创建了包括 webjobs 在内的完整包。

不知道为什么从 Jenkins 或从同一台机器上的命令行运行 msbuild 会对那些重复的目标产生任何不同的影响,但是......

【讨论】:

  • 不同之处可能是在一种情况下,文件夹..\packages\Microsoft.Web.WebJobs.Publish.1.0.11\tools\webjobs.targets 仍然存在;在其他上下文中,由于其 Condition 属性,忽略了过时的导入。关于如何导致输出差异的最佳猜测是对Microsoft.Web.WebJobs.Publish.Tasks.dll 的未记录更改或执行脚本两次的副作用,可能与第一次运行的剩余属性值、项目或中间输出文件有关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2013-06-11
  • 1970-01-01
  • 2023-03-30
  • 2016-10-13
  • 1970-01-01
  • 2011-02-24
相关资源
最近更新 更多