J'Blog

Gitlab实现CICD方案

Gitlab实现CICD方案

方案介绍

新版本的gitlab已经集成了CI/CD,可以通过配置,实现在推送代码到仓库,合并分支,创建tag等时机时来触发整个流程。我们一般可以将整个项目流程大致可以分为:

代码拉取 -> 构建(编译)-> 执行自动化测试 -> 部署到服务器 -> 重启服务

实现步骤

需要提供一台构建服务器,代码拉取,构建,自动化测试,部署到目标服务器,重启服务都是在构建服务器上门完成。

微信图片_20220120095033.png

需要在在构建服务器上安装git和gitlab-runner两个应用,git负责从仓库拉取最新的代码,gitlab-runner负责和gitlab 的cicd服务进行通信,触发对应的操作。

gitlab-runner需要进行配置后才可与gitlab通信,安装及配置流程如下:

安装gitlab-runner

>wget -O /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
>chmod +x /usr/local/bin/gitlab-runner
>useradd --comment 'GitLab Runner'--create-home gitlab-runner --shell /bin/bash
>gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
>gitlab-runner start

注册gitlab-runner

注册gitlab-runner与gitlab的连接,在gitlab的对应的项目设置菜单中找到CI/CD,展开Runner,找到Specific runners,找到如下图:

图片2.png

在部署服务器上执行

>gitlab-runner register

Enter the GitLab instance URL (for example, https://gitlab.com/):
输入上图显示的URL
Enter the registration token:
输入上图显示的token
Enter a description for the runner:
[stepping-machine]: 
输入当前gitlab-runner的描述
Enter tags for the runner (comma-separated):
输入当前grunner的名称
Registering runner... succeeded                     runner=e1sRrUZi
Enter an executor: docker-ssh, parallels, ssh, virtualbox, docker+machine, kubernetes, custom, docker, shell, docker-ssh+machine:
暂时输入shell
Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

执行完上述命令后,回到gitlab项目的runner配置页面,下面显示可用的指定Runner,表示已经配置成功,即完成项目对应的runner配置。

配置项目,.gitlab.yml文件结构

要启用项目的cicd,还需要在项目的根目录添加.gitlab.yml文件,

一旦你已经添加了.gitlab-ci.yml到仓库中,GitLab将检测到该文件,并使用名为GitLab Runner的工具运行你的脚本,文件的结构如下图所示:

微信图片_20220120101329.png

stages 节表示整个流水线的步骤,例如上图分为4个步骤

build_test(构建测试环境项目)

deploy_test (部署到测试环境)

build_test(构建生产环境项目)

deploy_test (部署到生产环境)

cache 节表示缓存内容,可以不设置

variables 节表示设置的变量,可以在执行脚本时动态传入

build_test_job 节表示具体执行的步骤信息,改名称可以随意指定,具体的配置如下

-stage 对应的步骤名称,在stages节中

-script 需要执行的脚本,在此处设置要执行的shell命令

-only 触发此步骤的分支

-tags 执行的runner名称,输入上面注册的runner名称

-artifacts 生成的附件,此处可以不配置

经过上述配置后就完成了整个cicd相关的配置了,另外为了方便部署及执行远程命令,需要配置构建服务器到应用服务器的免密登录(公钥登录)

我用的是xshell,通过xshell创建本地公钥,将本地拷贝的公钥放入服务器~/.ssh/authorized_keys文件内,重启ssh即可: service ssh restart

根据以上配置,在推送代码到develop分支的时候,会触发build_test和deploy_test两个步骤,会在构建服务器上面调用对应的构建脚本build.sh和部署脚本deploy_webpack.sh

gitlab做的事情就是把gitlab上的代码拷贝到构建服务器上,所以脚本需要做的是打包,将静态资源包拷贝到目标服务器上。

build.sh 安装依赖包打包静态资源文件

微信图片_20220120103745.png

deploy_webpack.sh 将打包文件传送到目标服务器中

微信图片_20220120110939.png

实现细节

配置文件的维护

可将配置文件模板放置于构建服务器,在部署时同步推送内容覆盖服务器的配置文件进行覆盖即可。

关于敏感变量如秘钥,用户名密码等,可以托管在gitlab平台,然后在.gitlab-ci.yml文件中通过变量名获取值在传递给shell进行处理。

在项目中点击设置->CI/CD 找到变量,展开即可设置变量,如下图

图片3.png

构建环境的安装

为了完成项目的构建和编译,需要安装各种环境,比如前端构建需要安装nodejs环境

ci/cd运行情况监测

流程将会以一些列流水线的形式运行,在项目菜单CI/CD菜单中可以检测运行情况,点击流水线,可以看到整体的每一条流水线的运行情况。

回滚方案

需要在.gitlab-ci.yml对应的阶段作业配置下面配置了environment变量