centos7系统使用docker-compose安装部署jenkins
CentOS7系统使用docker-compose安装部署jenkins,并实现前后端自动构建
记录一次工作中部署jenkins的真实经历,总结了相关经验
1.准备环境
1.java
由于最新的jenkins需要jdk11以上才能支持,而系统里的jdk是1.8的,因此等jenkins安装好后使用jenkins容器里自带的jdk17

2.maven
centos7安装maven,步骤:
1.下载 apache-maven-3.6.3-bin.tar.gz
2.解压
3.配置环境变量
vim /etc/profile
4.刷新配置文件
source /etc/profile
5.验证
mvn -v
3.node
centos7 使用nvm 下载16以上版本的node可能会遇到如下的报错

这里直接采用jenkins自动安装node 18

2.准备docker-compose.yml文件
version : '3'
services:jenkins:user: rootrestart: alwaysimage: jenkins/jenkinscontainer_name: jenkinsenvironment:- TZ=Asia/Shanghaiports:- "10240:8080"- "10241:50000"expose:- "8080"- "50000"volumes:- /data/jenkins/jenkins_home/:/var/jenkins_home/- /data/nginx/html/:/data/nginx/html/- /data/nginx/htmldev/:/data/nginx/htmldev/- /var/run/docker.sock:/var/run/docker.sock- /usr/bin/docker:/usr/bin/docker- /data/maven/apache-maven-3.6.3:/data/maven/apache-maven-3.6.3- /root/.ssh:/root/.ssh
- /var/jenkins_home/ 这个是容器里默认的jenkins工作目录,需要挂载出来
- /data/nginx/html/和/data/nginx/htmldev/ 分别对应后面前端项目pc端、移动端的dist存放目录,配置于nginx中,挂载出来是由于jenkins配置前端构建的时候需要配置nginx目录
- maven挂载刚刚安装的maven
3.执行docker-compose
# 跳转到docker-compose.yml文件目录
cd /data/jenkinsll#执行
docker-compose up -d#查看运行状态
docker ps
4.初始化jenkins
-
访问 ip:10240 jenkins后台

查找初始密码

-
安装插件
选择安装推荐的插件,这里如果安装失败,后续再手动切换源,安装必要的插件即可
源:https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

参考:
docker安装jenkins并配置国内插件镜像地址_jenkins国内镜像-CSDN博客
Jenkins必备安装插件 - 知乎 (zhihu.com)

-
创建管理员账号

一直下一步



- 切换中文(此时还有部分界面是英文)
安装locale插件即可
参考:
【jenkins】教你jenkins设置为中文_jenkins 中文插件,2024年最新这操作真香_jenkins设置中文-CSDN博客
5.系统配置
-
凭据管理


添加全局凭据
-
git账号密码(拉取代码)

-
gitlab token(用于监听git,自动构建)
安装gitlab插件

去gitlab生成token,复制

添加gitlab api token凭证

-
-
全局工具配置
-
JDK
使用jenkins容器自带jdk17

-
maven
使用本地安装的maven,刚刚已经挂载

-
nodejs
安装nodejs插件

勾选自动安装,node版本选择18

-
-
系统配置

-
远程部署配置
安装远程部署插件

配置publish over ssh - SSH Servers
-
远程部署客户测试环境

-
远程部署公司开发环境

-
-
gitlab连接配置

-
6.新建构建任务
1.后端(含备份、回滚)
1.本机部署
举例:构建测试服务器(本地),从git的develop分支拉取代码
-
选择自由风格

-
设置保留构建历史数量

-
配置参数化构建,为了实现回滚


-
配置源码管理

-
构建环境

-
增加构建步骤
maven

备份

#!/bin/bash case $Status indeploy)echo "Status:$Status"path="${WORKSPACE}/csms-admin/bak/${BUILD_NUMBER}" #创建每次要备份的目录if [ -d $path ];thenecho "The files is already exists "elsemkdir -p $pathfi\cp -f ${WORKSPACE}/csms-admin/target/*.jar $path #将打包好的jar包备份到相应目录,覆盖已存在的目标echo "bak ------------ Completing!";;rollback)echo "Status:$Status"echo "Version:$Version"echo "BUILD_NUMBER:$BUILD_NUMBER"v=$Versionif [ $Version -eq 0 ]; thenv=$(($BUILD_NUMBER - 2)) # 如果 $Version 是 0,则赋值为 $BUILD_NUMBER - 2fiecho "回滚到版本--v:${v}"cd ${WORKSPACE}/csms-admin/bak/${v} #进入备份目录\cp -f *.jar ${WORKSPACE}/csms-admin/target/ #将备份拷贝到程序打包目录中,并覆盖之前的jar包;;*)exit;; esac构建新docker镜像并启动

