Gitlab CI CD
- Continuous Integration (CI) 持续集成
- Continuous Delivery (CD) 持续交付
- Continuous Deployment (CD) 持续部署
有几种方式,我们先看gitlab runner的方式,道理其实和github actions差不多
首先理解下runner
一个Runner可以特定于某个项目,也可以在GitLab CI中服务于任何项目。服务于所有项目的Runner称为共享Runner。
理想情况下,不应将GitLab Runner与GitLab安装在同一台机器上。
- Shared Runners :顾名思义,共享Runner。对于具有相似要求的作业,可以考虑用Shared Runners。你可以用一个或少量几个Runner处理多个项目,而不是让多个Runner空闲着。这样可以更轻松地维护和更新它们。Shared Runners使用公平队列处理作业,与使用FIFO队列的Specific Runners相比,这可以防止项目创建数百个作业,而导致耗尽所有可用的共享Runner资源。
- Specific Runners :顾名思义,对于有特殊要求的作业,可以考虑用Specific Runners。
- Group Runners :顾名思义,当一个小组中有多个项目,并且希望这些项目都可以访问一组job时,可以考虑用Group Runners。Group Runners也是用FIFO队列处理作业的
这里我使用runner指定了项目
可以在这下面指定到项目
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
安装有不理解的话,可以看图
配置runner
进入项目里--seeting---cicd--Runners–Expand
下面这两个东西后面要用到
在所安装的runner机器上注册
gitlab-runner register
# 输入gitlab实例地址
# 输入runner的token
# 输入这个runner的描述
# 输入这个runner的标签 我这里输入是java
# 选择执行runner的方式 我选的是shell
gitlab-runner restart
搞定后这里就有个runners出来了
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新建项目
那么在79上可以直接通过ssh方式clone,一般来说还有http,https,ftp,ssh方式更快
进入项目目录后,我们把测试包里的内容拿出来放到这个里面
接下来我们对gitlab页面项目cicd的一些配置进行添加和修改
设置变量,这个后面流水线中的发布需要用到目标服务器远程scp的密码
在10.0.0.79上
然后在项目里创建.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内容你可以到下面这个地方去验证
然后将项目推送上去
进入项目-CI/CD-Pipelines
可以看到下面触发任务
登陆10.0.0.81那台服务器
这样就代表成功了
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配置的
总体感觉比较麻烦,不过对于需要构建打包的工程可以做成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上的配置
下载插件
完成后重启
新建一个构建任务
因为我10.0.0.79上编译安装高版本的git命令(不这样的话后面会报错)所以
全局变量配置这里改下
jenkins构建任务配置
先设置代码的git下载路径,这里通过http方式
查看jenkin生成回调地址。在任务重构建触发器下获取回调URL。下面的URL那一行只有Gitlab 插件下载成功后才能显示。
生成token,后面给gitlab用,点高级
点Generate
然后设置代码发布的推送脚本
#!/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
2)接下来在gitlab上操作
进到项目里来
进入webhooks配置
填入回调地址和刚才jenkins上生成的token
测试下
测试下自动发布
自动触发构建任务
登陆10.0.0.81服务器上
成功发布
结语:上面我在jenkins上配置的源码仓库的时候已经指定分支了
为main
main分支就是稳定发版分支,平时协作开发可切其他分支提交测试不影响,
稳定版本main分支最终提交后可以自动发布,这样可以避免你提交错误代码时自动发布出去而无法补救的尴尬