Skip to content

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 工作流,说明其触发时机和执行步骤。

yaml
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
查看答案与解析

答案与解析:

触发时机:

  • pushmain 分支时;
  • 针对 main 分支发起 pull_request 时。

执行步骤:

  1. actions/checkout@v4:检出仓库代码;
  2. actions/setup-node@v4:安装 Node.js 20;
  3. npm ci:安装依赖;
  4. npm run lint:运行代码检查;
  5. npm test:运行测试;
  6. npm run build:构建项目。

第 12 题

分析以下 GitLab CI 配置,说明 Stage 的执行顺序。

yaml
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,说明它存在什么问题,如何优化。

dockerfile
FROM node:20
WORKDIR /app
COPY . .
RUN npm ci
RUN npm run build
EXPOSE 3000
CMD ["node", "server.js"]
查看答案与解析

答案与解析:

问题:

  1. 基础镜像 node:20 体积较大,建议使用 node:20-alpine 等精简镜像;
  2. COPY . . 会复制所有文件,包括 node_modules 和开发环境文件,应优先复制 package*.json 安装依赖,利用缓存层;
  3. 没有多阶段构建,构建依赖会保留在最终镜像中;
  4. 生产环境应使用 npm ci --only=production 减少依赖体积。

优化后:

dockerfile
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。

yaml
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,说明该流水线的执行流程。

groovy
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 流水线分为四个阶段,顺序执行:

  1. Install:安装依赖;
  2. Test:运行代码检查和单元测试;
  3. Build:构建项目;
  4. Deploy:通过 scp 将构建产物部署到服务器。

agent any 表示任意可用的 Jenkins agent 都可以执行该流水线。


四、实践题

第 16 题

请为一个前端项目编写一个 GitHub Actions 工作流,要求:

  1. 在 PR 和 push 到 main 时触发;
  2. 使用 Node.js 20;
  3. 安装依赖、运行 lint、运行测试、构建项目;
  4. 缓存 node_modules 以加速构建。
查看答案与解析

参考答案:

yaml
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 配置,实现以下需求:

  1. 分为 install、test、build、deploy 四个阶段;
  2. install 阶段缓存 node_modules
  3. build 阶段生成 dist/ 产物并传递给 deploy;
  4. deploy 阶段只在 main 分支执行。
查看答案与解析

参考答案:

yaml
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,且只包含构建产物。

查看答案与解析

参考答案:

dockerfile
# 构建阶段
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 中的回滚策略有哪些,分别适用于什么场景。

查看答案与解析

答案与解析:

回滚策略:

  1. 代码回滚:回退到上一个稳定版本的代码,重新构建部署。适用于代码 bug 导致的线上问题。
  2. 镜像回滚:重新部署上一个版本的 Docker 镜像。适用于容器化部署,回滚速度快。
  3. 流量回滚:通过蓝绿部署或金丝雀发布快速切回旧版本。适用于需要秒级回滚的场景。
  4. 数据库回滚:执行回滚脚本恢复数据库状态。适用于数据变更导致的问题,但通常最复杂、风险最高。

选择回滚策略时应考虑问题类型、回滚速度和数据一致性。


第 20 题

请列出至少 5 条 CI/CD 最佳实践。

查看答案与解析

答案与解析:

  1. 所有代码提交都触发 CI;
  2. 主分支必须时刻保持可部署状态;
  3. 使用 Docker 保证环境一致性;
  4. 测试失败立即修复,禁止绕过测试;
  5. 发布流程必须可回滚;
  6. 监控线上指标,建立告警机制;
  7. 使用小步快跑、金丝雀发布降低发布风险;
  8. 密钥通过环境变量或密钥管理服务管理,不硬编码。

参考答案速查表

题号题型答案
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

基于 MIT 协议发布