文章目录
- 第1部:DevOps概念
- CICD持续性交付集成
-
- 配置环境介绍
- Windows系统开发环境
- GitLab服务
- 源码上传到Gitlab仓库
- Jenkins服务
-
- Jenkins预备环境
- maven部署
- docker部署
- Jenkins部署
-
- git-parameter插件
- jdk和maven设置
- [Publish over SSH插件](#Publish over SSH插件)
- 第1次构建-拉取gitlab项目
- 第2次构建-编译jar包
- 第3次构建-推送jar至目标服务器
- 第4次构建-拉取docker文件
- 第5次构建-目标服务器项目运行
- 虚悬镜像(none)镜像处理镜像处理)
- 参数化构建
第1部:DevOps概念
软件开发生命周期
软件开发生命周期又叫做SDLC(Software Development Life Cycle),它是集合了计划、开发、测试 和部署过程的集合。如下图所示 :

需求分析
这是生命周期的第一阶段,根据项目需求,团队执行一个可行性计划的分析。项目需求可能是公司内部 或者客户提出的。这阶段主要是对信息的收集,也有可能是对现有项目的改善和重新做一个新的项目。 还要分析项目的预算多长,可以从哪方面受益及布局,这也是项目创建的目标。
设计
第二阶段就是设计阶段,系统架构和满意状态(就是要做成什么样子,有什么功能),和创建一个项目计划。计划可以使用图表,布局设计或者文者的方式呈现。
实现
第三阶段就是实现阶段,项目经理创建和分配工作给开者,开发者根据任务和在设计阶段定义的目标进 行开发代码。依据项目的大小和复杂程度,可以需要数月或更长时间才能完成。
测试
测试人员进行代码测试 ,包括功能测试、代码测试、压力测试等。
进化
最后进阶段就是对产品不断的进化改进和维护阶段,根据用户的使用情况,可能需要对某功能进行修改,bug修复,功能增加等。
软件开发瀑布模型
瀑布模型是最著名和最常使用的软件开发模型。瀑布模型就是一系列的软件开发过程。它是由制造业繁衍出来的。一个高度化的结构流程在一个方向上流动,有点像生产线一样。在瀑布模型创建之初,没有其它开发的模型,有很多东西全靠开发人员去猜测去开发。这样的模型仅适用于那些简单的软件开 发,但是已经不适合现在的开发了。
下图对软件开发模型的一个阐述。

| 优势 | 劣势 |
|---|---|
| 简单易用和理解 | 各个阶段的划分完全固定,阶段之间产生大量的文档,极大地增 加了工作量。 |
| 当前一阶段完成后,您只需要 去关注后续阶段。 | 由于开发模型是线性的,用户只有等到整个过程的末期才能见到 开发成果,从而增加了开发风险。 |
| 为项目提供了按阶段划分的检 查节点 | 瀑布模型的突出缺点是不适应用户需求的变化。 |
软件的敏捷开发
什么是敏捷开发?
敏捷开发(Agile Development) 的核心是迭代开发 (Iterative Development) 与 增量开发(Incremental Development) 。
何为迭代开发?
对于大型软件项目,传统的开发方式是采用一个大周期(比如一年)进行开发,整个过程就是一次"大开 发";迭代开发的方式则不一样,它将开发过程拆分成多个小周期,即一次"大开发"变成多次"小开 发",每次小开发都是同样的流程,所以看上去就好像重复在做同样的步骤。
举例来说,SpaceX 公司想造一个大推力火箭,将人类送到火星。但是,它不是一开始就造大火箭,而是 先造一个最简陋的小火箭 Falcon 1。结果,第一次发射就爆炸了,直到第四次发射,才成功进入轨道。 然后,开发了中型火箭 Falcon 9,九年中发射了70次。最后,才开发 Falcon 重型火箭。如果SpaceX 不 采用迭代开发,它可能直到现在还无法上天。
何为增量开发?
软件的每个版本,都会新增一个用户可以感知的完整功能。也就是说,按照新增功能来划分迭代。
举例来说,房产公司开发一个10栋楼的小区。如果采用增量开发的模式,该公司第一个迭代就是交付一 号楼,第二个迭代交付二号楼 每个迭代都是完成一栋完整的楼。而不是第一个迭代挖好10栋楼的地 基,第二个迭代建好每栋楼的骨架,第三个迭代架设屋顶...
敏捷开发如何迭代?
虽然敏捷开发将软件开发分成多个迭代,但是也要求,每次迭代都是一个完整的软件开发周期,必须按照软件工程的方法论,进行正规的流程管理。

