Gitlab CI CD


  1. Continuous Integration (CI) 持续集成
  2. Continuous Delivery (CD) 持续交付
  3. Continuous Deployment (CD) 持续部署

有几种方式,我们先看gitlab runner的方式,道理其实和github actions差不多


首先理解下runner

一个Runner可以特定于某个项目,也可以在GitLab CI中服务于任何项目。服务于所有项目的Runner称为共享Runner。

理想情况下,不应将GitLab Runner与GitLab安装在同一台机器上。

  1. Shared Runners :顾名思义,共享Runner。对于具有相似要求的作业,可以考虑用Shared Runners。你可以用一个或少量几个Runner处理多个项目,而不是让多个Runner空闲着。这样可以更轻松地维护和更新它们。Shared Runners使用公平队列处理作业,与使用FIFO队列的Specific Runners相比,这可以防止项目创建数百个作业,而导致耗尽所有可用的共享Runner资源。
  2. Specific Runners :顾名思义,对于有特殊要求的作业,可以考虑用Specific Runners。
  3. Group Runners :顾名思义,当一个小组中有多个项目,并且希望这些项目都可以访问一组job时,可以考虑用Group Runners。Group Runners也是用FIFO队列处理作业的


这里我使用runner指定了项目

gitlab runner或jenkins webhook方式实现CICD_服务器


gitlab runner或jenkins webhook方式实现CICD_java_02


gitlab runner或jenkins webhook方式实现CICD_git_03


gitlab runner或jenkins webhook方式实现CICD_java_04


可以在这下面指定到项目


1.服务器准备,10.0.0.53(gitlab服务器),10.0.0.79(gitlab runner服务器,gitlab runner类似于jenkins agent,这里当成中转的服务器),10.0.0.81(最终部署的服务器)

2.软件包

runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
gitlab https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-15.0.0-ce.0.el7.x86_64.rpm
maven https://dlcdn.apache.org/maven/maven-3/3.8.6/binaries/apache-maven-3.8.6-bin.tar.gz
jdk java version "1.8.0_181"

测试内容testproject01.tar.gz

2.1

安装不做详细步骤

10.0.0.79 安装jdk,mvn,配置好环境变量

vim /etc/profile



#jdk

export JAVA_HOME=/usr/local/java/jdk1.8.0_181

export PATH=$PATH:/usr/local/java/jdk1.8.0_181/bin

export JRE_HOME=$JAVA_HOME/jre

export CLASSPATH=./:$JAVA_HOME/lib:$JRE_HOME/lib

#mvn

export MAVEN_HOME=/opt/maven

export PATH=$MAVEN_HOME/bin:$PATH

export PATH=$PATH:/usr/local/bin

#更换yum源为阿里云

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

yum clean all && yum makecache


安装runner,runner从软件包下载下来时就是一个可执行的二进制文件,runner的版本一般要和gitlab版本一致,这个的话可以查下gitlab和runner版本对应

mv gitlab-runner-linux-amd64 gitlab-runner

chmod +x gitlab-runner && mv gitlab-runner /usr/local/bin/

useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

echo "gitlab-runner" | passwd --stdin gitlab-runner

gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner

systemctl enable gitlab-runner.service

gitlab-runner start

#有个小细节gitlab-runner在后面执行可能报权限不足,我加了和root一样的权限

grep gitlab /etc/sudoers

gitlab-runner ALL=(ALL) ALL

安装有不理解的话,可以看图


gitlab runner或jenkins webhook方式实现CICD_服务器_05



gitlab runner或jenkins webhook方式实现CICD_java_06


gitlab runner或jenkins webhook方式实现CICD_服务器_07


gitlab runner或jenkins webhook方式实现CICD_git_08



配置runner
进入项目里--seeting---cicd--Runners–Expand

下面这两个东西后面要用到

gitlab runner或jenkins webhook方式实现CICD_git_09


在所安装的runner机器上注册

