1. 概述
Gitlab 是常用的开源 git 代码管理工具之一, 随着发展也推出了 ci/cd 解决方案. 顾名思义具体来说 ci/cd 主要完成以下两个工作.
ci(持续构建)
代码提交后触发自动化的单元测试, 代码预编译, 构建镜像, 上传镜像等.
cd(持续发布)
持续发布则指将构建好的程序发布到各种环境, 如预发布环境, 正式环境.
2. 特性
gitlab ci/cd 具有以下特性
跨平台支持
只要支持 go 语言的平台均可以在上面进行 ci, 目前基本涵盖了大部分的操作系统.
多语言支持
构建时是通过脚本触发, 因此基本上支持所有的语言.
Pipeline
可以通过不同的阶段形成工作流
支持 docker
可以构建 docker 镜像, 同时也支持触发在 Kubernetes 允许.
所有特性具体见: 链接 https://about.gitlab.com/features/gitlab-ci-cd/
3. 结构
gitlab ci/cd 是由独立的 runner 程序完成, runner 采用 go 语言编写, 因此可以很好的进行跨平台, 通常可以将 runner 部署到任何 gitlab server 之外的服务器, 从而避免对 gitlab server 的影响.
runner 项目见: 链接 https://gitlab.com/gitlab-org/gitlab-runner
4.gitlab ci/cd 流程
gitlab 通过在项目的根目录放置. gitlab-ci.yml 文件来触发 pipline, 文件书写遵循 yml 语法, 因此, 概括来说 gitlab ci/cd 只需要两步,
写好. gitlab-ci.yml 文件, 并放置到项目根目录
配置好 gitlab runner. 完成后, 提交代码时会自动根据 gitlab-ci.yml 的触发条件进行执行相应的 stage.
4.1 gitlab-ci.yml 文件
- stages:
- - test
- - build
- - deploy
- test:
- stage: test
- script: echo "Running tests"
- only:
- - tags
- build:
- stage: build
- script: echo "Building the app"
- only:
- - tags
- deploy_staging:
- stage: deploy
- script:
- - echo "Deploy to staging server"
- environment:
- name: staging
- url: https://staging.example.com
- only:
- - tags
- deploy_prod:
- stage: deploy
- script:
- - echo "Deploy to production server"
- environment:
- name: production
- url: https://example.com
- when: manual
- only:
- - tags
如上, 是一个具有 ci/cd 功能的. gitlab-ci.yml 文件的写法,
.gitlab-ci.yml 的具体写法, 以及关键字含义见: 链接 https://docs.gitlab.com/ee/ci/yaml/README.html
关于 gitlab 为什么使用. gitlab-ci.yml, 见: 链接 https://about.gitlab.com/2015/05/06/why-were-replacing-gitlab-ci-jobs-with-gitlab-ci-dot-yml/
4.2 runner 配置
runner 配置主要分为三步:
首先安装 runner 安装脚本, 具体见:
/C 链接 https://docs.gitlab.com/runner/#install-gitlab-runner
然后注册 runner 到 gitlab
链接 https://docs.gitlab.com/runner/#register-gitlab-runner
更多配置见
链接 https://docs.gitlab.com/runner/executors/README.html
5. 总结
总的来说, gitlab-ci 基本上可以完成完整的构建及发布, 但也会存在一些缺点:
1. 发布部分, 需要将程序部署到哪个服务器固化到. gitlab-ci 文件中, 另外, 如果 runner 上直接进行部署, 那么 runner 所在的机器则需要直接或间接的访问所有的发布的机器, 这里存在一定安全问题.
2. 程序发布没有审计, 对于小公司来说, 这问题可能不突出, 但是当研发团队扩大, 以及公司业务增加之后, 对于发布过程的权限管理以及审计则显得很重要.
来源: https://juejin.im/post/5adb655c518825673123c8ea