> For the complete documentation index, see [llms.txt](https://yangsx95.gitbook.io/notes/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yangsx95.gitbook.io/notes/devops/gitlab/gitlabcicd.md).

# GitlabCI/CD

官方文档：<https://docs.gitlab.com/ee/ci/>

主要分为三个部分：

* Continuous Integration (CI) 持续集成
* Continuous Delivery (CD) 持续交付
* Continuous Deployment (CD) 持续部署

## Gitlab CI/CD 组件

1. Gitlab CI/CD 是Gitlab代码仓库的一部分
2. GitlabRunner，是一个专门处理构建的应用程序，可以独立于Gitlab部署，并通过API与Gitlab CI/CD一起使用
3. `.gitlab-ci.yml`配置文件，是告诉Runner怎么执行CI/CD的脚本

为了运行测试，至少需要一个Gitlab示例和一个GitlabRunner，并且提供`.gitlab-ci.yml`文件。

## Gitlab CI/CD 特点

1. 多平台：使用Golang，支持多平台
2. 多语言：构建脚本实际是由命令行驱动的，可以与多语言一同使用
3. 稳定构建：Gitlab CI/CD 和 Gitlab Runner在不同的机器上运行
4. 并行构建：Gitlab CI/CD 再多台机器上拆分构建，以实现快速执行
5. 实时日志记录
6. 灵活的管道：可以在每个阶段定义多个并行作业，并且可以触发其他构建
7. 版本管道：一个`.gitlab-ci.yml`文件，包括测试、过程步骤、放置在仓库中，每个人都可以贡献更改，确保每个分支获得所需的管道
8. 自动缩放：可以在docker或者k8s中自动缩放构建机器
9. 构建工件：可以将二进制文件和其他构建工件上载道Gitlab并浏览和下载他们
10. Docker支持、K8s支持
11. 容器注册表：内置的容器注册表，用于存储、共享和使用容器镜像
12. 受保护的变量：在部署期间使用受每个环境保护的变量安全的存储和使用机密
13. 多环境：可以定义多个环境

## Jenkins CI VS Gitlab CI

1. 当代码新建立一个分支时，Jenkins需要重新配置一个新的构建，而Gitlab的`.gitlab-ci.yml`会被带入到新的分支中，会自动生成新的构建
2. Jenkins支持定时构建，**Gitlab则不支持定时构建**，可以通过WebAPI使用同一台或者另一台服务器上的cronjob触发作业和管道。
3. Jenkins的权限管理粒度太粗，Gitlab则有完善的权限管理（与代码权限一致）
4. 代码库的交互上，Jenkins可以支持多种代码仓库，而Gitlab ci与Gitlab深度绑定
5. 插件管理上，Jenkins的插件很多，但是后期更新之后的成本较高。而Gitlab是开放式的，任何人都可以像代码库贡献更改，一旦合并，将自动测试并维护每个更改。
6. Gitlab没有统一的管理界面，无法统筹管理所有的项目
7. Gitlab配置依赖于代码仓库，耦合度没有jenkins低
8. Jenkins体量较大适合较大的团队，而Gitlab适合较小体量的团队，比如敏捷开发

## 工作原理

1. 将代码托管到Gitlab
2. 在项目的根目录创建ci文件： `.gitlab-ci.yml`，在文件中指定构建、测试和部署脚本
3. Gitlab将检测道他并使用名为 GitlabRunner的工具运行脚本
4. 脚本被分组为作业、他们共同组成了一个管道

## Gitlab Runner

* 类似Jenkins的Agent，用于构建脚本任务的具体实例
* Gitlab Runner 是一个开源项目，他与Gitlab CI结合使用，用于运行作业并将结果发送给Gitlab
* Gitlab CI是Gitlab随附的用于协调作业的开源持续集成服务
* Gitlab Runner 使用Go编写，可在Linux、MacOS、Windows操作系统执行
* Gitlab Runner运行的Docker版本最少为 Docker v1.13.0
* Gitlab Runner版本于Gitlab的版本同步
* 可以根据需要配置任意数量的Runner
* 多个Gitlab Runner可以并行执行作业
* GitlabRunner实际通过ssh连接Docker容器、本地、通过SSH执行作业（支持Bash、Batch、PowerShell），也可以对Docker进行自动伸缩扩容
* 可以对Runner定义作业运行环境
* 自动重新加载配置，无需重启

### Gitlab Runner的类型

1. shared 共享类型，运行整个平台项目的作业
2. group 项目组类型，运行特定group下的所有项目的作用
3. specific项目类型，运行指定的project项目作业

### Gitlab Runner的状态

1. locked，锁定状态，无法运行项目作业
2. paused，暂停状态，暂时不会接收新的作业

### 安装 Gitlab Runner

官方文档：<https://docs.gitlab.com/runner/install/>

### 注册 Gitlab Runner

当目标机器或者容器安装Gitlab Runner后，就需要将Gitlab Runner注册到Gitlab CI中，这样CI才可以在构建作业时使用目标Runner。

注册的步骤：

1. 从Gitlab CI获取Runner Token
2. Runner使用Token注册到Gitlab CI
