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
相关产品推荐
相关产品推荐