cd ${WORKSPACE} docker stop csms-admin || true docker rm csms-admin || true docker rmi csms-admin || true docker build --build-arg profileActive=test --build-arg port=8889 -t csms-admin . docker run -d -p 192.168.100.53:8889:8889 --name csms-admin csms-admin保留10个版本,删除以前的备份

#!/bin/bash #rm_file>14day ReservedNum=10 #保留文件数量 rm_file_dir=${WORKSPACE}/csms-admin/bak #需要删除文件的路径cd $rm_file_dir #进入文件夹 RootDir=$(pwd) #当前文件路径 FileNum=$(ls -l | grep '^d' | wc -l) #查找文件夹数量 OldFile=$(ls -rt | head -1) #找出最早文件夹 if [ $RootDir == $rm_file_dir ];then #判断所在目录是否正确echo $RootDir echo $rm_file_dirwhile (($FileNum>$ReservedNum)) #文件数超过设置变量才执行doecho "Delete File:"$RootDir'/'$OldFile #打印要删除的文件名称rm -rf $RootDir'/'$OldFile #删除文件let "FileNum--" #变量自减操作OldFile=$(ls -rt | head -1) #更新dmp最早文件done elseecho "error file path " #所在目录不对打印出路径错误 fi -
构建触发器
配置gitlab监听,自动构建


打开gitlab
将


分别粘贴到gitlab-设置-集成

-
测试


git push自动触发jenkins构建
查看控制台

查看docker容器运行状态
docker ps
后端启动成功
2.远程部署
举例:构建开发服务器(另一台服务器),采用在本机打包、备份,然后通过ssh连接远程开发服务器,传送jar包并执行的方式
-
复制一个构建任务


-
修改所有的profile环境,注释docker步骤


-
git触发器配置
(同上)
-
增加Send files or execute commands over SSH 步骤



#!/bin/bashJAR_HOME='/data/jenkins/jenkins_home/workspace/csms-dev-develop/csms-admin/target' WEB_HOME='/data/csms/csms-admin'#停止原来的服务 ps -ef | grep csms-admin | grep -v grep | awk '{print $2}' | xargs kill -9#替换原来的jar包 cd ${JAR_HOME} mv csms-admin-dev.jar csms-admin.jar cp -f csms-admin.jar ${WEB_HOME}#重启服务 cd ${WEB_HOME} nohup sh startup.sh &startup.sh
#!/bin/bash #1,获取myjar的进程号 PID=$(ps -ef|grep csms-admin| grep -v grep | awk '{print $2}') #2,启动myjar的函数 start(){nohup /data/java/jdk1.8.0_321/bin/java -Dspring.profiles.active=dev -jar -Xms1024m -Xms2048m csms-admin.jar & } #3,判断1中获取的PID是否存在,即判断myjar有没有启动if [ -z "$PID" ] then #4,日志echo "Start the csms-admin directly " #5,myjar之前没有启动的话,这里直接调用start函数start else #6,myjar之前启动过且进程依然存活,则kill掉,然后调用start函数echo "kill the existing csms-admin process firstly."kill -9 $PIDecho " $PID has been killed"start fi
2.前端
由于nginx部署在开发服务器(非jenkins所在服务器),所以前端部署都为远程部署
1.PC端远程部署
-
自由风格
同上
-
丢弃旧的构建
同上
-
源码管理
同上
-
构建触发器
同上
-
构建环境

-
构建步骤

npm install rm -rf ${WORKSPACE}/dist npm run build:dev #本机部署则去掉下面的ssh步骤,这里加上下面的语句 #rm -rf /data/csms/csms-web/html #mkdir -p /data/csms/csms-web/html #cp -rf ${WORKSPACE}/dist /data/csms/csms-web/html -
增加Send files or execute commands over SSH 步骤

#!/bin/bashDIST_HOME='/data/jenkins/jenkins_home/workspace/csms-vue-test-dev-pc' HTML_HOME='/data/csms/csms-web/test/html'#覆盖原来的dist cp -rf ${DIST_HOME}/dist/* ${HTML_HOME}/dist
2.移动端远程部署
-
构建步骤

-
ssh

