一、什么是CI/CD
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署
具体而言,CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署)。这些关联的事务通常被统称为“CI/CD 管道”,由开发和运维团队以敏捷方式协同支持。
CI/CD 中的 “CI” 始终指持续集成,它属于开发人员的自动化流程。成功的 CI 意味着应用代码的新更改会定期构建、测试并合并到共享存储库中。该解决方案可以解决在一次开发中有太多应用分支,从而导致相互冲突的问题
CI/CD 中的 “CD” 指的是持续交付和/或持续部署
持续交付通常是指开发人员对应用的更改会自动进行错误测试并上传到存储库(如 GitHub 或容器注册表),然后由运维团队将其部署到实时生产环境中。这旨在解决开发和运维团队之间可见性及沟通较差的问题。因此,持续交付的目的就是确保尽可能减少部署新代码时所需的工作量。
持续部署(另一种“CD”)指的是自动将开发人员的更改从存储库发布到生产环境,以供客户使用。它主要为了解决因手动流程降低应用交付速度,从而使运维团队超负荷的问题。持续部署以持续交付的优势为根基,实现了管道后续阶段的自动化
我们没必要纠结于这些语义,您只需记得 CI/CD 其实就是一个流程(通常形象地表述为管道),用于实现应用开发中的高度持续自动化和持续监控。因案例而异,该术语的具体含义取决于 CI/CD 管道的自动化程度。许多企业最开始先添加 CI,然后逐步实现交付和部署的自动化
CI 持续集成(Continuous Integration)
持续集成(CI)可以帮助开发人员更加频繁地(有时甚至每天)将代码更改合并到共享分支或“主干”中。一旦开发人员对应用所做的更改被合并,系统就会通过自动构建应用并运行不同级别的自动化测试(通常是单元测试和集成测试)来验证这些更改,确保这些更改没有对应用造成破坏。这意味着测试内容涵盖了从类和函数到构成整个应用的不同模块。如果自动化测试发现新代码和现有代码之间存在冲突,CI 可以更加轻松地快速修复这些错误。
CD 持续交付(Continuous Delivery)
完成 CI 中构建及单元测试和集成测试的自动化流程后,持续交付可自动将已验证的代码发布到存储库。为了实现高效的持续交付流程,务必要确保 CI 已内置于开发管道。持续交付的目标是拥有一个可随时部署到生产环境的代码库。
在持续交付中,每个阶段(从代码更改的合并,到生产就绪型构建版本的交付)都涉及测试自动化和代码发布自动化。在流程结束时,运维团队可以快速、轻松地将应用部署到生产环境中。
CD 持续部署(Continuous Deployment)
对于一个成熟的 CI/CD 管道来说,最后的阶段是持续部署。作为持续交付——自动将生产就绪型构建版本发布到代码存储库——的延伸,持续部署可以自动将应用发布到生产环境。由于在生产之前的管道阶段没有手动门控,因此持续部署在很大程度上都得依赖精心设计的测试自动化。
实际上,持续部署意味着开发人员对应用的更改在编写后的几分钟内就能生效(假设它通过了自动化测试)。这更加便于持续接收和整合用户反馈。总而言之,所有这些 CI/CD 的关联步骤都有助于降低应用的部署风险,因此更便于以小件的方式(而非一次性)发布对应用的更改。不过,由于还需要编写自动化测试以适应 CI/CD 管道中的各种测试和发布阶段,因此前期投资还是会很大
2、CI/CD pipeline configuration
CI/CD管道的配置文件为 .gitlab-ci.yml , 位于项目根目录下。
Job内的关键字列表:
Keyword | Description |
---|---|
script |
Shell script that is executed by a runner. 运行程序执行的Shell脚本 |
after_script |
Override a set of commands that are executed after job. 覆盖作业后执行的一组命令 |
allow_failure |
Allow job to fail. A failed job does not cause the pipeline to fail. 允许作业失败。失败的作业不会导致管道失败 |
artifacts |
List of files and directories to attach to a job on success. Also available: artifacts:paths , artifacts:exclude , artifacts:expose_as , artifacts:name , artifacts:untracked , artifacts:when , artifacts:expire_in , and artifacts:reports . |
before_script |
Override a set of commands that are executed before job. 覆盖作业之前执行的一组命令 |
cache |
List of files that should be cached between subsequent runs. Also available: cache:paths , cache:key , cache:untracked , cache:when , and cache:policy . |
coverage |
Code coverage settings for a given job. |
dependencies |
Restrict which artifacts are passed to a specific job by providing a list of jobs to fetch artifacts from. |
environment |
Name of an environment to which the job deploys. Also available: environment:name , environment:url , environment:on_stop , environment:auto_stop_in , and environment:action . |
except |
Limit when jobs are not created. Also available: except:refs , except:kubernetes , except:variables , and except:changes . |
extends |
Configuration entries that this job inherits from. |
image |
Use Docker images. Also available: image:name and image:entrypoint . 使用Docker映像 |
include |
Include external YAML files. Also available: include:local , include:file , include:template , and include:remote . 包括外部YAML文件 |
interruptible |
Defines if a job can be canceled when made redundant by a newer run. |
only |
Limit when jobs are created. Also available: only:refs , only:kubernetes , only:variables , and only:changes . 限制创建作业的时机 |
pages |
Upload the result of a job to use with GitLab Pages. |
parallel |
How many instances of a job should be run in parallel. |
release |
Instructs the runner to generate a Release object. |
resource_group |
Limit job concurrency. |
retry |
When and how many times a job can be auto-retried in case of a failure. 发生故障时可以自动重试作业的时次数 |
rules |
List of conditions to evaluate and determine selected attributes of a job, and whether or not it’s created. May not be used alongside only /except . |
services |
Use Docker services images. Also available: services:name , services:alias , services:entrypoint , and services:command . |
stage |
Defines a job stage (default: test ). 定义一个作业阶段 |
tags |
List of tags that are used to select a runner. |
timeout |
Define a custom job-level timeout that takes precedence over the project-wide setting. |
trigger |
Defines a downstream pipeline trigger. |
variables |
Define job variables on a job level. |
when |
When to run job. Also available: when:manual and when:delayed . 什么时候运行作业 |
END.