You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DevOps Pipeline如何实现仅在代码变更时运行指定构建步骤?

在Azure DevOps Pipeline中实现仅代码变更时执行Cloudflare测试部署

一、有几种更简便的内置实现方案

Azure DevOps Pipeline本身提供了无需手动维护哈希值的原生方案,不用自己写全流程:

1. 基于代码路径变更的条件执行

如果你的表单相关代码集中在特定目录,直接给部署步骤加路径过滤条件,只有指定路径下的文件有变更时才运行:

steps:
  - script: # 这里填你的Cloudflare测试部署命令
    displayName: "表单上下文Cloudflare测试部署"
    condition: |
      and(
        succeeded(),
        # 可选:限定只在特定分支执行
        eq(variables['Build.SourceBranch'], 'refs/heads/develop'),
        # 检查表单代码目录是否存在,避免报错
        exists('$(Build.SourcesDirectory)/src/form/'),
        # 对比当前与上一次触发的提交,检查表单路径是否有变更
        git diff --name-only $(Build.SourceVersion) $(Build.SourceVersionPrevious) | grep -q 'src/form/'
      )

这里用Build.SourceVersion(当前提交哈希)和Build.SourceVersionPrevious(上一次Pipeline触发的提交哈希)做diff,只关注表单代码路径的变更,逻辑直接且无需额外存储。

2. 用Pipeline缓存自动维护哈希标记

如果不想依赖路径过滤,用Azure DevOps的缓存功能自动保存上次部署的提交哈希,自动对比:

variables:
  - name: deployCacheKey
    value: 'cloudflare-deploy-hash-$(Build.Repository.Name)'

steps:
  # 恢复上次部署的哈希缓存
  - task: Cache@2
    inputs:
      key: '$(deployCacheKey)'
      path: $(Pipeline.Workspace)/last-deploy-hash.txt
      cacheHitVar: DEPLOY_CACHE_HIT
    displayName: "加载上次部署哈希缓存"

  # 对比当前哈希与缓存中的哈希,决定是否跳过部署
  - script: |
      CURRENT_HASH=$(git rev-parse --short HEAD)
      SKIP_DEPLOY="false"
      
      if [ -f $(Pipeline.Workspace)/last-deploy-hash.txt ]; then
        LAST_HASH=$(cat $(Pipeline.Workspace)/last-deploy-hash.txt)
        if [ "$CURRENT_HASH" = "$LAST_HASH" ]; then
          echo "代码未变更,跳过部署"
          SKIP_DEPLOY="true"
        fi
      fi
      
      # 更新缓存文件为当前哈希
      echo "$CURRENT_HASH" > $(Pipeline.Workspace)/last-deploy-hash.txt
      # 设置变量供后续步骤判断
      echo "##vso[task.setvariable variable=SKIP_DEPLOY]$SKIP_DEPLOY"
    displayName: "判断是否需要执行部署"

  # 只有当不需要跳过时才执行部署
  - script: # 这里填你的Cloudflare测试部署命令
    displayName: "表单上下文Cloudflare测试部署"
    condition: and(succeeded(), eq(variables['SKIP_DEPLOY'], 'false'))

缓存会自动在Pipeline运行之间保留哈希值,不用手动维护外部存储,出错概率更低。

二、你提出的手动哈希对比流程完全可行

如果更倾向于完全手动控制流程,你设计的三步方案可以直接落地,以下是具体实现:

1. 获取当前提交哈希

- script: |
    CURRENT_HASH=$(git rev-parse --short HEAD)
    echo "##vso[task.setvariable variable=CURRENT_COMMIT_HASH]$CURRENT_HASH"
  displayName: "获取当前提交短哈希"

2. 对比上次存储的哈希,决定是否终止流程

这里用变量组存储历史哈希(先在项目中创建一个变量组,比如DeployHistory,添加变量LAST_DEPLOY_COMMIT_HASH):

- script: |
    LAST_HASH=$(LAST_DEPLOY_COMMIT_HASH)
    if [ "$CURRENT_COMMIT_HASH" = "$LAST_HASH" ]; then
      echo "代码未变更,终止流程"
      exit 1 # 退出当前步骤,后续步骤默认不会执行
    else
      echo "代码已变更,继续执行部署"
    fi
  displayName: "对比提交哈希判断是否部署"
  env:
    LAST_DEPLOY_COMMIT_HASH: $(LAST_DEPLOY_COMMIT_HASH)

3. 更新历史哈希并执行部署

# 更新变量组中的历史哈希
- task: AzureCLI@2
  inputs:
    azureSubscription: '你的Azure服务连接'
    scriptType: 'bash'
    inlineScript: |
      az pipelines variable-group variable update \
        --group-name "DeployHistory" \
        --name "LAST_DEPLOY_COMMIT_HASH" \
        --value "$CURRENT_COMMIT_HASH"
  displayName: "更新上次部署哈希"
  condition: succeeded()

# 执行Cloudflare测试部署
- script: # 这里填你的Cloudflare测试部署命令
  displayName: "表单上下文Cloudflare测试部署"
  condition: succeeded()

注意:要给Pipeline的服务主体分配变量组的编辑权限,否则无法更新变量。如果不想用变量组,也可以用Azure Blob存储来存哈希值,通过Azure CLI读写即可。


内容的提问来源于stack exchange,提问作者Shoreline

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 13:25:29