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-…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...