如何在签入VSO TFS存储库时更新Azure AppService中的文件夹

如何在签入VSO TFS存储库时更新Azure AppService中的文件夹,azure,web-applications,deployment,build,azure-devops,Azure,Web Applications,Deployment,Build,Azure Devops,我有一个网站作为azure web应用程序托管。这是一个位于vs解决方案中的asp.net网站。在该网站的文件夹中是我的产品文档,所有这些都是静态资源(html和图像)。这些静态资源位于另一个vs解决方案(这是实际的产品解决方案)的文件夹中。这两种解决方案都是基于VSO的TFS 到目前为止,我有一个在网站上下文中运行的webjob,它基本上是对文档文件夹执行“tfs get”,并将其内容放入网站的文档文件夹中。这是可行的,但是,网站运行的虚拟机确实经常更改,创建工作区的机制绑定到机器,而不是磁盘

我有一个网站作为azure web应用程序托管。这是一个位于vs解决方案中的asp.net网站。在该网站的文件夹中是我的产品文档,所有这些都是静态资源(html和图像)。这些静态资源位于另一个vs解决方案(这是实际的产品解决方案)的文件夹中。这两种解决方案都是基于VSO的TFS

到目前为止,我有一个在网站上下文中运行的webjob,它基本上是对文档文件夹执行“tfs get”,并将其内容放入网站的文档文件夹中。这是可行的,但是,网站运行的虚拟机确实经常更改,创建工作区的机制绑定到机器,而不是磁盘驱动器。因此,我不能只得到改变,但我必须始终得到所有的内容,目前需要约20分钟,并在网站上创建不必要的负载。(这就是为什么我每周只运行一次此webjob。)

现在我正在寻找一种更好的方法。我只想得到已更改的文件,这样做速度更快,cpu/驱动器的成本也更高

我没有找到一种方法在Web服务器上创建一个不会在每次Web服务器vm更改时消失的工作区。(如果能够以某种方式将工作区附加到驱动器而不是机器名,则可以解决问题。)

我还查看了为产品解决方案运行的持续构建定义。作为其中的一部分,我认为可能需要创建一个部署,将文档文件夹复制到应用程序服务的文档文件夹中。这样我就可以摆脱“特殊”的webjob,但每次我还是会复制所有的docs文件。(另外,它的构建代理正在本地运行,因此我还必须将这些文件从本地复制到云,而实际上它们已经在vso中了。)。所以基本上,我不认为这个选项对我的案例有多大用处

显然,如果我将静态文档资源从产品解决方案移动到网站解决方案,我只需使用可用于从vso到azure web app的网站项目的自动部署即可。不幸的是,由于各种其他原因(其中之一是,静态资源部分是从产品解决方案中的.cs源自动创建的),我无法将文档文件夹从产品解决方案移动到网站解决方案


那么,是否有人建议我可以根据相应VSO文件夹中的更改来更新web应用程序中的文档文件夹?

您可以使用Kudu API将更新后的文件上载到Azure应用程序服务。 简单步骤:

  • 创建一个持续集成构建
  • 选中“选项”选项卡中的“允许脚本访问OAuth令牌”选项
  • 将PowerShell步骤/任务添加到。(请参阅)
  • 通过使用kudu api添加Azure PowerShell步骤/任务以将文件上载到应用程序服务。(请参阅)

  • 以下是我最后做的:

    • 在VSO中创建了一个连接到“Web挂钩”的ServiceHook。每次签入时都会调用钩子,并根据我想要的目录进行过滤。(所有这些都可以使用VSO中的现有功能完成。)
    • 钩子将Azure称为“functionapp”(这很容易做到,因为FunctionPP有一个“HttpTrigger”机制,很适合这里)
    • 钩子将签入变更集的id传递给函数app
    • FunctionApp将该id放入Azure(存储)队列
    • 这将触发在该队列上侦听的azure webjob。该webjob使用变更集Id从VSO获取变更,并对每个变更的变更类型进行操作。(例如:下载或删除文件。)