28、Git与敏捷开发:Scrum中的Git实践、持续集成、持续交付、DevOps流程

聊到Git和敏捷开发,我得先说说自己的体会。刚入行那会儿,我以为Git就是个存代码的工具。后来带团队做Scrum,才真正明白——Git是敏捷的血管,CI/CD是心跳,DevOps是呼吸。这三者缺一个,项目就容易「缺氧」。

说白了,这一章就是讲怎么把Git嵌入到敏捷开发的每个环节里。不是让你背命令,而是让你理解:什么时候该分支,什么时候该合并,什么时候该触发自动化流水线。

Scrum中的Git实践:分支策略与协作节奏

Scrum有Sprint,有每日站会,有评审和回顾。Git怎么配合?我个人的经验是:分支策略必须匹配迭代节奏

举个例子。我们团队用Scrum,每个Sprint两周。一开始大家各自在master上改,结果冲突不断,合并时像拆炸弹。后来我引入了功能分支 + 发布分支的模式,情况才好转。

推荐的分支模型

分支类型 用途 生命周期
main 生产就绪代码 永久
develop 集成开发分支 永久
feature/* 每个用户故事 Sprint内
release/* Sprint发布准备 发布前
hotfix/* 紧急修复 按需

每个Sprint开始,我们从develop拉出feature/xxx分支。开发完成后,提Pull Request,代码评审通过后合并回develop。Sprint结束前,从develop拉出release/x.y.z分支,只修bug,不加新功能。

核心原则main永远是可部署状态。develop是下一个Sprint的集成地。功能分支是隔离的沙箱。

我曾经遇到一个坑:有个同事直接在develop上改代码,结果Sprint中途要发布一个紧急补丁,develop里全是未完成的功能,根本不敢合并到main。嗯,从那以后我定了个规矩——develop分支禁止直接push,只能通过PR合并

持续集成:让Git成为自动化的触发器

持续集成(CI)说白了就是:你每次push代码,机器自动帮你跑测试、检查代码风格、构建项目。我见过太多团队「写完代码扔一边,上线前才集成」,结果呢?集成那天就是灾难日。

Git和CI的配合其实很简单:用Webhook监听push事件。你推代码到远程仓库,CI服务器(比如Jenkins、GitLab CI、GitHub Actions)自动拉取最新代码,执行预设的流水线。

一个典型的CI流水线

# .gitlab-ci.yml 示例
stages:
  - lint
  - test
  - build

lint-job:
  stage: lint
  script:
    - npm run lint

test-job:
  stage: test
  script:
    - npm test

build-job:
  stage: build
  script:
    - npm run build
  only:
    - main

你想想看,每次PR合并前,CI自动跑一遍测试。如果测试失败,PR就不能合并。这相当于给代码质量上了道保险。

我的习惯:在PR模板里加一个checklist,要求开发者确认CI通过后再请求评审。这样能减少「CI红了还让人review」的尴尬情况。

持续交付:从Git到生产环境的自动化管道

持续交付(CD)是CI的延伸。CI保证代码没问题,CD保证代码能随时部署到生产环境。我参与过一个项目,从代码提交到上线只需要15分钟——全靠Git触发的自动化流水线。

CD的核心是部署流水线。每次合并到main分支,自动触发构建、测试、打包、部署到预发布环境。确认没问题后,一键部署到生产环境。

Git标签与版本管理

我建议用Git标签来标记版本。每次发布时,打一个语义化版本标签:

git tag -a v1.2.3 -m "Release version 1.2.3"
git push origin v1.2.3

CD流水线可以监听标签事件。比如GitLab CI里这样写:

deploy-production:
  stage: deploy
  script:
    - ./deploy.sh production
  only:
    - tags

这样一来,只有打了标签的提交才会部署到生产环境。既安全又清晰。

注意:不要手动在服务器上改代码。我曾经见过有人直接在服务器上修改配置文件,结果下次部署时被覆盖了。所有变更必须通过Git,这是底线。

DevOps流程:Git作为单一事实来源

DevOps强调开发(Dev)和运维(Ops)的协作。Git在这里扮演什么角色?单一事实来源。代码、配置、基础设施定义(IaC)、流水线定义——全都存在Git仓库里。

我团队的做法是:

  • 应用代码:存在app/目录
  • Dockerfile和K8s配置:存在deploy/目录
  • Ansible/Terraform脚本:存在infra/目录
  • CI/CD流水线定义:存在.gitlab-ci.yml.github/workflows/

所有变更都走Git工作流:提PR、评审、合并、自动部署。运维人员不再需要SSH到服务器改配置,开发人员也不再需要「帮我部署一下」这种口头沟通。

GitOps:用Git管理整个基础设施

GitOps是DevOps的一个演进方向。核心思想是:Git仓库里描述的目标状态,就是系统应该达到的状态。有个Operator(比如Argo CD)不断对比Git里的配置和实际运行状态,发现不一致就自动纠正。

举个例子。你修改了K8s的Deployment副本数,从3改成5,提交到Git。Argo CD检测到变化,自动执行kubectl apply,把集群里的副本数调整到5。整个过程不需要任何人登录服务器。

一句话总结:Git是声明式配置的存储库,自动化工具负责让现实符合预期。

知识体系总览

下面这张图是我梳理的本章核心逻辑。你可以看到Git如何贯穿Scrum、CI、CD和DevOps的每个环节。

Git 仓库 Scrum 实践 持续集成 持续交付 DevOps 功能分支 / 发布分支 PR 代码评审 Sprint 节奏匹配 Webhook 触发 自动测试 / Lint 构建验证 Git 标签触发部署 预发布环境验证 一键生产部署 基础设施即代码 GitOps 自动同步 单一事实来源 目标:从代码提交到生产部署,全流程自动化、可追溯

你看,Git不只是版本控制工具。在敏捷开发里,它是协作的枢纽;在CI/CD里,它是自动化的触发器;在DevOps里,它是配置的权威来源。说白了,Git就是整个研发流程的「脊椎」

最后分享一个经验:刚开始推行这些实践时,别追求一步到位。先搞定分支策略,再接入CI,然后逐步加上CD和GitOps。我见过最成功的团队,都是「小步快跑,持续改进」的。


公众号:蓝海资料掘金营,微信deep3321