跳转至

CI/CD 面试题

CI/CD 面试重点包括概念理解、工具使用、流水线设计和质量门禁。

CI 和 CD 有什么区别?

CI(Continuous Integration)持续集成:
- 开发人员频繁合并代码到主分支
- 每次合并自动触发构建和测试
- 目的:尽早发现集成问题

CD 有两个含义:

1. Continuous Delivery(持续交付)
   - 代码随时可以部署到生产环境
   - 部署到生产需要手动确认

2. Continuous Deployment(持续部署)
   - 代码通过测试后自动部署到生产
   - 完全自动化,无需人工干预

关系:CI → 持续交付 → 持续部署(自动化程度递增)

Jenkins Pipeline 怎么写?

Pipeline 有两种写法:

1. 声明式(推荐)
pipeline {
    agent any
    stages {
        stage('Build') {
            steps {
                sh 'pip install -r requirements.txt'
            }
        }
        stage('Test') {
            steps {
                sh 'pytest --alluredir=allure-results'
            }
        }
        stage('Deploy') {
            steps {
                sh './deploy.sh'
            }
        }
    }
    post {
        always {
            allure includeProperties: false, results: [[path: 'allure-results']]
        }
    }
}

2. 脚本式
node {
    stage('Build') { sh 'pip install -r requirements.txt' }
    stage('Test') { sh 'pytest' }
}

GitHub Actions 和 Jenkins 有什么区别?

Jenkins:
- 自托管,需要自己维护服务器
- 配置复杂但功能强大
- 插件生态最丰富
- 适合企业内部使用

GitHub Actions:
- 托管在 GitHub,无需维护
- 配置简单(YAML 文件)
- 和 GitHub 深度集成
- 适合开源项目和 GitHub 用户

GitLab CI:
- 和 GitLab 深度集成
- 配置简单(.gitlab-ci.yml)
- 支持自托管 Runner
- 适合使用 GitLab 的团队

流水线中怎么设置质量门禁?

质量门禁 = 流水线中设置的通过条件,不满足则阻断部署

常见门禁:

1. 测试通过率
   - 所有用例必须通过
   - 或失败用例数不超过阈值

2. 代码覆盖率
   - 覆盖率不低于 70%
   - 新增代码覆盖率不低于 80%

3. 静态代码分析
   - SonarQube 质量门通过
   - 无严重 Bug 和安全漏洞

4. 依赖安全检查
   - 无已知高危漏洞
   - pip-audit、npm audit 通过

5. 构建成功
   - 编译无错误
   - 镜像构建成功

测试失败时怎么通知团队?

通知方式:

1. 邮件通知
   - Jenkins Email Extension Plugin
   - GitHub Actions 邮件 Action

2. 即时通讯
   - 钉钉/企业微信 Webhook
   - Slack Notification
   - Telegram Bot

3. 看板/仪表盘
   - Allure 报告
   - Grafana 仪表盘

最佳实践:
- 失败时立即通知
- 成功时不打扰(或每天汇总)
- 通知包含失败原因和日志链接

Docker 在 CI/CD 中怎么用?

用途:

1. 构建环境一致性
   - 用 Docker 镜像作为构建环境
   - 保证本地和 CI 环境一致

2. 应用容器化
   - 把应用打包成 Docker 镜像
   - 镜像推送到镜像仓库

3. 测试环境隔离
   - 每次测试用独立的容器
   - 测试完自动销毁

示例流水线:
代码提交 → 构建 Docker 镜像 → 推送镜像仓库 → 部署到测试环境 → 运行测试 → 部署到生产

什么是蓝绿部署和金丝雀发布?

蓝绿部署:
- 同时运行两套环境(蓝和绿)
- 蓝是当前版本,绿是新版本
- 测试通过后,流量切到绿
- 回滚:流量切回蓝

金丝雀发布:
- 先把少量流量切到新版本(如 5%)
- 观察监控数据,没有问题逐步增加
- 有问题立即回滚
- 比蓝绿部署更安全

滚动更新:
- 逐个替换旧版本实例
- K8s 默认策略
- 零停机

面试评分参考

维度 初级(1-2年) 中级(3-5年)
概念理解 知道 CI/CD 是什么 能解释 CI/CD 的价值和实践
工具使用 会用 Jenkins 跑流水线 能设计完整的流水线
质量门禁 知道要加测试 能配置覆盖率、安全检查等门禁
部署策略 知道自动化部署 能设计蓝绿/金丝雀发布方案