敏捷开发有什么好处?
早期交付
敏捷开发的第一个好处,就是早期交付,从而大大降低成本。 还是以上一节的房产公司为例,如果按照 传统的"瀑布开发模式",先挖10栋楼的地基、再盖骨架、然后架设屋顶,每个阶段都等到前一个阶段完 成后开始,可能需要两年才能一次性交付10栋楼。也就是说,如果不考虑预售,该项目必须等到两年后 才能回款。 敏捷开发是六个月后交付一号楼,后面每两个月交付一栋楼。因此,半年就能回款10%,后 面每个月都会有现金流,资金压力就大大减轻了。
降低风险
敏捷开发的第二个好处是,及时了解市场需求,降低产品不适用的风险。 请想一想,哪一种情况损失比 较小:10栋楼都造好以后,才发现卖不出去,还是造好第一栋楼,就发现卖不出去,从而改进或停建后 面9栋楼?
什么是持续集成?
持续集成( Continuous integration , 简称 CI )指的是,频繁地(一天多次)将代码集成到主干。
持续集成的目的,就是让产品可以快速迭代,同时还能保持高质量。它的核心措施是,代码集成到主干 之前,必须通过自动化测试。只要有一个测试用例失败,就不能集成。
通过持续集成, 团队可以快速的从一个功能到另一个功能,简而言之,敏捷软件开发很大一部分都要归 功于持续集成。

根据持续集成的设计,代码从提交到生产,整个过程有以下几步。
提交
流程的第一步,是开发者向代码仓库提交代码。所有后面的步骤都始于本地代码的一次提交 (commit)。
测试(第一轮)
代码仓库对commit操作配置了钩子(hook),只要提交代码或者合并进主干,就会跑自动化测试。
构建
通过第一轮测试,代码就可以合并进主干,就算可以交付了。
交付后,就先进行构建(build),再进入第二轮测试。所谓构建,指的是将源码转换为可以运行的实际 代码,比如安装依赖,配置各种资源(样式表、JS脚本、图片)等等。
测试(第二轮)
构建完成,就要进行第二轮测试。如果第一轮已经涵盖了所有测试内容,第二轮可以省略,当然,这时 构建步骤也要移到第一轮测试前面。
部署
过了第二轮测试,当前代码就是一个可以直接部署的版本(artifact)。将这个版本的所有文件打包( tar filename.tar * )存档,发到生产服务器。
回滚
一旦当前版本发生问题,就要回滚到上一个版本的构建结果。最简单的做法就是修改一下符号链接,指 向上一个版本的目录。
持续集成的组成要素
一个自动构建过程, 从检出代码、 编译构建、 运行测试、 结果记录、 测试统计等都是自动完成的, 无 需人工干预。
一个代码存储库,即需要版本控制软件来保障代码的可维护性,同时作为构建过程的素材库,一般使用 SVN或Git。
一个持续集成服务器, Jenkins 就是一个配置简单和使用方便的持续集成服务器
持续集成的好处
1、降低风险,由于持续集成不断去构建,编译和测试,可以很早期发现问题,所以修复的代价就少;
2、对系统健康持续检查,减少发布风险带来的问题;
3、减少重复性工作;
4、持续部署,提供可部署单元包;
5、持续交付可供使用的版本;
6、增强团队信心;
CICD持续性交付集成
配置环境介绍
| 配置 | 主机名 | IP | 软件 |
|---|---|---|---|
| 2核、2G内存、 200G硬盘 | gitlab | 192.168.108.30 | gitlab |
| 2核、2G内存、 200G硬盘 | Jenkins | 192.168.108.31 | jdk1.8,maven,docker, Jenkins |
| 2核、2G内存、 200G硬盘 | web | 192.168.108.33 | docker |
| 2核、2G内存、 200G硬盘 | Windows 系统 | 192.168.108.128 | jdk1.8,maven-3.8.4,idea2019.3.1,gitlab |
Windows系统开发环境
安装jdk
Java 开发工具包 ,它是提供给 Java 开发者使用的一套完整的软件开发环境。
JDK = JRE + 开发工具 = JVM + 核心类库 + 开发工具
- JVM (Java Virtual Machine): 执行字节码的引擎 。提供内存管理、垃圾回收、安全机制等运行 时环境。是 JRE 的核心组件。
- JRE (Java Runtime Environment): 是 Java 程序的运行环境 。包含 JVM + Java 核心类库。只有 JRE,你能运行 Java 程序,但不能开发(编译)新程序。
- JDK (Java Development Kit): 是 Java 程序的开发套件 。包含 JRE + 开发工具(主要是 javac 及其他工具)。 开发 Java 程序必须安装 JDK。
安装完成

