使用 GitLab + Jenkins 实现持续集成(CI)环境
本文为转载文章+自己新添的内容;
转载链接:https://blog.csdn.net/weixin_46902396/article/details/118337250
一、持续集成简介
持续集成:Continuous Integration
- 简单来说就是指,程序员在开发代码的过程中,可以频繁的将代码部署到主干上,并进行自动化测试。
持续交付:Continuous Delivery
- 简单来说就是指在持续集成的基础上,将代码部署到预生产环境。
持续部署:Continuous Deoloyment
- 简单来说就是指在持续交付的基础上,将要部署的代码实现自动部署,包括持续交互,持续部署。
1.GitLab 简介
GitLab 是一个用于仓库管理系统的开源项目。使用 Git 作为代码管理工具,可以通过 Web 界面来管理 Git 仓库。
2.Jenkins 简介
Jenkins 是一个独立的开源软件项目,是基于 Java 开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
作用:
- 保证团队开发人员提交代码的质量,还能够减轻软件发布时的压力;
- 持续集成中的任何一个环节都是自动完成的,无需太多人工干预,有利于减少重复过程以节省时间、费用和工作量。
Jenkins 特点:
- 开源免费;
- 跨平台,支持所有的平台。
- Master/Slave 支持分布式的 build(构建)
3.GitLab 和 GitHub 的区别
相同点:
- 二者都是基于 Web 的 Git 仓库,在很大程度上 GitLab 是仿照 GitHub 来做的,它们都提供了分享开源项目的平台。
不同点:
- GitHub 如果要使用私有仓库,超过 4 个是需要付费的。GitLab 可以在上面创建私人的免费仓库。
- GitLab 让开发团队对他们的代码仓库拥有更多的控制。
4.持续集成系统的工作流程
- 开发者将新版本代码 push 到 GitLab 远程仓库上;
- 随后 GitLab 会触发 Jenkins 来进行拉取到本地(通过 Web Hook 或定时检测)
- 最后 Jenkins 会根据事先配置好的脚本进行 Build。
二、使用 GitLab + Jenkins 实现持续集成(CI)环境
准备工作
主机名 | 软件版本 | 操作系统 | 联网状态 | IP地址(转载---实验) |
GitLab | gitlab-ce-12.0.2 | Centos7.9 | 双网卡(内+外) | 192.168.1.1---192.168.24.134 |
Jenkins | jenkins-2.322.war | Centos7.9 | 双网卡(内+外) | 192.168.1.2---192.168.24.132 |
Apache | Centos7.9 | 双网卡(内+外) | 192.168.1.3---192.168.24.135 |
关闭防火墙和selinux
1.安装GitLab
安装 Gitlab 所需组件
[root@GitLab ~]# yum install -y curl policycoreutils openssh-server openssh-clients postfix policycoreutils-python
开启Postfix邮件服务
[root@GitLab ~]# systemctl start postfix
[root@GitLab ~]# systemctl enable postfix
安装GitLab
[root@GitLab ~]# wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm [root@GitLab ~]# ls anaconda-ks.cfg gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm [root@GitLab ~]# yum -y localinstall gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm
配置GitLab访问地址
[root@GitLab ~]# vim /etc/gitlab/gitlab.rb
external_url 'http://gitlab.example.com' 替换为 external_url 'http://192.168.24.135'
注意:
1.可以将IP地址替换为域名
2.该机器上最好不要配置关于其他服务,gitlab启用会自带许多服务,其中自带nginx占用80,也有服务占用8080等端口。
3.只修改如上配置的话,启动后,默认80端口可访问gitlab。
重置gitlab(时间较长)
[root@GitLab ~]# gitlab-ctl reconfigure [root@GitLab ~]# netstat -anpt | grep nginx
2.Gitlab页面操作:
1)登录Gitlab,访问http://192.168.24.135
可以将英文转换为中文
- 注意:在 GitLab 中配置的中文并不是全部都是中文,可以安装中文插件。
- 汉化链接:https://www.cnblogs.com/yinzhengjie2020/p/12490399.html
2)配置邮件报警
[root@GitLab ~]# vim /etc/gitlab/gitlab.rb # 在第 57 行后添加以下内容 gitlab_rails['smtp_enable'] = true gitlab_rails['smtp_address'] = 'smtp.qq.com' # SMTP 服务器 gitlab_rails['smtp_port'] = 465 # SMTP 服务器端口号 gitlab_rails['smtp_user_name'] = '3240421650@qq.com' # 邮件账号 gitlab_rails['smtp_password'] = '' # 邮件授权码(不是登录密码,是开启POP/SMTP时给与的授权码) gitlab_rails['smtp_authentication'] = 'login' gitlab_rails['smtp_enable_starttls_auto'] = true gitlab_rails['smtp_tls'] = true gitlab_rails['gitlab_email_from'] = '3240421650@qq.com'
重置 Gitlab
[root@GitLab ~]# gitlab-ctl reconfigure
登录控制台发送测试邮件
[root@GitLab ~]# gitlab-rails console irb(main):001:0> Notify.test_email('wangyi_yx001@163.com','Test','Hello ZhangSan').deliver_now
然后查看发送结果,并到接收人邮箱中查看邮件是否可以正常接收到。
修改GitLab中root用户的邮件地址,方便接收报警。
3)创建群组
点击创建群组
填写群组信息
创建一个账号
填写用户信息
给河北彭于晏配置密码
把新用户添加到群组
GitLab 用户在组中有五种权限:
- Guest:可以创建问题、发表评论、不能读写版本库(访客)
- Reporter:可以克隆代码,不能提交(测试人员)
- Deveoper:可以克隆代码、开发、提交、上传(开发人员)
- Master:可以创建项目、添加 tag、保护分支、添加项目成员、编辑项目(运维)
- Owner:所有事情都可以做,包括设置项目的访问权限(老板,但老板一般都在办公室)
4)创建项目
使用河北彭于晏用户登录创建
创建项目
在刚才创建的项目中创建文件
5)配置免密克隆
[root@GitLab ~]# ssh-keygen -t rsa # 配置密钥对 (三连回车即可) [root@GitLab ~]# cat .ssh/id_rsa.pub # 查看公钥
将公钥上传到 GitLab 中
验证(克隆过程中不需要输入密码即可)
即在本机,可以通过git命令,将gitlab中的项目,克隆到本地。
[root@GitLab ~]# git clone git@192.168.1.1:ZhangSan/test.git [root@GitLab ~]# ls anaconda-ks.cfg gitlab-ce-12.0.2-ce.0.el7.x86_64.rpm test [root@GitLab ~]# cd test/ [root@GitLab test]# ls 1.html
3.安装Jenkins
安装 JDK(因为 Jenkins 是使用 Java 编写的,所以需要先安装 JDK)
[root@Jenkins ~]# tar xf jdk-8u181-linux-x64.tar.gz [root@Jenkins ~]# ls anaconda-ks.cfg jdk1.8.0_181 jdk-8u181-linux-x64.tar.gz [root@Jenkins ~]# mv jdk1.8.0_181/ /usr/local/java
[root@Jenkins ~]# cat <<END >> /etc/profile
JAVA_HOME=/usr/local/java/
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
END
[root@Jenkins ~]# source /etc/profile
[root@Jenkins ~]# java -version # 查看 Java 版本
java version "1.8.0_181"
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)
安装Jenkins
[root@Jenkins opt]# rz [root@Jenkins opt]# ls jenkins-2.322.war [root@Jenkins opt]# mv jenkins-2.322.war jenkins.war [root@Jenkins opt]#nohup java -jar jenkins.war >/tmp/jenkins.out 2>&1 &
注意:
1.JenKins启动,默认是8080端口。
2.war包启动后,Jenkins默认的工作目录为:~/.jenkins/
3.Jenkins存放Item任务的默认目录为:~/.jeninks/workspace/
检查,如图
3.1)登录Jenkins,并安装相关插件
访问:http://192.168.1.2:8080
点击继续后,会出现推荐安装和自定义安装,我这里选择的是推荐安装(这里可能用到加速,可观看链接)
Jenkins插件加速安装链接:Jenkins(一):Java环境+Jenkins环境安装 - 浮~生 - 博客园 (cnblogs.com)
3.2)配置Jenkins实现GitLab更新代码
安装Jenkins插件,位置:系统管理----》插件管理
相关插件如下:
Credentials # 签名证书管理插件
Gitlab # 安装后从 GitLab 获取代码
Git 和 Git Client # 用于 Jenkins 在 GitLab 中拉取源码
GitLab Hook # GitLab 触发 Jenkins 构建项目
Gitlab Authentication # GitLab 和 Jenkins 认证插件
SSH Plugin # 进程执行 Shell 脚本
Publish Over SSH # 用于通过 SSH 部署应用
- 注意:当安装好 Jenkins 插件后,插件可能会跟 Jenkins 出现版本差异,不用管,后面我会对 Jenkins 进行升级操作。
配置 Jenkins 免密拉取 GitLab 代码
[root@Jenkins ~]# ssh-keygen -t rsa [root@Jenkins ~]# cat .ssh/id_rsa.pub
将公钥上传到 GitLab 上
将私钥上传到 Jenkins 上
- Jenkins 的
root
用户公钥在 GitLab 上,私钥在 Jenkins 上,目的就是为了方便 Jenkins 可以直接拉去 GitLab 上的代码。
3.3)在 Jenkins 上创建项目
下载一下代码
3.4)将代码发布到Web服务器
这边简单说一下大致的流程:
- 通过我们这一系列的操作也可以看出来,首先需要在 GitLab 上创建(上传)项目,然后 Jenkins 会将代码下载到本地;
- 最后可以使用 Jenkins 将代码发送给指定服务器。
在 192.168.1.3
服务器上操作,下载httpd服务
[root@Apache ~]# yum -y install httpd [root@Apache ~]# systemctl start httpd
在Jenkins上配置SSH免密登录
[root@Jenkins ~]# ssh-copy-id root@192.168.1.3
创建自动上传 Web 代码的脚本
[root@Jenkins ~]# cat <<END > /root/1.sh #!/bin/bash scp /root/.jenkins/workspace/web/* root@192.168.1.3:/var/www/html/ END [root@Jenkins ~]# chmod +x 1.sh
将脚本添加到 Jenkins 中
发布项目
3.5)验证:
4.实现Jenkins自动部署
4.1)安装插件
Gitlab Hook Plugin
Build Authorization Token Root
Build Token Trigger
4.2)配置身份验证令牌
[root@Jenkins ~]# openssl rand -hex 12 038ef13e10ef686193784383
这个令牌不是唯一,只是需要要确保Jenkins和Gitlab上的配置一致。
- 注意:
-hex
输出结果为 16 进制数据,数字 12 是指定生成的随机字符为 12 字节,即 24 个 16 进制个数。
4.3)在Jenkins上配置触发器
4.4)在GitLab项目部署界面设置链接和Token(即身份验证令牌值)。
网址格式:http://jenkins地址/buildByToken/build?job=jenkins项目名&token=token值
其中,web为Jenkins的项目名,后面的Token值为上面的身份验证令牌值。
- 注意:当创建钩子时出现
Urlis blocked: Requests to the local network are not allowed
- 原因是因为 GitLab 10.6 版本以后为了安全,不允许向本地网络发送 WebHook 请求。
开启请求,需要管理员账号开启。
- 当开启请求后,再使用该项目的用户重新设置链接和Token 值即可。
4.5)验证
5.Jenkins版本升级
下载后之后,我们只需要将 Jenkins 原有的包替换即可
[root@Jenkins ~]# rpm -ql jenkins # 查看 Jenkins 包安装路径 [root@Jenkins ~]# systemctl stop jenkins [root@Jenkins ~]# cd /usr/lib/jenkins/ [root@Jenkins jenkins]# mv jenkins.war jenkins-2.222.4.war.bak [root@Jenkins jenkins]# ls jenkins-2.222.4.war.bak jenkins.war [root@Jenkins jenkins]# systemctl start jenkins
查看
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统