持续集成 CI(Continuous Integration):在源代码变更后,触发自动检测、构建和测试的过程。在代码提交后,会自动进行构建和测试,并反馈结果。当结果符合预期时,再将代码集成到主干。持续集成的目标是快速确保当前变更是可用的。
持续交付 CD(Continuous Delivery):是基于持续集成基础上,将集成后的代码自动化部署到各个环境测试,确定可以发布生产版本。
持续部署 CD(Continuous Deployment):是基于持续交付的基础上,将在各个环境经过测试的应用自动化部署到生产环境。其实各个环境的发布过程都是一样的。应用发布到生产环境后,我们需要对应用进行健康检查、添加应用的监控项、 应用日志管理。
我们先来看一看没有自动化的项目开发部署的流程:
首先是开发人员完成代码开发
然后进行代码构建
构建完成后打包静态文件
将打包后的文件上传到发布服务器中,填写相关信息进行发布
我们会发现,每次的发布部署都需要重复的进行上述操作,而 CI/CD 的理念就是将这一重复性操作进行自动化处理。
如上图所示,在提交代码到 gitlab 中时,满足指定条件时,就会触发 pipeline 进行代码的自动构建、测试和发布。
gitlab-ci 的 Pipline 具体流程和操作,是在项目根目录下的 .gitlab-ci.yml 文件中配置声明的。触发 Pipline 运行之后,gitlab-runner 会根据配置的 .gitlab-ci.yml 文件进行执行,执行结果会显示在 gitlab 中。
.gitlab-ci.yml:用于定义 CI/CD 流程分为几个阶段,每个阶段需要执行哪些任务
gitlab-runner: 是 CI 的执行环境
KEYWORD | REQUIRED | DESCRIPTION |
---|---|---|
script | yes | CI/CD 过程需要执行的shell脚本 |
stage | no | 一个job流程,默认test |
variables | no | 定义变量 |
only | no | 指定当前job适用的git refs(分支、Tag)列表 |
except | no | 与only相反 |
tags | no | 通过标签管理或匹配runner |
allow_failure | no | 指定当前job是否容错,正常job失败会跳过后续job流程 |
before_script | no | 在当前job执行前执行的shell脚本 |
after_script | no | 在当前job执行后执行的shell脚本 |
when | no | 依赖的上一个job执行什么状态后执行当前job, on_success on_failure always manual 默认on_success |
dependencies | no | 指定依赖的job列表,默认顺序执行 |
active
Runner已启用,随时可以处理新作业paused
Runner已暂停,暂时不会接受新的作业
专用Runner
、 共享Runner
、 群组Runner
。Shared Runner是所有项目都可以使用的,而Specific Runner只能针对特定项目运行。
Shared Runner默认基于Docker运行,没有提前装配的执行Pipeline的环境,例如Node等。而Specific Runner你可以自由选择平台,可以是各种类型的机器,如Linux/Windows等,并在上面装配必需的运行环境,当然也可以选择Docker/Kubernetes等。
- 安装 GitLab Runner
- 在Runner设置时指定URL
- 在Runner设置时使用注册令牌
- 启动Runner
我们在 gitlab 仓库中新建一个项目用于测试
1) 拉取 gitlab-runner 镜像
docker pull gitlab/gitlab-runner:latest
2)启动 gitlab-runner
docker run -d --name gitlab-runner --restart always \ -v /var/run/docker.sock:/var/run/docker.sock \ -v /srv/gitlab-runner/config:/etc/gitlab-runner \ gitlab/gitlab-runner:latest
在进行注册前,需进入 gitlab 项目中 ——> settings ——> CI/CD ——> Runner 中获取 url 及 token。(此处配置专用 runner)
注意:gitlab 项目的 CI/CD 需要具有管理员权限才可以进行配置。
gitlab-runner register
执行命令后,会提示输入内容 url、token 描述及其他信息,我们按照实际配置即可。
[root@server ~]# gitlab-runner register
Runtime platform arch=amd64 os=linux pid=25074 revision=3001a600 version=11.10.0
Running in system-mode.
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://gitlab.com/
Please enter the gitlab-ci token for this runner:
any_hDMpZ8W4yMLwMJV1
Please enter the gitlab-ci description for this runner:
[server.hopewait]: project runner
Please enter the gitlab-ci tags for this runner (comma separated):
test-project-tag
Registering runner... succeeded runner=any_hDMp
Please enter the executor: docker, docker-ssh+machine, kubernetes, docker-ssh, parallels, shell, ssh, virtualbox, docker+machine:
docker
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
[root@server ~]#
启动成功之后,可在项目 runner 配置处看到:
一些相关命令:
gitlab-runner verify —— 检查 gitlab-runner 运行情况
gitlab-runner start —— 开启 gitlab-runner
gitlab-runner stop —— 关闭 gitlab-runner
gitlab-runner --version —— 查看 gitlab-runner 信息
我们在项目根目录下,新建文件 .gitlab-ci.yml。
image: node:latest
# 设置缓存
cache:
paths:
- build/
- node_modules/
# 定义 stages
stages:
- install
- eslint
- build
- deploy
# 定义 job:
intall:
stage: install
script:
- yarn
# 定义 job: 进行代码格式化和lint检查
eslint:
stage: eslint
script:
- yarn lint
# 定义 job:build 阶段
build:
stage: build
script:
- yarn build
- echo "build success..."
# 定义 job:部署阶段,把刚才bulid阶段生成的代码,部署到服务器上
deploy:
stage: deploy
before_script:
- eval $(ssh-agent -s)
# $SSH_PRIVATE_KEY 在 gitlab CI/CD 中配置
- echo "$SSH_PRIVATE_KEY" | ssh-add - > ~/.ssh/id_rsa
# 创建~/.ssh目录,并配置权限(非root运行的runner)
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
script:
- chmod a+x ./deploy.sh
- sh ./deploy.sh
./deploy.sh
#!/bin/bash
rsync -avz --delete dist/* [email protected]:/home/project/dist
在 CI/CD 中,我们点击 CI Lint, 可检查脚本配置是否正确。
编写完成之后,提交代码,触发 Pipline。