安装maven
Apache Maven ------ Java 生态系统中最核心、应用最广泛的项目构建和依赖管理工具之一。
Maven 是一个基于 POM (Project Object Model, 项目对象模型) 的 项目管理和构建自动化工具。它 通过一个核心配置文件 ( pom.xml ) 来标准化项目的构建过程、报告和文档信息,并管理项目依赖。
- pom.xml: Maven 项目的心 脏和灵魂 。所有配置(项目信息、依赖、构建配置、插件配置等)都 在此文件中定义。
- 坐标 (Coordinates): groupId , artifactId , version (GAV) ------ 唯一标识一个项目构件 (Artifact)。
- 依赖 (Dependency): 项目所依赖的外部库,通过坐标声明。
- 仓库 (Repository):
- 本地仓库 (Local Repository): 开发者机器上的目录(默认 ~/.m2/repository ),缓存从远 程下载的依赖。
- 远程仓库 (Remote Repository) : 提供依赖下载的服务器。
- 中央仓库 (Central Repository): Maven 社区维护的默认公共仓库。
- 私服 (Private Repository/Proxy): 公司内部搭建的仓库(如 Nexus, Artifactory),用于:
- 缓存中央仓库构件,加速构建。
- 部署公司内部私有构件。
- 控制对外部仓库的访问。
- 构建生命周期 (Lifecycle): 一组有序的构建阶段。
- 阶段 (Phase): 生命周期中的具体步骤。
- 插件 (Plugin): 提供具体构建功能的模块。
- 目标 (Goal): 插件中的具体可执行任务(一个插件可以有多个目标)。执行构建的命令本质上是调 用插件的目标( mvn -prefix>: 或 mvn ::: )。
放到C盘中直接解压

在conf目录中找到settings.xml文件

用记事本编辑修改(ctrl+f 查找快捷键)

复制阿里云镜像地址,放到-->注释符号外面(注意)

地址如下:
bash
<mirror>
<id>aliyunmaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
安装idea
IntelliJ IDEA 是 JetBrains 开发的智能 Java IDE,以深度代码分析、高效工具集成和极致开发体验为核 心,提供智能补全、重构、调试及全栈开发支持,分付费旗舰版(全功能)和免费社区版(基础 Java/Kotlin 开发)。
装在默认位置

一直Next至安装完成
激活idea
激活插件放入安装目录中的bin文件夹下

记事本编辑配置文件,添加插件路径

添加路径(根据idea安装路径自行匹配)

bash
-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.1\bin\jetbrains-agent.jar
添加激活码,点击激活


新建项目

选择spring initializr,创建网站项目

修改组名,Type设置为Maven

选择web中spring web模板

设置项目名称demo_web和路径

创建完成后,删除多余配置项

在com.guo.demo项目下新建controller.Test


配置maven


找到pom.xml文件,修改对应版本


bash
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId> #修改,注意名称,没有mvc
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> #修改,注意名称,没有mvc
<scope>test</scope>
</dependency>
</dependencies>
等待下载更新

更新完成

添加网站首页内容

点击启动运行

file-settings设置,并点击apply

file-stucture




修改完后,就可以正常启动了

使用浏览器打开验证

GitLab服务

GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web 服务。
GitLab和GitHub一样属于第三方基于Git开发的作品,免费且开源(基于MIT协议),与Github类似, 可以注册用户,任意提交你的代码,添加SSHKey等等。不同的是,GitLab是可以部署到自己的服务器 上,数据库等一切信息都掌握在自己手上,适合团队内部协作开发,你总不可能把团队内部的智慧总放 在别人的服务器上吧?简单来说可把GitLab看作个人版的GitHub。
安装相关依赖包
bash
[root@gitlab ~]# yum -y install policycoreutils openssh-server openssh-clients postfix
启动ssh服务
bash
[root@gitlab ~]# systemctl enable sshd --now
设置postfix开机自启,并启动,postfix支持gitlab发信功能
bash
[root@gitlab ~]# systemctl enable postfix --now
开放ssh以及http服务,然后重新加载防火墙列表
bash
[root@gitlab ~]# firewall-cmd --add-service=ssh --permanent
[root@gitlab ~]# firewall-cmd --add-service=http --permanent
[root@gitlab ~]# firewall-cmd --reload
下载gitlab包,并且安装
wget https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el6/gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm
安装
bash
[root@gitlab ~]# rpm -ivh gitlab-ce-12.4.2-ce.0.el6.x86_64.rpm
修改gitlab配置
bash
[root@gitlab ~]# vim /etc/gitlab/gitlab.rb
# 23行
external_url 'http://192.168.108.30:82'
# 1112行
nginx['listen_port'] = 82
重载配置及启动gitlab
bash
[root@gitlab ~]# gitlab-ctl reconfigure
[root@gitlab ~]# gitlab-ctl restart
把端口添加到防火墙
bash
[root@gitlab ~]# firewall-cmd --zone=public --add-port=82/tcp --permanent
[root@gitlab ~]# firewall-cmd --reload
启动成功后,看到以下修改管理员root密码的页面,修改密码abcd1234后,然后登录即可


创建组

类型设置为私有

确保账户安全,创建一个新用户

创建用户的时候,可以选择Regular或Admin类型。
Regular:普通用户,可以访问属于他的项目。
Admin:管理员,可以访问所有项目。

创建完用户后,立即修改密码


将用户添加到组中,选择某个用户组,进行Members管理组的成员


赋予角色并添加

Gitlab用户在组里面有5种不同权限:
Guest:可以创建issue、发表评论,不能读写版本库 Reporter:可以克隆代码,不能提交,QA、PM 可以赋予这个权限
Developer:可以克隆代码、开发、提交、push,普通开发可以赋予这个权限
Maintainer:可以创建项目、添加tag、保护分支、添加项目成员、编辑项目,核心开发可以赋予这个权 限
Owner:可以设置项目访问权限 - Visibility Level、删除项目、迁移项目、管理组成员,开发组组长可以 赋予这个权限

在用户组中创建项目
以刚才创建的新用户身份登录到Gitlab,然后在用户组中创建新的项目

选择自己所在的组

创建项目

命名项目,类型设置为私有

项目创建完成

源码上传到Gitlab仓库
在Windows系统本地安装gitlab
点击安装

保持默认路径;一直点击Next到Install
注意:√全部去掉

先重启idea,再在idea中添加Git


在左下角会出现添加成功

选择整个项目,右击就会出现Git选项,先+Add加入缓存,再提交commit directory本地git

设置版本名,再提交



左下角会有成功信息

提交到远程的gitlab上


到gitlab网页对应的项目下复制连接

粘贴到URL上

输入gitlab上的用户身份验证

验证成功后,直接push提交

提交成功,右下角出现成功信息

回到gitlab服务器,web_demo项目下查看提交内容

Jenkins服务

