CI/CD 练习册
本练习册基于《CI/CD 学习文档》编写,涵盖 CI/CD 流程、GitHub Actions、GitLab CI、Jenkins、Docker、部署策略、回滚、安全、测试策略、监控等核心知识点。每题均附答案与解析,难度由浅入深。
一、选择题
第 1 题
CI(Continuous Integration)的核心价值不包括以下哪一项?
A. 早发现早修复集成问题
B. 减少分支冲突
C. 自动部署到生产环境
D. 自动化验证每次提交
查看答案与解析
答案:C
解析: 自动部署到生产环境属于 CD(Continuous Deployment)的范畴,CI 的核心是频繁集成、自动构建和测试。
第 2 题
GitHub Actions 的工作流配置文件应放在哪个目录?
A. .github/actions/
B. .github/workflows/
C. .ci/workflows/
D. workflows/.github/
查看答案与解析
答案:B
解析: GitHub Actions 通过 .github/workflows/ 目录下的 YAML 文件定义工作流。
第 3 题
以下哪种部署策略是"先让一小部分用户访问新版本,观察无问题后再逐步扩大流量"?
A. 蓝绿部署
B. 金丝雀发布
C. 滚动部署
D. 全量发布
查看答案与解析
答案:B
解析: 金丝雀发布(Canary Release)先让少量用户访问新版本,逐步扩大流量。蓝绿部署是同时维护两套环境切换流量;滚动部署是逐个替换实例。
第 4 题
Docker 多阶段构建的主要目的是?
A. 增加镜像体积
B. 减小最终镜像体积
C. 增加构建步骤
D. 提高容器启动失败率
查看答案与解析
答案:B
解析: 多阶段构建将构建环境和运行环境分离,只把最终产物复制到运行镜像中,从而减小最终镜像体积。
第 5 题
测试金字塔中,数量最多、成本最低的测试类型是?
A. E2E 测试
B. 集成测试
C. 单元测试
D. 性能测试
查看答案与解析
答案:C
解析: 测试金字塔底层是大量单元测试,快速、成本低;顶层是少量 E2E 测试,覆盖核心用户路径但成本高。
二、填空题
第 6 题
GitLab CI 的配置文件名为 ________。
查看答案与解析
答案:.gitlab-ci.yml
解析: GitLab CI 通过仓库根目录的 .gitlab-ci.yml 文件定义流水线。
第 7 题
Jenkins Pipeline 使用 ________ 语言编写声明式流水线。
查看答案与解析
答案:Groovy
解析: Jenkins Pipeline 通常使用 Groovy 语言编写,文件名为 Jenkinsfile。
第 8 题
Docker 镜像构建命令为 docker build -t myapp:1.0 ________。
查看答案与解析
答案:.
解析: docker build -t myapp:1.0 . 表示使用当前目录下的 Dockerfile 构建名为 myapp:1.0 的镜像。
第 9 题
GitHub Actions 中,用于检出仓库代码的 Action 是 actions/________。
查看答案与解析
答案:checkout
解析: actions/checkout@v4 用于将仓库代码检出到 Runner 工作目录。
第 10 题
CI/CD 流水线中,________ 用于在不同 Job 之间传递构建产物。
查看答案与解析
答案:Artifacts
解析: Artifacts 是 CI/CD 中 Job 之间传递产物的机制,如 GitLab CI 的 artifacts、GitHub Actions 的 actions/upload-artifact。
三、代码分析题
第 11 题
分析以下 GitHub Actions 工作流,说明其触发时机和执行步骤。
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- run: npm ci
- run: npm run lint
- run: npm test
- run: npm run build查看答案与解析
答案与解析:
触发时机:
push到main分支时;- 针对
main分支发起pull_request时。
执行步骤:
actions/checkout@v4:检出仓库代码;actions/setup-node@v4:安装 Node.js 20;npm ci:安装依赖;npm run lint:运行代码检查;npm test:运行测试;npm run build:构建项目。
第 12 题
分析以下 GitLab CI 配置,说明 Stage 的执行顺序。
stages:
- install
- test
- build
- deploy
install:
stage: install
script:
- npm ci
test:
stage: test
script:
- npm test
build:
stage: build
script:
- npm run build
deploy:
stage: deploy
script:
- echo "Deploy to production"
only:
- main查看答案与解析
答案与解析:
Stage 按定义顺序执行:install → test → build → deploy。
- install 阶段先执行
npm ci; - test 阶段执行测试;
- build 阶段构建项目;
- deploy 阶段仅在
main分支触发部署。
同一 Stage 中的多个 Job 并行执行,不同 Stage 顺序执行。
第 13 题
分析以下 Dockerfile,说明它存在什么问题,如何优化。
FROM node:20
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build
EXPOSE 3000
CMD ["node", "server.js"]查看答案与解析
答案与解析:
问题:
- 基础镜像
node:20体积较大,建议使用node:20-alpine等精简镜像; COPY . .会复制所有文件,包括node_modules和开发环境文件,应优先复制package*.json安装依赖,利用缓存层;- 没有多阶段构建,构建依赖会保留在最终镜像中;
- 生产环境应使用
npm ci --only=production减少依赖体积。
优化后:
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package*.json ./
EXPOSE 3000
CMD ["node", "dist/server.js"]第 14 题
分析以下 GitHub Actions 矩阵构建配置,说明它会运行多少个 Job。
strategy:
matrix:
node-version: [18, 20]
os: [ubuntu-latest, windows-latest]查看答案与解析
答案与解析:
会运行 2 × 2 = 4 个 Job,分别是:
- Node 18 + Ubuntu
- Node 18 + Windows
- Node 20 + Ubuntu
- Node 20 + Windows
矩阵构建用于同时测试多个 Node.js 版本和操作系统,提高兼容性测试覆盖率。
第 15 题
分析以下 Jenkinsfile,说明该流水线的执行流程。
pipeline {
agent any
stages {
stage('Install') {
steps {
sh 'npm ci'
}
}
stage('Test') {
steps {
sh 'npm run lint'
sh 'npm test'
}
}
stage('Build') {
steps {
sh 'npm run build'
}
}
stage('Deploy') {
steps {
sh 'scp -r dist user@server:/var/www/app'
}
}
}
}查看答案与解析
答案与解析:
该 Jenkins 流水线分为四个阶段,顺序执行:
- Install:安装依赖;
- Test:运行代码检查和单元测试;
- Build:构建项目;
- Deploy:通过 scp 将构建产物部署到服务器。
agent any 表示任意可用的 Jenkins agent 都可以执行该流水线。
四、实践题
第 16 题
请为一个前端项目编写一个 GitHub Actions 工作流,要求:
- 在 PR 和 push 到 main 时触发;
- 使用 Node.js 20;
- 安装依赖、运行 lint、运行测试、构建项目;
- 缓存
node_modules以加速构建。
查看答案与解析
参考答案:
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '20'
- uses: actions/cache@v3
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
restore-keys: |
${{ runner.os }}-node-
- run: npm ci
- run: npm run lint
- run: npm test
- run: npm run build解析:
- 使用
actions/cache缓存 npm 缓存目录,避免每次重复下载依赖; hashFiles('**/package-lock.json')作为缓存 key,确保依赖变化时刷新缓存;- 工作流覆盖代码检查、测试和构建,保证代码质量。
第 17 题
请编写一个 GitLab CI 配置,实现以下需求:
- 分为 install、test、build、deploy 四个阶段;
- install 阶段缓存
node_modules; - build 阶段生成
dist/产物并传递给 deploy; - deploy 阶段只在 main 分支执行。
查看答案与解析
参考答案:
stages:
- install
- test
- build
- deploy
install:
stage: install
script:
- npm ci
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
- node_modules/
test:
stage: test
script:
- npm run lint
- npm test
build:
stage: build
script:
- npm run build
artifacts:
paths:
- dist/
expire_in: 1 hour
deploy:
stage: deploy
script:
- echo "Deploy to production"
only:
- main解析:
cache用于加速后续构建;artifacts用于将dist/产物从 build 阶段传递到 deploy 阶段;only: main限制 deploy 只在 main 分支执行。
第 18 题
请为一个前端静态站点编写一个多阶段 Dockerfile,要求最终镜像基于 Nginx,且只包含构建产物。
查看答案与解析
参考答案:
# 构建阶段
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]解析:
- 第一阶段使用 Node.js 镜像安装依赖并构建;
- 第二阶段使用 Nginx 镜像,只复制构建产物
dist/; - 最终镜像体积小、无构建工具依赖,适合部署静态站点。
第 19 题
请描述 CI/CD 中的回滚策略有哪些,分别适用于什么场景。
查看答案与解析
答案与解析:
回滚策略:
- 代码回滚:回退到上一个稳定版本的代码,重新构建部署。适用于代码 bug 导致的线上问题。
- 镜像回滚:重新部署上一个版本的 Docker 镜像。适用于容器化部署,回滚速度快。
- 流量回滚:通过蓝绿部署或金丝雀发布快速切回旧版本。适用于需要秒级回滚的场景。
- 数据库回滚:执行回滚脚本恢复数据库状态。适用于数据变更导致的问题,但通常最复杂、风险最高。
选择回滚策略时应考虑问题类型、回滚速度和数据一致性。
第 20 题
请列出至少 5 条 CI/CD 最佳实践。
查看答案与解析
答案与解析:
- 所有代码提交都触发 CI;
- 主分支必须时刻保持可部署状态;
- 使用 Docker 保证环境一致性;
- 测试失败立即修复,禁止绕过测试;
- 发布流程必须可回滚;
- 监控线上指标,建立告警机制;
- 使用小步快跑、金丝雀发布降低发布风险;
- 密钥通过环境变量或密钥管理服务管理,不硬编码。
参考答案速查表
| 题号 | 题型 | 答案 |
|---|---|---|
| 1 | 选择 | C |
| 2 | 选择 | B |
| 3 | 选择 | B |
| 4 | 选择 | B |
| 5 | 选择 | C |
| 6 | 填空 | .gitlab-ci.yml |
| 7 | 填空 | Groovy |
| 8 | 填空 | . |
| 9 | 填空 | checkout |
| 10 | 填空 | Artifacts |
| 11-15 | 代码分析 | 见解析 |
| 16-20 | 实践 | 见参考答案 |
领域编号:E03 CI/CD
最后更新:2026-06-18