【问题标题】:Deploy dacpac through VSTS only if it's been modified since last deploy仅当自上次部署以来已修改 dacpac 时,才通过 VSTS 部署 dacpac
【发布时间】:2017-09-12 15:23:50
【问题描述】:

在 VSTS 的部署 dacpac 步骤中,您可以将数据库设置为仅根据自定义条件运行。条件示例基于 VSTS 构建信息,我找不到任何有关使用来自连接的 Azure 订阅或 dacpac 元数据的条件的文档。在conditional page 中,他们有一个似乎可能有用的版本变量,但我找不到有关它的其他信息。

基本上,当触发 dacpac 步骤时,我想根据现有数据检查元数据,有条件地运行构建步骤并更新元数据。这可以通过 VSTS 构建步骤实现吗?

【问题讨论】:

    标签: build azure-devops


    【解决方案1】:

    是的,这是可能的。您可以在 VSTS 构建定义中添加用户定义的变量(例如具有默认值 0 的变量 result)。使用值 1 运行 dacpac 步骤,使用值 0 跳过该步骤。

    详细步骤如下:

    • 在 dacpac 步骤之前添加具有两个操作的 PowerShell 任务

      1. 检查现有数据是否有新的变化。

        如果元数据只存储在 Azure 中,您可以参考this way 在 powershell 中连接 Azure。如果元数据也存储在您构建时使用的存储库(例如 git 存储库)中,您还可以检查存储库中的更新。

      2. 根据元数据是否更新设置result变量值。

        如果数据更新,则将result变量更改为值1

        Write-Host ("##vso[task.setvariable variable=result]1")
        

        否则,不要更改值(保留0的值)

      由于数据在 git VCS 中管理,您可以在 git repo 中检查数据是否更新。如果数据发生变化,则将变量result 更改为1。详细的powershell脚本如下:

      $files=$(git diff HEAD HEAD~1 --name-only)
      echo "changed files as below: $files"
      if ($files -contains 'filename')
        Write-Host ("##vso[task.setvariable variable=result]1")
      
    • 为 dacpac 步骤设置条件

      在任务中,为运行此任务选择自定义条件。如果你想在成功时运行这个任务并且变量result变量是1,你可以表达:

      and(succeeded(), eq(variables['result'], '1'))
      

    现在如果result 的值为0,dacpac 步骤将被跳过,如果result 的值为1,dacpack 将被执行。

    【讨论】:

    • 检查新更改的好方法是什么?我在想我可以将每个数据库的最新 dacpac 部署的哈希存储在存储表中,并将其与当前数据库的哈希进行比较,然后更新它,但如果 VSTS 或 Azure 有某种内置版本控制会更好
    • 数据是否也在源代码控制(git 或 TFVC)中管理?如果在 VCS 中管理数据,确实有更简单的方法。否则你可以使用你提到的方式。
    • 数据在git中管理,infra通过VSTS搭建
    • 我通过检查 git repo 中的更新添加了 powershell 脚本。你可以试试看。
    • 您提供的 powershell 代码会比较当前和上次提交之间的值。我要比较的是当前 VSTS 构建和最近的 VSTS 构建使用了哪个提交
    猜你喜欢
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 1970-01-01
    • 2020-08-08
    • 2018-03-16
    • 1970-01-01
    • 2018-08-28
    • 2016-05-09
    相关资源
    最近更新 更多