Jenkins 是一个开 源的、基于 Java 的持续集成和持续交付/部署工具。它被广泛应用于软件开发流程中, 用于自动化构建、测试和部署代码,从而提高开发效率、软件质量和发布速度。
核心目标:自动化软件开发流程
- 持续集成 : 频繁地将开发人员的代码变更合并到共享主干(如 Git 仓库),并立即自动进行构建 和测试。目的是尽早发现集成错误。
- 持续交付 : 确保每次代码变更都可以通过自动化流程(构建、测试、部署到类生产环境)被安 全、快速、可靠地发布。
- 持续部署 : 在持续交付的基础上,更进一步自动将验证通过的变更部署到生产环境(通常需要严 格的自动化测试和监控)。
核心工作原理:Pipeline(流水线)
- Jenkins 的核心是定义和执行 Pipeline 。Pipeline 将软件交付过程建模为一系列阶段(Stage), 每个阶段包含多个步骤(Step)。
- 典型阶段: **检出代码 -> 编译构建 -> 运行单元测试 -> 运行集成测试 -> 代码质量分析 -> 构建部署 包 -> 部署到测试环境 -> 部署到生产环境(CD)**等。
- Pipeline 定义通常使用 Jenkinsfile (一个文本文件)编写,并存储在源代码仓库中,实现了 "Pipeline as Code"。
特点:
-
开源且免费: 拥有庞大的用户和开发者社区。
-
高度可扩展: 通过庞大且活跃的 插件生态系统(超过 1800 个插件)实现几乎所有功能的扩展:
- 源代码管理: Git, SVN, Mercurial 等。
- 构建工具: Maven, Gradle, Ant, Make, Shell 脚本等。
- 测试框架: JUnit, TestNG, Selenium, Cucumber 等。
- 代码质量分析: SonarQube, Checkstyle, FindBugs 等。
- 部署: SSH, Docker, Kubernetes, Azure, AWS, GCP 等。
- 通知: Email, Slack, Teams 等。
- UI 和 Pipeline 可视化: Blue Ocean 插件等。
-
分布式构建: 可以将构建任务分发到多台机器(称为 Jenkins Agent/Node)上执行,提高构建速 度和资源利用率。主节点负责管理和调度。
-
易于安装和配置: 提供独立的 WAR 包、Docker 镜像、系统安装包(如 RPM, DEB)等多种安装 方式。
-
强大的 Web 界面: 用于配置项目、管理构建、查看日志和监控状态。
-
丰富的 API: 支持通过 REST API 与 Jenkins 进行集成和自动化操作。
-
良好的社区支持和文档: 拥有庞大的用户基础和丰富的学习资源。
Jenkins 的典型应用场景:
- 自动构建: 代码提交后自动触发编译打包。
- 自动化测试: 每次构建后自动运行单元测试、集成测试、端到端测试。
- 代码质量门禁: 集成静态代码分析工具,若质量不达标则阻止部署。
- 自动化部署: 将构建好的应用自动部署到开发、测试、预发布甚至生产环境。
- 定时任务: 执行周期性的构建、备份、报告生成等任务。
- 监控外部作业: 执行脚本或程序并监控其结果。
主要组件:
-
Jenkins Server/Controller: 主节点,提供 Web UI,管理配置,调度构建作业。
-
Jenkins Agent/Node: 执行器节点,实际执行构建任务的计算资源(可以是物理机、虚拟机、容 器等)。主节点将任务分发给 Agent。
-
Project/Job: 定义了构建任务的具体内容和步骤。
-
Pipeline: 使用声明式或脚本式语法定义的多阶段构建过程(Jenkinsfile)。
-
Artifact: 构建过程产生的输出物(如 JAR, WAR, Docker 镜像等)。
-
Plugin: 用于扩展 Jenkins 功能的附加模块。
Jenkins预备环境
关闭防火墙和增强性安全功能
bash
[root@jenkins data]# systemctl disable firewalld.service --now
maven部署
bash
[root@jenkins ~]# tar avxf jdk-8u171-linux-x64.tar.gz -C /usr/local/
[root@jenkins ~ 13:52:52]# tar zxvf apache-maven-3.6.2-bin.tar.gz -C /usr/local/
重命名目录
bash
[root@jenkins ~ 13:52:56]# cd /usr/local
[root@jenkins local 13:53:14]# mv apache-maven-3.6.2/ maven
[root@jenkins local 13:53:27]# mv jdk1.8.0_171/ jdk
配置maven阿里云仓库地址
bash
[root@jenkins local 13:53:37]# vim /usr/local/maven/conf/settings.xml
# 159行,在-->注释符号外面添加
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
# 253行 -->注释符号外面添加Maven支持jdk
<profile>
<id>jdk8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
# 275行 -->下面添加
<activeProfiles>
<activeProfile>jdk8</activeProfile>
</activeProfiles>
docker部署
Docker 是一个开源的容器化平台,用于将应用及其依赖打包成轻量级、可移植的容器,实现快速部署 和跨环境一致运行。
安装依赖包
bash
[root@jenkins local]# yum remove docker docker-common docker-selinux docker-engine
[root@jenkins local]# yum install -y yum-utils device-mapper-persistent-data lvm2
- yum-utils 提供了 yum-config-manager device mapper 存储驱动程序需要
- device-mapper-persistent-data 和 lvm2
- Device Mapper 是 Linux2.6 内核中支持逻辑卷管理的通用设备映射机制,它为实现用于存储资源 管理的块设备驱动提供了一个高度模块化的内核架构。
设置华为云镜像源
bash
[root@jenkins local]# wget -O /etc/yum.repos.d/docker-ce.repo https://mirrors.huaweicloud.com/docker-ce/linux/centos/docker-ce.repo
[root@jenkins local]# sed -i 's+download.docker.com+mirrors.huaweicloud.com/docker-ce+' /etc/yum.repos.d/docker-ce.repo
安装docker,并设置开机自启
bash
[root@jenkins local]# yum makecache fast
[root@jenkins local]# yum install docker-ce -y
bash
[root@jenkins local# systemctl enable docker --now
设置镜像加速
bash
[root@jenkins local]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn",
"https://mirror.baidubce.com",
"https://docker.1panel.live"
]
}
EOF
重启服务
bash
[root@jenkins local]# systemctl daemon-reload
[root@jenkins local]# systemctl restart docker
Jenkins部署
官网下载地址:https://hub.docker.com/r/jenkins/jenkins/tags?name=2.346\&page=2
下载Jenkins镜像
bash
[root@jenkins local]# docker pull jenkins/jenkins:2.346.3-lts-jdk8
docker-compose工具
bash
[root@jenkins ~]# chmod +x docker-compose
[root@jenkins ~]# mv docker-compose /usr/local/bin/
创建docker资源目录
bash
[root@jenkins ~]# mkdir -p /usr/local/docker/jenkins_docker
创建资源脚本
bash
[root@jenkins ~]# cd /usr/local/docker/jenkins_docker/
[root@jenkins jenkins_docker]# vim docker-compose.yml
# 添加以下内容
version: "3.1"
services:
jenkins:
image: jenkins/jenkins:2.346.3-lts-jdk8
container_name: jenkins
ports:
- 8080:8080
- 50000:50000
volumes:
- ./data/:/var/jenkins_home/
尝试启动
bash
[root@jenkins jenkins_docker]# docker-compose up -d
Creating network "jenkins_docker_default" with the default driver
Creating jenkins ... done
查看日志,发现没有权限Permission denied
bash
[root@jenkins jenkins_docker]# docker logs -f jenkins
touch: cannot touch '/var/jenkins_home/copy_reference_file.log': Permission denied
Can not write to /var/jenkins_home/copy_reference_file.log. Wrong volume permissions?
赋予data目录权限
bash
[root@jenkins jenkins_docker]# chmod 777 data/
重新启动
bash
[root@jenkins jenkins_docker]# docker-compose restart
Restarting jenkins ... done
再次查看日志
bash
[root@jenkins jenkins_docker]# docker logs -f jenkins
显示如下内容:
bash
...
2026-01-28 06:55:56.072+0000 [id=27] INFO jenkins.install.SetupWizard#init:
*************************************************************
*************************************************************
*************************************************************
Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:
17654c94e62d47808721034e3e0e61e4
This may also be found at: /var/jenkins_home/secrets/initialAdminPassword
*************************************************************
*************************************************************
*************************************************************
2026-01-28 06:56:42.312+0000 [id=27] INFO jenkins.InitReactorRunner$1#onAttained: Completed initialization
2026-01-28 06:56:42.334+0000 [id=20] INFO hudson.lifecycle.Lifecycle#onReady: Jenkins is fully up and running
2026-01-28 06:56:48.111+0000 [id=42] INFO h.m.DownloadService$Downloadable#load: Obtained the updated data file for hudson.tasks.Maven.MavenInstaller
2026-01-28 06:56:48.112+0000 [id=42] INFO hudson.util.Retrier#start: Performed the action check updates server successfully at the attempt #1
2026-01-28 06:56:48.114+0000 [id=42] INFO hudson.model.AsyncPeriodicWork#lambda$doRun$1: Finished Download metadata. 53,514 ms
本地化插件上传


