---
title: "什么是 CI/CD (持续集成 / 持续交付)？"
canonical: https://wavect.io/zh/glossary/ci-cd/
language: zh
description: "每一次代码变更都自动构建、测试、准备发布。一些团队再进一步，每一次通过的构建都自动上生产。"
image: "https://wavect.io/img/general/bak/open_graph_preview.jpg"
---

方法

# CI/CD

持续集成 / 持续交付

每一次代码变更都自动构建、测试、准备发布。一些团队再进一步，每一次通过的构建都自动上生产。

最近审阅: 2026-05-24 审阅人 [Kevin Riedl](/zh/team/kevin-riedl/) [wiki ↗](https://www.wikidata.org/wiki/Q139796365)

Continuous Integration 意味着团队的代码在每次变更时都合并并构建，而不是在最后做一次大爆炸式集成。 [Continuous Delivery](/zh/glossary/continuous-delivery/) 意味着每一次成功的构建都距离生产只差按一次按钮。Continuous Deployment 把按钮也去掉：每个通过测试的构建自动发布。这三者是一架成熟度阶梯，不是同义词。

多数团队 CI 做得好，CD 时好时坏，Continuous Deployment 几乎从不做。瓶颈很少在工具上。它在于对测试套件的信任，以及团队在一小时内修好一个坏构建的意愿。没有这两样，自动化部署只是让 Bug 跑得更快。

藏在流水线速度里的杠杆，举个实际例子：一支团队有一条要跑 25 分钟的 CI 流水线。工程师不再在本地跑它，把变更攒成批、靠希望去合并，以躲开那段等待。Bug 在合并之间累积，团队当初采用 CI 想躲开的那种集成之痛悄悄回来了。把那条流水线为内循环砍到 10 分钟以内，工程师就会不停地跑它、在上下文还新鲜时抓住问题，整个 [Agile](/zh/glossary/agile/) 循环随之收紧。流水线速度不是锦上添花；它是每个工程师每一天的力量倍增器。

诚实的取舍与常见错误：创始人要「完整的 CI/CD」，好像它是一个开关，而其实 CI 主要是工具、CD 主要是纪律。CI 你一个下午就能有。真正的 Continuous Delivery 需要一套团队信得过、敢在后面发布的测试套件（靠一种 [TDD](/zh/glossary/tdd/) 习惯）、一条以分钟计的回滚路径，以及一个在部署点着什么时能响应的待命人。Wavect 每个项目从第一天起就配好 CI，作为一段清醒 [SDLC](/zh/glossary/sdlc/) 的一部分；是否配置 CD 取决于这个项目是否有让它安全的覆盖率和运维纪律。我们会告诉你你拥有的是哪一种。

**在软件项目中何时最关键。** 上线前以及之后的每一次改动。一条健康的流水线让团队能安全发布、在上下文还新鲜时抓住回归，而不是把改动攒成一批、靠运气合并。

**创始人通常会搞错什么。** 他们要「完整的 CI/CD」，好像它是一个开关。CI 主要是工具，一个下午就能有；真正的 Continuous Delivery 主要是纪律，一套团队信得过的测试、以分钟计的回滚，以及一个待命的人。没有这些，自动部署只是更快地发布缺陷。

**Wavect 如何处理。** 我们从第一天起配好 CI，只有当覆盖率和运维纪律让自动交付安全时才开启它。 [上线前 QA 清单](/zh/software-development-guide/software-qa-checklist-before-launch/) 精确列出了在真实用户到来之前，一条流水线必须做到什么。

// FAQ

## 常见问题

### CI / CD / Continuous Deployment 三者怎么分？

CI 是「每次提交都自动构建并测试」。CD（Continuous Delivery）是「每次通过的构建都自动准备成可发布形态，按按钮才上线」。Continuous Deployment 把那次按按钮也省掉，每个通过的构建自动上生产。多数团队 CI 做得好，CD 时好时坏，Continuous Deployment 几乎没人做。

### 为什么大多数团队停在 CI？

因为 CD 需要一种大多数团队并不具备的、对测试套件的信任。没有好的覆盖率和快速回滚，自动化部署只是让 Bug 跑得更快。CI 主要是工具，CD 主要是纪律。

### 一条 CI 流水线应该跑多快？

内循环（构建、单测、Lint）控制在 10 分钟以内，含集成测试控制在 30 分钟以内。比这更慢，工程师就不在本地跑它、开始靠希望合并了。流水线速度是一项杠杆指标：值得在它上面投入。

相关术语

- [TDD](/zh/glossary/tdd/)
- [Continuous Delivery](/zh/glossary/continuous-delivery/)
- [Agile](/zh/glossary/agile/)
- [SDLC](/zh/glossary/sdlc/)

相关服务

- [软件开发](/zh/services/software-development/)

相关案例研究

- [Polity](/zh/case-studies/polity/)

相关指南

- [软件开发流程：从首次通话到完整交接](/zh/software-development-guide/software-development-process/)

聊聊

## Structured Data

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/#organization",
      "@type": [
        "Organization",
        "ProfessionalService",
        "LocalBusiness"
      ],
      "employee": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "founder": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "legalRepresentative": [
        {
          "@id": "https://wavect.io/team/kevin-riedl/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Kevin Riedl",
          "url": "https://wavect.io/team/kevin-riedl/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        },
        {
          "@id": "https://wavect.io/team/christof-jori/#person",
          "@type": "Person",
          "jobTitle": "Managing Director",
          "name": "Christof Jori",
          "url": "https://wavect.io/team/christof-jori/",
          "worksFor": {
            "@id": "https://wavect.io/#organization",
            "@type": [
              "Organization",
              "ProfessionalService",
              "LocalBusiness"
            ]
          }
        }
      ],
      "name": "Wavect GmbH",
      "subjectOf": {
        "@id": "https://wavect.io/verified-claims.json#dataset",
        "@type": "Dataset",
        "creator": {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        },
        "description": "A machine-readable registry of quantitative and qualitative claims published by Wavect, with review dates, localized page appearances and public third-party citations where available.",
        "inLanguage": "en",
        "isAccessibleForFree": true,
        "license": "https://creativecommons.org/licenses/by/4.0/",
        "name": "Wavect verified publication claims",
        "url": "https://wavect.io/verified-claims.json"
      },
      "url": "https://wavect.io/"
    },
    {
      "@id": "https://wavect.io/team/kevin-riedl/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Kevin Riedl",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796365",
        "https://www.linkedin.com/in/wsdt",
        "https://github.com/wsdt"
      ],
      "url": "https://wavect.io/team/kevin-riedl/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/team/christof-jori/#person",
      "@type": "Person",
      "jobTitle": "Managing Director",
      "name": "Christof Jori",
      "sameAs": [
        "https://www.wikidata.org/wiki/Q139796367",
        "https://www.linkedin.com/in/jocr77/",
        "https://github.com/jo-chris"
      ],
      "url": "https://wavect.io/team/christof-jori/",
      "worksFor": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      }
    },
    {
      "@id": "https://wavect.io/#website",
      "@type": "WebSite",
      "inLanguage": [
        "en",
        "de",
        "es",
        "zh"
      ],
      "name": "Wavect",
      "potentialAction": {
        "@type": "SearchAction",
        "query-input": "required name=search_term_string",
        "target": {
          "@type": "EntryPoint",
          "urlTemplate": "https://wavect.io/search/?q={search_term_string}"
        }
      },
      "publisher": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "url": "https://wavect.io/"
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@graph": [
    {
      "@id": "https://wavect.io/zh/glossary/ci-cd/#term",
      "@type": "DefinedTerm",
      "alternateName": [],
      "description": "每一次代码变更都自动构建、测试、准备发布。一些团队再进一步，每一次通过的构建都自动上生产。",
      "inDefinedTermSet": "https://wavect.io/zh/glossary/#termset",
      "name": "CI/CD",
      "termCode": "ci-cd",
      "url": "https://wavect.io/zh/glossary/ci-cd/"
    },
    {
      "@id": "https://wavect.io/zh/glossary/ci-cd/#webpage",
      "@type": "WebPage",
      "about": {
        "@id": "https://wavect.io/#organization",
        "@type": [
          "Organization",
          "ProfessionalService",
          "LocalBusiness"
        ]
      },
      "author": {
        "@id": "https://wavect.io/team/kevin-riedl/#person",
        "@type": "Person",
        "name": "Kevin Riedl",
        "url": "https://wavect.io/team/kevin-riedl/"
      },
      "dateModified": "2026-05-24",
      "description": "每一次代码变更都自动构建、测试、准备发布。一些团队再进一步，每一次通过的构建都自动上生产。",
      "headline": "CI/CD",
      "inLanguage": "zh",
      "isPartOf": {
        "@id": "https://wavect.io/#website",
        "@type": "WebSite"
      },
      "lastReviewed": "2026-05-24",
      "mainEntity": {
        "@id": "https://wavect.io/zh/glossary/ci-cd/#term"
      },
      "mentions": [
        {
          "@id": "https://wavect.io/#organization",
          "@type": [
            "Organization",
            "ProfessionalService",
            "LocalBusiness"
          ]
        }
      ],
      "name": "CI/CD",
      "reviewedBy": {
        "@id": "https://wavect.io/team/christof-jori/#person",
        "@type": "Person",
        "name": "Christof Jori",
        "url": "https://wavect.io/team/christof-jori/"
      },
      "speakable": {
        "@type": "SpeakableSpecification",
        "cssSelector": [
          ".gls-single__h1",
          ".gls-single__tldr"
        ]
      },
      "url": "https://wavect.io/zh/glossary/ci-cd/"
    },
    {
      "@type": "BreadcrumbList",
      "itemListElement": [
        {
          "@type": "ListItem",
          "item": "https://wavect.io/zh/",
          "name": "首页",
          "position": 1
        },
        {
          "@type": "ListItem",
          "item": "https://wavect.io/zh/glossary/",
          "name": "技术、产品与合作模式术语表",
          "position": 2
        },
        {
          "@type": "ListItem",
          "item": "https://wavect.io/zh/glossary/ci-cd/",
          "name": "CI/CD",
          "position": 3
        }
      ]
    }
  ]
}
```

```json
{
  "@context": "https://schema.org",
  "@type": "FAQPage",
  "mainEntity": [
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "CI 是「每次提交都自动构建并测试」。CD（Continuous Delivery）是「每次通过的构建都自动准备成可发布形态，按按钮才上线」。Continuous Deployment 把那次按按钮也省掉，每个通过的构建自动上生产。多数团队 CI 做得好，CD 时好时坏，Continuous Deployment 几乎没人做。"
      },
      "name": "CI / CD / Continuous Deployment 三者怎么分？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "因为 CD 需要一种大多数团队并不具备的、对测试套件的信任。没有好的覆盖率和快速回滚，自动化部署只是让 Bug 跑得更快。CI 主要是工具，CD 主要是纪律。"
      },
      "name": "为什么大多数团队停在 CI？"
    },
    {
      "@type": "Question",
      "acceptedAnswer": {
        "@type": "Answer",
        "text": "内循环（构建、单测、Lint）控制在 10 分钟以内，含集成测试控制在 30 分钟以内。比这更慢，工程师就不在本地跑它、开始靠希望合并了。流水线速度是一项杠杆指标：值得在它上面投入。"
      },
      "name": "一条 CI 流水线应该跑多快？"
    }
  ],
  "speakable": {
    "@type": "SpeakableSpecification",
    "cssSelector": [
      ".faq-question",
      ".faq-answer"
    ]
  }
}
```