gitlab-runner register

# 输入gitlab实例地址

# 输入runner的token

# 输入这个runner的描述

# 输入这个runner的标签 我这里输入是java

# 选择执行runner的方式 我选的是shell

gitlab-runner restart

搞定后这里就有个runners出来了

gitlab runner或jenkins webhook方式实现CICD_git_10




3.测试结果

10.0.0.79配置gitlab免密码登录

ssh-keygen

#生成密钥对

ll /root/.ssh/

#配置全局用户变量,后面我们会将刚才生成的公钥放到这个用户上面

git config --global user.email "463519696@qq.com"

git config --global user.name "linghuchong"

gitlab runner或jenkins webhook方式实现CICD_java_11


gitlab runner或jenkins webhook方式实现CICD_服务器_12


gitlab runner或jenkins webhook方式实现CICD_服务器_13


好了之后,gitlab新建项目

gitlab runner或jenkins webhook方式实现CICD_java_14


那么在79上可以直接通过ssh方式clone,一般来说还有http,https,ftp,ssh方式更快

gitlab runner或jenkins webhook方式实现CICD_git_15


进入项目目录后,我们把测试包里的内容拿出来放到这个里面

gitlab runner或jenkins webhook方式实现CICD_git_16



接下来我们对gitlab页面项目cicd的一些配置进行添加和修改

gitlab runner或jenkins webhook方式实现CICD_服务器_17



gitlab runner或jenkins webhook方式实现CICD_服务器_18


设置变量,这个后面流水线中的发布需要用到目标服务器远程scp的密码


gitlab runner或jenkins webhook方式实现CICD_git_19



gitlab runner或jenkins webhook方式实现CICD_服务器_20



gitlab runner或jenkins webhook方式实现CICD_git_21




在10.0.0.79上

gitlab runner或jenkins webhook方式实现CICD_git_22


然后在项目里创建.gitlab-ci.yml文件,文件内容这些

stages:

- build

- test

- deploy

# 定义安装包的存放位置,便于后续部署使用.

variables:

PACKAGE_DIR: '/home/gitlab-runner/packages/'

build-job: # This job runs in the build stage, which runs first.

stage: build

tags:

- java

only:

- main

before_script:

- if [ ! -d $PACKAGE_DIR ];then mkdir -p $PACKAGE_DIR;fi

script:

- mvn clean install -Dmaven.test.skip=true