默认插件是root权限,需要进行修改为user1,与其他文件一致
bash
root@jenkins data]# chown -R user1:user1 plugins/
国内镜像源
bash
[root@jenkins data]# mv hudson.model.UpdateCenter.xml hudson.model.UpdateCenter.xml.bak
[root@jenkins data]# cp -p hudson.model.UpdateCenter.xml.bak hudson.model.UpdateCenter.xml
[root@jenkins data]# vim hudson.model.UpdateCenter.xml
替换成清华源
bash
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id> <url>https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/updatecenter.json</url>
</site>
</sites>
重启Jenkins
bash
[root@jenkins data 15:32:43]# docker-compose restart
Restarting jenkins ... done
打开Jenkins网页
解决问题:本地可以直接使用浏览器访问Jenkins,但是其他主机无法用浏览器访问
Jenkins Jenkins服务器上未开启IP转发功能
解决方法:
bash
[root@jenkins data]# vim /etc/sysctl.conf
# 在末尾添加
net.ipv4.ip_forward = 1
[root@jenkins data]# sysctl -p
net.ipv4.ip_forward = 1
1:把序列密码17654c94e62d47808721034e3e0e61e4 粘贴入文本框
2:不选择插件安装
3:创建管理员用户

实例配置保持默认

开始使用

