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…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...
【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
面试高频问题
文章目录 🚀 消息队列核心技术揭秘:从入门到秒杀面试官1️⃣ Kafka为何能"吞云吐雾"?性能背后的秘密1.1 顺序写入与零拷贝:性能的双引擎1.2 分区并行:数据的"八车道高速公路"1.3 页缓存与批量处理…...
多元隐函数 偏导公式
我们来推导隐函数 z z ( x , y ) z z(x, y) zz(x,y) 的偏导公式,给定一个隐函数关系: F ( x , y , z ( x , y ) ) 0 F(x, y, z(x, y)) 0 F(x,y,z(x,y))0 🧠 目标: 求 ∂ z ∂ x \frac{\partial z}{\partial x} ∂x∂z、 …...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
简单介绍C++中 string与wstring
在C中,string和wstring是两种用于处理不同字符编码的字符串类型,分别基于char和wchar_t字符类型。以下是它们的详细说明和对比: 1. 基础定义 string 类型:std::string 字符类型:char(通常为8位)…...
