Jenkins + gitlab 持续集成和持续部署的学习笔记
1. Jenkins 介绍
软件开发生命周期(SLDC, Software Development Life Cycle):它集合了计划、开发、测试、部署的集合。

软件开发瀑布模型

软件的敏捷开发

1.1 持续集成
持续集成 (Continuous integration 简称 CI): 指的是频繁的将代码集成到主干。
持续集成的流程: 提交、测试、构建、测试、部署、回滚

1.2 Jenkins 介绍
Jenkins 是一款流行的开源持续集成 (Continuous Integration) 工具,广泛用于项目开发,具有自动化构建、测试、部署等功能。
Jenkins 特点:
- 开源的 Java 语言开发持续集成工具,支持持续集成、持续部署。
- 易于安装部署
- 消息通知、测试报告
- 分布式构建
- 文件识别
- 丰富的插件支持
2. 持续集成环境安装
服务器规划
| 名称 | IP地址 | 安装软件 |
|---|---|---|
| 代码托管服务器 | 192.168.3.57 | Gitlab |
| 持续集成服务器 | 192.168.3.58 | Jenkins、jdk、maven、Git |
| 应用测试服务器 | 192.168.3.0 | jdk |
2.1 Gitlab 安装
Gitlab 是一个用于仓库管理系统的开源项目,使用 Git 作为代码管理工具,并在此基础上搭建起来的 web 服务。
# 1. 安装依赖
yum -y install policycoreutils openssh-server openssh-clients postfix
# 2. 启动 ssh 服务,并设置开机启动。
systemctl start sshd & systemctl enable sshd
# 3. 启动 postfix 服务,并设置开机启动
systemctl start postfix & systemctl enable postfix
# 4. 开放 ssh、http 服务,并重新加载防火墙
firewall-cmd --add-service=ssh --permanent
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
# 5. 添加 Gitlab 镜像仓库,并安装
tee /etc/yum.repos.d/gitlab-ce.repo <<-'EOF'
[gitlab-ce]
name=Gitlab CE Repository
baseurl=https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el$releasever/
gpgcheck=0
enabled=1
EOF
# 安装 gitlab
yum makecache
# yum list gitlab-ce --showduplicates
yum install gitlab-ce
# yum install --setopt=obsoletes=0 gitlab-ce-16.0.0-ce.0.el7 -y
# 6. 修改 gitlab 配置
vim /etc/gitlab/gitlab.rb
# external_url 'http://192.168.3.57:30001'
# nginx['listen_port'] = 30001
# 7. 重载配置,启动 gitlab
gitlab-ctl reconfigure
gitlab-ctl restart
# 8. 开放端口
firewall-cmd --zone=public --add-port=30001/tcp --permanent
firewall-cmd --reload
# 启动成功后,修改管理员 root 密码,就可以登录了。
# 查看默认密码,默认密码保存 24 小时 cat /etc/gitlab/initial_root_password
# 访问 http://192.168.3.57:30001
2.2 Jenkins 安装
# 1. 安装 jdk
yum -y remove java-*
# 请选择合适的jdk 版本 https://pkg.jenkins.io/redhat-stable/
rpm -ivh jdk-17_linux-x64_bin.rpm
tee /etc/profile.d/java.sh <<-'EOF'
JAVA_HOME=/usr/java/jdk-17/
CLASSPATH=%JAVA_HOME%/lib:%JAVA_HOME%/jre/lib
PATH=$PATH:$JAVA_HOME/bin:$JAVA_HOME/jre/bin
export PATH CLASSPATH JAVA_HOME
EOF
source /etc/profile.d/java.sh
# 2. 测试 jdk 是否安装成功
java -version
# 3. 获取 Jenkins 安装包
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key
yum install fontconfig -y
# yum list jenkins --showduplicates
yum install jenkins -y
# 最新的支持 jdk 8 的 Jenkins 版本 2.346
# yum install --setopt=obsoletes=0 jenkins-2.346.3-1.1 -y
# 4. 指定 root 用户运行 Jenkins,后面持续部署需要用到 root 权限去执行脚本
vim /usr/lib/systemd/system/jenkins.service
#User=root
#Group=root
# 5. 启动 Jenkins
systemctl daemon-reload
systemctl start jenkins
# 6. 开放端口
firewall-cmd --zone=public --add-port=8080/tcp --permanent
firewall-cmd --reload
# 启动成功后,修改管理员 root 密码,就可以登录了。
# 查看默认密码, cat /var/lib/jenkins/secrets/initialAdminPassword
# 访问 192.168.3.58:8080
2.3 Jenkins 插件安装
# jenkins 菜单切换到 Manage Jenkins > Plugins > Available plugins
cd /var/lib/jenkins/updates/
sed -i 's#updates.jenkins.io/download/plugins#mirrors.tuna.tsinghua.edu.cn/jenkins/plugins#g' default.json && sudo sed -i 's#www.google.com#www.baidu.com#g' default.json
# jenkins 菜单切换到 Manage Jenkins > Plugins > Advanced settings
# https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json 替换 https://updates.jenkins.io/update-center.json
# 提交保存
# 重启 Jenkins,浏览器访问 http://192.168.3.58:8080/restart# 重启好之后,安装插件 Localization: Chinese (Simplified)、git、Credentials Binding Plugin、Role-based Authorization Strategy
# 配置 jdk、maven
# 配置 Jebnkins 系统环境变量 JAVA_HOME、M2_HOME、PATH+EXTRA
# PATH+EXTRA 的值配 $M2_HOME/bin
3. Jenkins 构建 maven 项目
Jenkins 自动构建项目的类型:
- 自由风格软件项目 (freeStyle Project)
- maven 项目 (Maven Project)
- 流水线项目 (Pipeline Project) (推荐使用这种,自由灵活)
安装插件 Deploy to container 用于部署 war/ear 包
安装插件 maven integration 用于 maven 项目的构建
3.1 Pipeline 流水线项目构建
Pipeline 简单来说,就是一套运行在 jenkins 上的工作流框架,将原来独立运行于单个或者多个节点的任务连接起来,实现单个任务难以完成的复杂流程编排和可视化的工作。
安装插件 Pipeline、Pipeline: Stage View、 用于构建 Pipeline 流水线项目
如何创建 Jenkins Pipeline 呢?
- Pipeline 脚本是由 Groovy 语言实现的,
- Pipeline 支持两种语法,Declarative(声明式的) 和 Script Pipeline (脚本式语法)
- Pipeline 有两种创建方法,可以直接在 jenkins 的 web ui 种创建脚本,也可以创建一个 Jenkinsfile 脚本放入源码中
可以利用 Jenkins 片段生成器生成脚本 http://192.168.3.58:8080/job/spring-cloud-alibaba-study-pipeline/pipeline-syntax/
Jenkinsfile 示例
pipeline {agent anystages {stage('pull') {steps {checkout scmGit(branches: [[name: '*/main']], extensions: [], userRemoteConfigs: [[credentialsId: 'gitlab-auth-ssh', url: 'git@192.168.3.57:springcloud/spring-cloud-alibaba-study.git']])}}stage('build') {steps {sh 'mvn clean package'}}stage('deploy') {steps {echo 'deploy code'}}}
}
常用内置构建触发器
- 触发远程构建
- 其他工程构建后触发(Build after other projects are build)
- 定时构建(build periodically)
- 轮询SCM (Poll SCM)
git hook 自动触发构建:需要安装两个插件 Gitlab hook、Gitlab(新版本只需要安装Gitlab插件)
安装插件 Email Extension、Email Extension Template 用于发送构建结果
4. 附录
4.1 生成公钥和私钥
使用 ssh-keygen 生成公钥和私钥,用于免密操作。
# 生成 公钥和私钥,公钥配置在 gitlab, 私钥配置在 jenkins
ssh-keygen -t rsa
4.2 maven 安装
# maven 安装
wget -c https://dlcdn.apache.org/maven/maven-3/3.9.6/binaries/apache-maven-3.9.6-bin.zip
# 配置 maven 环境变量
tee /etc/profile.d/maven.sh <<-'EOF'
export MAVEN_HOME=/usr/maven/apache-maven-3.9.6
export PATH=$PATH:$MAVEN_HOME/bin
EOF
# 刷新环境变量,使之生效
source /etc/profile.d/maven.sh
# 改 maven 的本地仓库位置、加速镜像源
vim /usr/maven/apache-maven-3.9.6/conf/settings.xml
#<localRepository>/root/data/mvnRepo</localRepository>
#<mirror>
# <id>nexus-aliyun</id>
# <mirrorOf>central</mirrorOf>
# <name>Nexus aliyun</name>
# <url>http://maven.aliyun.com/nexus/content/groups/public</url>
#</mirror>
参考文献
Gitlab官网
Jenkins官网
groovy教程
SonarQube官网
maven官网
openJDK官网
Oracle JDK官网
相关文章:
Jenkins + gitlab 持续集成和持续部署的学习笔记
1. Jenkins 介绍 软件开发生命周期(SLDC, Software Development Life Cycle):它集合了计划、开发、测试、部署的集合。 软件开发瀑布模型 软件的敏捷开发 1.1 持续集成 持续集成 (Continuous integration 简称 CI): 指的是频繁的将代码集成到主干。 持续集成的流…...
R语言【cli】——通过cli_abort用 cli 格式的内容显示错误、警告或信息,内部调用cli_bullets和inline-makeup
cli_abort(message,...,call .envir,.envir parent.frame(),.frame .envir ) 先从那些不需要下大力气理解的参数入手: 参数【.envir】:进行万能表达式编译的环境。 参数【.frame】:抛出上下文。默认用于参数【.trace_bottom】ÿ…...
cka从入门到放弃
无数次想放弃,最后选择了坚持 监控pod日志 监控名为 foobar 的 Pod 的日志,并过滤出具有 unable-access-website 信息的行,然后将 写入到 /opt/KUTR00101/foobar # 解析 监控pod的日志,使用kubectl logs pod-name kubectl logs…...
通过 jekyll 构建 github pages 博客实战笔记
jekyll 搭建教程 jekyll 搭建教程 Gem 安装 Ruby,请访问 下载地址。 Jekyll Jekyll 是一个简单且具备博客特性的静态网站生成器。 Jekyll 中文文档 极客学院中文文档 使用以下命令安装 Jekyll。 $ gem install jekyll在中国可能需要使用代理软件。然后ÿ…...
【AI美图】第09期效果图,AI人工智能汽车+摩托车系列图集
期待中的未来AI汽车 欢迎来到未来的世界,一个充满创新和无限可能的世界,这里有你从未见过的科技奇迹——AI汽车。 想象一下,你站在十字路口,繁忙的交通信号灯在你的视线中闪烁,汽车如潮水般涌来,但是&…...
网线的制作集线器交换机路由器的配置--含思维导图
🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《产品经理如何画泳道图&流程图》 ⛺️ 越努力 ,越幸运 一、网线的制作 1、网线的材料有哪些? 网线 网线是一种用于传输数据信号的电缆,广泛应…...
LLM微调(四)| 微调Llama 2实现Text-to-SQL,并使用LlamaIndex在数据库上进行推理
Llama 2是开源LLM发展的一个巨大里程碑。最大模型及其经过微调的变体位居Hugging Face Open LLM排行榜(https://huggingface.co/spaces/HuggingFaceH4/open_llm_leaderboard)前列。多个基准测试表明,就性能而言,它正在接近GPT-3.5…...
柔性数组(结构体成员)
目录 前言: 柔性数组: 给柔性数组分配空间: 调整柔性数组大小: 柔性数组的好处: 前言: 柔性数组?可能你从未听说,但是确实有这个概念。听名字,好像就是柔软的数…...
C#合并多个Word文档(微软官方免费openxml接口)
g /// <summary>/// 合并多个word文档(合并到第一文件)/// </summary>/// <param name"as_word_paths">word文档完整路径</param>/// <param name"breakNewPage">true(默认值),合并下一个…...
MySQL 5.7依赖的软件包和下载地址
yum install ncurses-devel openssl openssl-devel gcc gcc-c ncurses ncurses-devel bison make -y mysql下载地址 下载地址...
图论 | 网络流的基本概念
文章目录 流网路残留网络增广路径割最大流最小割定理最大流Edmonds-Karp 算法算法步骤程序代码时间复杂度 流网路 流网络: G ( V , E ) G (V, E) G(V,E) 有向图,不考虑反向边s:源点t:汇点 c ( u , v ) c(u, v) c(u,v)ÿ…...
【音视频 | AAC】AAC音频编码详解
😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C、数据结构、音视频🍭 🤣本文内容🤣&a…...
redis基本用法学习(C#调用NRedisStack操作redis)
redis官网文档中推荐C#中使用NRedisStack包连接并操作redis,本文学习C#调用NRedisStack操作redis的基本方式。 新建Winform项目,在Nuget包管理器中搜索并安装NRedisStack包,如下图所示: 主要调用StackExchange.Redis命名空间下…...
[CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]
文章目录 前言小结 原文地址:https://blog.csdn.net/qq_45752541/article/details/132854115 前言 mesh 和点是最常见的3D场景表示,因为它们是显式的,非常适合于快速的基于GPU/CUDA的栅格化。相比之下,最近的神经辐射场…...
【SpringBoot快速入门】(4)SpringBoot项目案例代码示例
目录 1 创建工程3 配置文件4 静态资源 之前我们已经学习的Spring、SpringMVC、Mabatis、Maven,详细讲解了Spring、SpringMVC、Mabatis整合SSM的方案和案例,上一节我们学习了SpringBoot的开发步骤、工程构建方法以及工程的快速启动,从这一节开…...
Linux服务器 部署飞书信息发送服务
项目介绍: 飞书信息发送服务是指将飞书信息发送服务部署到一个Linux服务器上。飞书是一款企业级的即时通讯和协作工具,支持发送消息给飞书的功能。通过部署飞书信息发送服务,可以方便内网发送信息给外网飞书。 项目代码结构展示: …...
用C#也能做机器学习?
前言✨ 说到机器学习,大家可能都不陌生,但是用C#来做机器学习,可能很多人还第一次听说。其实在C#中基于ML.NET也是可以做机器学习的,这种方式比较适合.NET程序员在项目中集成机器学习模型,不太适合专门学习机器学习&a…...
Python PDF格式转PPT格式
要将PDF文件转换为PPT,我实在python3.9 环境下转成功的,python3.11不行。 需要 pip install PyMuPDF代码说话 # -*- coding: utf-8 -*-""" author: 赫凯 software: PyCharm file: xxx.py time: 2023/12/21 11:20 """im…...
搭建知识付费平台?明理信息科技为你提供全程解决方案
明理信息科技saas知识付费平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和维护…...
漫谈UNIX、Linux、UNIX-Like
漫谈UNIX、Linux、UNIX-Like 使用了这么多年Redhat、Ubuntu等Linux、Windows、Solaris操作系统,你是否对UNIX、Unix-Like(类UNIX)还是不太清楚?我以前一直认为Unix-Like就等于Linux。其实,由UNIX派生出来而没有取得UN…...
JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...
Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