首页展现

查看插件
系统管理---插件管理

本地插件已成功识别

git-parameter插件
此插件用于从git拉取项目到Jenkins
选择高级

往下找到Deploy Plugin,把插件上传

插件上传成功

再上传git-parameter

安装成功

在插件已安装中可以直接查看到

jdk和maven设置
用来拉取gitlab中的项目
把jdk放到Jenkins工作目录下
bash
[root@jenkins ~]# cd /usr/local/docker/jenkins_docker/data
[root@jenkins data]# mv /usr/local/jdk/ ./
[root@jenkins data]# mv /usr/local/maven/ ./
Jenkins页面---系统管理---Global Tool Configuration(全局工具配置)

指定容器中的jdk环境 /var/jenkins_home/jdk

同页面下maven设置

取消自动安装

设置容器中maven路径,设置完成后,直接应用并保存

Publish over SSH插件
用于推送到目标web服务器
查看插件默认已经安装

系统管理->Configure System(系统配置)

配置SSH目标服务器信息

配置目标主机root用户的密码

应用-保存,进行测试

问题解决:缺少/user/local/test目录
到目标web服务器上创建
bash
[root@web ~]# mkdir /usr/local/test


创建任务

任务定义名称和风格

项目为私有项目就需要添加身份验证,复制gitlab上http的URL

设置gitlab用户guo的身份凭据

设置完成后,应用并保存

第1次构建-拉取gitlab项目

构建信息显示成功

到Jenkins服务器上查看拉取的项目
bash
[root@jenkins data]# docker exec -it jenkins bash
jenkins@b1f323139491:/$ cd /var/jenkins_home/
jenkins@b1f323139491:~$ cd workspace/
jenkins@b1f323139491:~/workspace$ ls
mytest mytest@tmp
jenkins@b1f323139491:~/workspace$ cd mytest
jenkins@b1f323139491:~/workspace/mytest$ ls
HELP.md demo.iml pom.xml src target
jenkins@b1f323139491:~/workspace/mytest$ cd src/main/java/com/guo/demo/controller/Test
jenkins@b1f323139491:~/workspace/mytest/src/main/java/com/guo/demo/controller/Test$ cat Controller.java
package com.guo.demo.controller.Test;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class Controller {
@GetMapping("/test")
public String test(){
return "hello world";
}
}
第2次构建-编译jar包
返回工程-配置

选择构建,添加构建步骤



clean :清除之前构建生成的文件(如 target 目录),确保全新构建
package :编译源代码并打包生成可执行文件
-DskipTests :跳过单元测试的执行(但会编译测试代码)

应用并保存,进行构建

构建完成

到Jenkins服务器中查看构建的jar包demo-0.0.1-SNAPSHOT.jar
bash
[root@jenkins jenkins_docker]# cd /usr/local/docker/jenkins_docker/data/workspace/mytest/target
[root@jenkins target]# ls
classes demo-0.0.1-SNAPSHOT.jar.original generated-test-sources maven-status
demo-0.0.1-SNAPSHOT.jar generated-sources maven-archiver test-classes
第3次构建-推送jar至目标服务器
返回工程-配置-构建后操作

选择发送构建产品使用SSH方式

选择要发送的源文件

进行构建,完成后查看信息,已经发送成功

到目标web服务器中查看jar包
bash
[root@web ~]# cd /usr/local/test/
[root@web test]# ls
target
[root@web test]# cd target/
[root@web target]# ls
demo-0.0.1-SNAPSHOT.jar
第4次构建-拉取docker文件
在Windows系统的idea中创建docker文件夹,并编写Dockerfile

