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

如何在Azure DevOps中仅发布已变更的工件?

仅部署变更工件的解决方案

1. 基于版本控制系统(Git)的变更检测

利用Git的提交记录定位改动的工件:

  • 提交范围对比:在定时任务中,对比上次部署的commit与当前最新commit,通过git diff --name-only <last-deploy-commit> HEAD输出变更文件,再根据文件路径映射到对应工件。
  • 路径过滤:给每个工件分配独立目录(如/artifacts/artifact-a/),用git diff --name-only HEAD~1 | grep -E 'artifacts/(artifact-a|artifact-b)/'筛选出有变更的工件目录。
  • 版本标记跟踪:维护artifact-versions.json记录各工件上次部署的版本号,定时任务时对比当前工件的Git标签/版本号,找出不一致的工件。

2. 基于构建产物的哈希校验

通过哈希值判断工件是否需要重新部署:

  • 预存储哈希值:每次构建后,计算工件产物(JAR、Docker镜像、静态包)的MD5/SHA256哈希值,存入本地文件或数据库。
  • 哈希对比触发:定时任务执行时,重新计算当前产物哈希值,与存储值对比,仅对哈希不一致的工件执行部署。
  • Docker镜像标签优化:为每个工件的镜像打上Git commit哈希作为标签,定时任务检查远程仓库是否存在对应标签,不存在则触发该工件的构建与部署。

3. 利用CI/CD工具的内置功能

主流CI/CD工具原生支持增量部署配置:

  • Jenkins:在Pipeline中用changed()条件或Git Changelog插件,为每个工件设置独立阶段,仅对应目录有变更时执行部署步骤:
    pipeline {
        agent any
        stages {
            stage('Deploy Artifact A') {
                when { changeset 'artifacts/artifact-a/**' }
                steps {
                    sh './deploy-artifact-a.sh'
                }
            }
            stage('Deploy Artifact B') {
                when { changeset 'artifacts/artifact-b/**' }
                steps {
                    sh './deploy-artifact-b.sh'
                }
            }
        }
    }
    
  • GitLab CI:通过rules:changes规则,为每个工件的部署job设置触发条件:
    deploy-artifact-a:
      script: ./deploy-artifact-a.sh
      rules:
        - changes:
            - artifacts/artifact-a/**
    

4. 自定义增量部署脚本

编写脚本实现核心逻辑:

  1. 读取上次部署的基准状态(如commit ID、哈希集合)。
  2. 扫描当前工件状态,与基准对比生成变更列表。
  3. 遍历变更列表,逐个执行对应工件的部署命令。
  4. 部署完成后更新基准状态记录。

示例Bash脚本:

#!/bin/bash
# 读取上次部署的commit ID
LAST_COMMIT=$(cat last-deploy-commit.txt)
# 获取变更文件列表
CHANGED_FILES=$(git diff --name-only $LAST_COMMIT HEAD)
# 定义工件目录映射
ARTIFACTS=("artifact-a" "artifact-b" "artifact-c")

for ARTIFACT in "${ARTIFACTS[@]}"; do
    if echo "$CHANGED_FILES" | grep -q "artifacts/$ARTIFACT/"; then
        echo "Deploying $ARTIFACT..."
        ./deploy-$ARTIFACT.sh
    fi
done

# 更新上次部署的commit ID
git rev-parse HEAD > last-deploy-commit.txt

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 18:55:40