单体代码库的 CI/CD
探索优化单体代码库中 CI/CD 流水线的策略,包括根据变更文件选择性执行作业
单体代码库的 CI/CD 是 CoddyKit 上的免费 CI/CD with GitHub Actions & DevOps Pipelines 课时。 这是第 1 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 CI/CD with GitHub Actions & DevOps Pipelines 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 CI/CD with GitHub Actions & DevOps Pipelines 课程共包含 4 节课。
什么是单体代码库
单体代码库是一个包含多个项目或应用程序代码的单一代码库。与其为每个服务或库分别建立代码库,不如将所有内容放在一起。
您可以把它想象成一座大型图书馆:许多书籍(项目)位于同一栋建筑(代码库)中,而不是每本书都拥有一栋独立的建筑。这种方式有优点也有缺点,尤其是在持续集成/持续交付方面。
单体代码库的持续集成/持续交付挑战
虽然单体代码库具有更易共享代码等优点,但也会给持续集成/持续交付(CI/CD)流水线带来挑战:
- 构建缓慢:如果每次更改都会触发所有项目的完整构建和测试套件,流水线就会变得非常缓慢。
- 资源浪费:不必要地运行无关作业会消耗构建时长和资源。
- 开发者受挫:漫长的反馈周期会降低开发速度。
选择性持续集成/持续交付的必要性
高效处理单体代码库持续集成/持续交付的关键在于选择性。我们希望流水线足够智能,能够:
- 识别发生了什么更改。
- 仅为受这些更改影响的项目运行持续集成/持续交付作业。
这种方式可以节省时间、减少资源消耗,并为开发者提供更快的反馈。
按路径触发:`on.paths`
GitHub Actions 提供了一种强大的选择性执行方式:在工作流触发器中使用 paths 过滤器。您可以指定目录或文件,在这些目录或文件发生更改时触发工作流。
如果这些路径之外的文件发生更改,工作流就不会运行。这非常适合单体代码库!
on:
push:
branches:
- main
paths:
- 'apps/frontend/**'
- 'libs/shared/**'路径过滤器实战
下面是一个简单的工作流示例:只有在 apps/backend 目录中的文件或指定的 README.md 文件发生更改并被推送时,它才会运行。
这样可以确保只为后端服务触发相关的测试或构建。
name: Backend CI
on:
push:
branches:
- main
paths:
- 'apps/backend/**'
- 'README.md'
jobs:
build-backend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Build backend app
run: echo "Building backend..."忽略路径:`paths-ignore`
有时,您希望工作流针对大多数更改运行,但如果只修改了某些文件(例如文档、日志文件),则跳过运行。paths-ignore 过滤器非常适合这种情况。
它的工作方式与 paths 类似,但用于指定不应触发工作流的文件。
on:
pull_request:
branches:
- main
paths-ignore:
- 'docs/**'
- '**/*.md'使用 `git diff` 动态选择性运行
对于更复杂的逻辑,您可以在工作流步骤中使用 git diff 等 Git 命令动态检查更改。这样便可以构建自定义条件。
例如,您可以检查特定文件夹中是否发生了更改,并设置一个输出变量,以决定后续作业是否应运行。
条件作业执行示例
此工作流步骤使用 git diff 检查当前提交与基础分支之间 apps/api/ 下是否有任何文件发生更改。如果有,它会将输出变量 api_changed 设置为 'true'。
随后可以使用此输出控制“部署 API”作业是否运行。
jobs:
check-changes:
runs-on: ubuntu-latest
outputs:
api_changed: ${{ steps.diff.outputs.api_changed }}
steps:
- uses: actions/checkout@v4
- name: Check API changes
id: diff
run: |
if git diff --quiet ${{ github.event.before }} ${{ github.sha }} -- apps/api/;
then
echo "api_changed=false" >> $GITHUB_OUTPUT
else
echo "api_changed=true" >> $GITHUB_OUTPUT
fi
deploy-api:
needs: check-changes
if: needs.check-changes.outputs.api_changed == 'true'
runs-on: ubuntu-latest
steps:
- name: Deploy API
run: echo "Deploying API..."用于持续集成/持续交付的单体代码库结构
组织良好的单体代码库结构可以大大简化选择性持续集成/持续交付。将相关文件和项目归入定义清晰的目录后,就能轻松有效地使用 paths 过滤器。
/apps/frontend/apps/backend/libs/shared/docs
清晰的分离有助于精确指定工作流的目标。
单体代码库持续集成/持续交付测验
优化单体代码库的持续集成/持续交付,对于保持开发速度和高效利用资源至关重要。请思考哪些策略最适合应对大型集中式代码库带来的挑战。
回顾与后续步骤
您已经学习了如何通过实施选择性作业执行来应对单体代码库中的持续集成/持续交付挑战。使用 GitHub Actions 的 paths 过滤器和高级 git diff 技术,您可以确保流水线只运行必要的任务。
这样可以带来更快的反馈、更低的成本和更顺畅的开发体验。继续探索如何微调工作流,以实现更高的效率!
常见问题解答
「单体代码库的 CI/CD」课时是免费的吗?
是的 — 「单体代码库的 CI/CD」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 CI/CD with GitHub Actions & DevOps Pipelines 课程的其余内容,请升级到 CoddyKit PRO。 CI/CD with GitHub Actions & DevOps Pipelines 课程共包含 4 节课。
「单体代码库的 CI/CD」这节课中我会学到什么?
探索优化单体代码库中 CI/CD 流水线的策略,包括根据变更文件选择性执行作业 你通过在浏览器中直接运行的动手代码来练习 CI/CD with GitHub Actions & DevOps Pipelines,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 CI/CD with GitHub Actions & DevOps Pipelines 需要有经验吗?
无需任何先前经验。CoddyKit 上的 CI/CD with GitHub Actions & DevOps Pipelines 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 1 节课,共 4 节。
「单体代码库的 CI/CD」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 CI/CD with GitHub Actions & DevOps Pipelines 课中编写并运行代码吗?
能。每节 CI/CD with GitHub Actions & DevOps Pipelines 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- 单体代码库的 CI/CD
- 跨代码库工作流
- 集中式工作流管理
- 路径过滤与选择性构建