#!/bin/bashDIST_HOME='/data/jenkins/jenkins_home/workspace/csms-vue-test-dev' HTML_HOME='/data/csms/csms-app/test/html'#覆盖原来的dist cp -rf ${DIST_HOME}/mobiled_dist/* ${HTML_HOME}/mobiled_dist -
其他步骤同PC
7.在jenkins上编写maven的setting文件
有的时候需要临时改下maven的setting文件,或者想编写多份setting文件给不同的构建任务去使用,可以在jenkins上直接进行配置
-
添加配置文件

参考:
PS:这里没有这个选项的,需要下载插件Jenkins 配置文件管理插件 Config File Provider_jenkins config file provider-CSDN博客


-
全局配置


-
到构建任务里配置


8.后端项目Dockerfile示例
本文的后端项目对应的Dockerfile,可参考使用,一般放在项目的根目录下
# 基础镜像
FROM openjdk:8-jre# 维护者信息
MAINTAINER asusENV LANG=zh_CN.UTF8
ENV LC_ALL=zh_CN.UTF8# 设置容器时区为当前时区
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \&& echo 'Asia/Shanghai' >/etc/timezone# /tmp 目录作为容器数据卷目录,SpringBoot内嵌Tomcat容器默认使用/tmp作为工作目录,任何向 /tmp 中写入的信息不会记录进容器存储层
# 在宿主机的/var/lib/docker目录下创建一个临时文件并把它链接到容器中的/tmp目录
VOLUME /tmp# 复制主机文件至镜像内,复制的目录需放置在 Dockerfile 文件同级目录下
ADD csms-admin/target/csms-admin-*.jar csms.jar# 动态参数
ARG profileActive=dev
ENV profileActive ${profileActive}ARG port=8881
ENV port ${port}# 容器启动执行命令
ENTRYPOINT ["java", "-Xms256M","-Xmx1224M","-Xmn256M","-Xss256K","-Duser.timezone=GMT+8", "-Djava.security.egd=file:/dev/./urandom", "-Dspring.profiles.active=${profileActive}", "-jar", "/csms.jar"]# 声明容器提供服务端口
EXPOSE ${port}
PS:上面展示的自动构建是每次都删除原来的镜像和容器,重新构建镜像,其实也可以Dockerfile里不ADD jar包,然后将容器里放jar包的目录在 run 这个镜像容器的时候挂载出来,这样只需要构建一次镜像,创建一次容器,后面jar包更新了,只需要重启容器即可。
9.Jenkins新增用户并根据项目分配权限
参考:
jenkins增加用户,并配置权限,保姆式教学_jenkins创建用户并添加权限-CSDN博客
Jenkins—jenkins新增用户且配置权限-CSDN博客
10.踩坑记录
1.由于lombok版本过低导致Maven编译失败
在构建任务中,jdk指定的是jenkins里自带的jdk17,项目中maven编译指定的jdk是1.8,这里是下图报错的根本原因,但是之前其他构建任务也是这样配置的,还是正常编译,最终在网上查询相关博客,改了lombok版本才得以解决
参考:项目install的时候报错“module jdk.compiler does not “opens com.sun.tools.javac.processing“ to unnamed modul


修改lombok版本为最新版本(能支持jdk17)