代码如下:
bash
FROM openjdk:8
COPY demo-0.0.1-SNAPSHOT.jar /usr/local/
WORKDIR /usr/local
CMD java -jar demo-0.0.1-SNAPSHOT.jar
在相同路径下,创建docker-compose.yml文件

代码如下:
bash
version: '3.1'
services:
mytest:
build:
context: ./
dockerfile: Dockerfile
image: mytest:v1.0
container_name: mytest
ports:
- 8080:8080
整个项目进行提交Gitlab


左下角显示本地git提交成功
push到远程gitlab

右下角显示提交成功

在gitlab页面中查看DevOps cloud docker v1.0项目上传

在Jenkins服务器上,返回工程-立即构建,显示构建成功

在Jenkins服务器上查看docker文件已经拉取成功
bash
[root@jenkins target]# cd ..
[root@jenkins mytest]# ls
demo.iml docker HELP.md pom.xml src target
[root@jenkins mytest]# cd docker/
[root@jenkins docker]# ls
docker-compose.yml Dockerfile
第5次构建-目标服务器项目运行
在web目标服务器上部署docker环境
bash
[root@web ~]# yum install -y yum-utils device-mapper-persistent-data lvm2
[root@web ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
[root@web]# systemctl disable firewalld.service --now
[root@web ~]# yum install docker-ce -y
[root@web]# systemctl enable docker --now
镜像加速
bash
[root@web ~]# tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://09def58152000fc00ff0c00057bad7e0.mirror.swr.myhuaweicloud.com",
"https://do.nark.eu.org",
"https://dc.j8.work",
"https://docker.m.daocloud.io",
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn",
"https://registry.docker-cn.com",
"https://hub-mirror.c.163.com",
"https://hub.uuuadc.top",
"https://docker.anyhub.us.kg",
"https://dockerhub.jobcher.com",
"https://dockerhub.icu",
"https://docker.ckyl.me",
"https://docker.awsl9527.cn",
"https://mirror.baidubce.com",
"https://docker.1panel.live"
]
}
EOF
重启docker服务
bash
[root@web ~]# systemctl daemon-reload
[root@web ~]# systemctl restart docker
[root@web ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@web ~]# sysctl -p
docker-compose工具
bash
# docker-compose移进去
[root@web ~]# chmod +x docker-compose
[root@web ~]# mv docker-compose /usr/local/bin/
返回工程-配置-构建后操作

command如下:
bash
cd /usr/local/test/docker
mv ../target/*jar ./
docker-compose down
docker-compose up -d --build
进行构建,查看显示(出现timeout信息失败,说明下载openjdk:8镜像速度慢,可以多构建几次)
可以先将镜像下载到本地
bash[root@web ~]# docker pull openjdk:8

访问目标服务器地址,可以成功访问网站
http://192.168.108.32:8080/test

在目标服务器上查看镜像
bash
[root@web ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytest v1.0 b7c012878cb5 3 minutes ago 543MB
openjdk 8 b273004037cc 3 years ago 526MB
查容器
bash
[root@web ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f852df20b12 mytest:v1.0 "/bin/sh -c 'java -j..." 3 minutes ago Up 3 minutes 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp mytest
虚悬镜像(none)镜像处理
多次构建会在目标服务器中出现none镜像,我们可以使用以下命令处理
bash
[root@web ~]# docker image prune -f
这种优化操作可以直接放入到构建后操作中执行

参数化构建
参数化构建是一种允许在触发构建时通过动态传入参数来定制构建流程的功能。
项目-配置-general

选择git参数

设置git参数

添加构建步骤

选择,执行shel

先执行,要拖拽到构建选项的置顶位置

先切换版本,再编译打包构建

回到gitlab服务器,再项目上选择tag标签

创建新标签

设置版本号并创建

创建成功

Windows系统中idea修改Controller代码

修改docker-compose.yml代码

提交代码修改名称

进行提交

gitlab上查看,提交成功

创建v2.0标签


现在项目已经有两个版本

回到Jenkins服务器的项目中,可以看见现在能够选择版本构建

根据版本,选择构建


打开目标web服务器地址可以看到版本1.0的网页内容呈现

再继续构建版本v2.0


在目标web服务器上再次查看网页内容
点击刷新网页就可以看到内容更新