- rm -rf $PACKAGE_DIR/*.jar

- cp -a target/*.jar $PACKAGE_DIR/



unit-test-job: # This job runs in the test stage.

stage: test # It only starts when the job in the build stage completes successfully.

tags:

- java

only:

- main

script:

- echo "Running unit tests... This will take about 30 seconds."

- sleep 30

- echo "Code coverage is 90%"


deploy-job: # This job runs in the deploy stage.

stage: deploy # It only runs when *both* jobs in the test stage complete successfully.

tags:

- java

only:

- main

script:

- echo "Deploying application..."

- sshpass -p $PUBLISHPASSWORD /usr/bin/scp -P 59878 -o StrictHostKeyChecking=no -r -p $PACKAGE_DIR/*.jar root@10.0.0.81:/data/game/server/

- echo "Application successfully deployed."


上面yml内容你可以到下面这个地方去验证

gitlab runner或jenkins webhook方式实现CICD_git_23


gitlab runner或jenkins webhook方式实现CICD_git_24


gitlab runner或jenkins webhook方式实现CICD_git_25



然后将项目推送上去

进入项目-CI/CD-Pipelines

可以看到下面触发任务

gitlab runner或jenkins webhook方式实现CICD_服务器_26



gitlab runner或jenkins webhook方式实现CICD_服务器_27



gitlab runner或jenkins webhook方式实现CICD_git_28


gitlab runner或jenkins webhook方式实现CICD_git_29



登陆10.0.0.81那台服务器

gitlab runner或jenkins webhook方式实现CICD_服务器_30


这样就代表成功了


10.0.0.53安装gitlab,这里不做详细介绍

安装好后启动服务修改配置,重载

vim /etc/gitlab/gitlab.rb

external_url 'http://10.0.0.53/'

#保存退出

gitlab-ctl reconfigure


构建流水线任务的目录空间,10.0.0.79,这个是你前面安装runner配置的

gitlab runner或jenkins webhook方式实现CICD_git_31


gitlab runner或jenkins webhook方式实现CICD_git_32



总体感觉比较麻烦,不过对于需要构建打包的工程可以做成ci形式的,我觉得还可以吧



第二种:

jenkins webhook方式的,实现一个简单的本地提交到远程仓库后能够自动触发部署到目标服务器


1.服务器10.0.0.79(安装jenkins) ,10.0.0.53(gitlab服务器),10.0.0.81(最终部署目标服务器)

2,软件 https://pkg.jenkins.io/redhat-stable/jenkins-2.289.1-1.1.noarch.rpm

3,10.0.0.79安装jdk和jenkins,jdk上面已经安装了,我就不做演示了

rpm -ivh jenkins-2.289.1-1.1.noarch.rpm

systemctl start jenkins

systemctl status jenkins


4.10.0.0.79上进行jenkins上的配置

下载插件

gitlab runner或jenkins webhook方式实现CICD_git_33

完成后重启

gitlab runner或jenkins webhook方式实现CICD_java_34



新建一个构建任务

gitlab runner或jenkins webhook方式实现CICD_服务器_35



因为我10.0.0.79上编译安装高版本的git命令(不这样的话后面会报错)所以

全局变量配置这里改下

gitlab runner或jenkins webhook方式实现CICD_git_36



jenkins构建任务配置

先设置代码的git下载路径,这里通过http方式

gitlab runner或jenkins webhook方式实现CICD_服务器_37


查看jenkin生成回调地址。在任务重构建触发器下获取回调URL。下面的URL那一行只有Gitlab 插件下载成功后才能显示。

gitlab runner或jenkins webhook方式实现CICD_git_38



生成token,后面给gitlab用,点高级

gitlab runner或jenkins webhook方式实现CICD_git_39


点Generate

gitlab runner或jenkins webhook方式实现CICD_git_40



然后设置代码发布的推送脚本

#!/bin/bash

SOURCE_DIR=/var/lib/jenkins/workspace/${JOB_NAME}/*

DEST_DIR=/data/game/server/

REMOTE_IP=10.0.0.81

sshpass -p 1234 /usr/bin/scp -P 59878 -o StrictHostKeyChecking=no -r -p $SOURCE_DIR root@$REMOTE_IP:$DEST_DIR


gitlab runner或jenkins webhook方式实现CICD_服务器_41



2)接下来在gitlab上操作

进到项目里来

gitlab runner或jenkins webhook方式实现CICD_服务器_42



进入webhooks配置

gitlab runner或jenkins webhook方式实现CICD_服务器_43



填入回调地址和刚才jenkins上生成的token

gitlab runner或jenkins webhook方式实现CICD_java_44



测试下

gitlab runner或jenkins webhook方式实现CICD_服务器_45



测试下自动发布


gitlab runner或jenkins webhook方式实现CICD_服务器_46


gitlab runner或jenkins webhook方式实现CICD_服务器_47



自动触发构建任务

gitlab runner或jenkins webhook方式实现CICD_java_48


登陆10.0.0.81服务器上


gitlab runner或jenkins webhook方式实现CICD_java_49


成功发布


结语:上面我在jenkins上配置的源码仓库的时候已经指定分支了

gitlab runner或jenkins webhook方式实现CICD_git_50

为main


main分支就是稳定发版分支,平时协作开发可切其他分支提交测试不影响,

稳定版本main分支最终提交后可以自动发布,这样可以避免你提交错误代码时自动发布出去而无法补救的尴尬