相关文章:
centos7系统使用docker-compose安装部署jenkins
CentOS7系统使用docker-compose安装部署jenkins,并实现前后端自动构建 记录一次工作中部署jenkins的真实经历,总结了相关经验 1.准备环境 1.java 由于最新的jenkins需要jdk11以上才能支持,而系统里的jdk是1.8的,因此等jenkins安…...
传染病报卡内容——丙型
--丙型 select a.morbiditdate 发病日期, diagnosedate 诊断日期, a.deathdate 死亡日期, a.casetypequality 病例分类,a.hcvrna "HCR_RNA定量" from zl_sdmb.t_报卡记录 t, c1_infectiousv1_6 a where t.id a.fileid and t.卡片种类 传…...
本地快速部署大语言模型开发平台Dify并实现远程访问保姆级教程
文章目录 前言1. Docker部署Dify2. 本地访问Dify3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问6. 固定Cpolar公网地址7. 固定地址访问 前言 本文主要介绍如何在Linux Ubuntu系统使用Docker快速部署大语言模型应用开发平台Dify,并结合cpolar内网穿透工具实现公网环境远程访问…...
《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 02 Clos拓扑
本章回答以下问题: 什么是 Clos 拓扑,它与“接入 - 汇聚 - 核心”拓扑有何不同?Clos 拓扑的特征是什么?Clos 拓扑对数据中心网络的影响是什么? Clos拓扑 云原生数据中心基础设施的先行者们想要构建一种支持大规模水平扩展网络。 基本的Clos拓扑如图…...
VUE3版本新特性
VUE3版本新特性 VUE3和VUE2的区别路由的使用vite安装项目新特性使用 1.VUE3和VUE2的区别 2020年9月18日,Vue.js发布版3.0版本,代号:One Piece 于 2022 年 2 月 7 日星期一成为新的默认版本! Vue3性能更高,初次渲染快55%, 更新渲染快133% 。…...
【Oracle篇】Oracle数据库坏块处理:rman修复坏块实践与案例分析(第七篇,总共八篇)
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...
学懂C#编程:从一个简单的例子理解事件处理
在C#中,事件是一种特殊的委托类型,用于在对象上发生某些事情时通知订阅者。事件的处理通常包括定义事件,创建触发事件的条件,以及订阅该事件的事件处理程序。 以下是一个简单的C#事件处理示例: using System;// 定义…...
深入理解指针(2)
4. const 修饰指针 4.1 const修饰变量 变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。 …...
C#.Net筑基-集合知识全解
01、集合基础知识 .Net 中提供了一系列的管理对象集合的类型,数组、可变列表、字典等。从类型安全上集合分为两类,泛型集合 和 非泛型集合,传统的非泛型集合存储为Object,需要类型转。而泛型集合提供了更好的性能、编译时类型安全…...
AI PPT生成器,一键在线智能生成PPT工具
PPT作为商业沟通和教育培训中的重要工具,PPT制作对于我们来说并不陌生。但是传统的PPT制作不仅耗时,而且想要做出精美的PPT,需要具备一定的设计技能。下面小编就来和大家分享几款AI PPT工具,只要输入主题,内容就可以在…...
stm32学习笔记---零基础入门介绍2
目录 STM32介绍 STM32家族系列 ARM介绍 ARM内核型号种类 我们学习用的STM32 片上资源/外设(Peripheral) 命名规则 系统结构 引脚定义 STM32的启动配置 STM32最小系统电路和其他部分电路 最小系统板的实物图 附:安装软件准备 声明…...
搭建取图系统app源码开发,满足广泛应用需求
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 前言 图片已成为信息传递的重要媒介,广泛应用于各个领域。为满足日益增长的图片需求,搭建一款高效的取图系统,可以为用户提供便捷、全面的…...
语音质量评价方法之MOS
引言 在语音增强、语音合成、语音转换、声音转换、语音克隆、语音修复等等领域,常常要对输出的语音进行评价。对语音的质量评价一般关注两个方面,即主观评价和客观评价。主观评价就是人凭借听觉感受对语音进行打分,客观评价比较广泛…...
gorm简介
【1】ORM: 即Object-Relational Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它们就可以了。 【2】GORM gorm是go语言的一个orm…...
MySQL:SELECT list is not in GROUP BY clause 报错 解决方案
一、前言 一大早上测试环境,发现测试环境的MySQL报错了。 SELECT list is not in GROUP BY clause and contains nonaggregated column二、解决方案 官方文档中提到: 大致意思: 用于GROUP BY的SQL / 92标准要求满足以下条件: SE…...
IPython的使用技巧
1、解释说明 IPython是一个强大的Python交互式shell,它提供了丰富的功能,如自动补全、历史记录、内置帮助等。IPython使得在命令行下编写和测试Python代码变得更加方便和高效。 2、使用示例 安装IPython: pip install ipython启动IPython…...
Spring Boot 多线程例子
在Spring Boot中,多线程可以通过Java的并发工具来实现。以下是一些常见的多线程实现方法: 1. 使用Async注解和CompletableFuture: 首先,需要在Spring Boot应用的主类上添加EnableAsync注解,以启用异步支持。 java Spr…...
java干货 线程池的分析和使用
文章目录 一、了解线程池1.1 什么是线程池1.2 为什么需要线程池 二、四种线程池的使用2.1 newFixedThreadPool2.2 newCachedThreadPool2.3 newSingleThreadExecutor2.4 newScheduledThreadPool 三、自定义线程池3.1 线程池七大核心参数3.2 线程池内部处理逻辑 一、了解线程池 …...
文本张量入门
张量,英文为Tensor,是机器学习的基本构建模块,是以数字方式表示数据的形式。 张量的基本类型: 创建一个标量(0维张量),也就是一个单独的数字 scalar torch.tensor(7) scalar.ndim # 返回张量的维度 0 # …...
js文字如何轮播?
<div class"td-style"> <span class"td-text">内容1内容1内容1内容1内容1内容1</span> </div> css: <style> .td-style { width: 160px; height: 72px; overflow: hidden; white-…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...
