当前位置: 首页 > news >正文

芝法酱学习笔记(0.5)——使用jenkins做自动打包

前言

上节讲了SpringBoot上的打包。但这些过程都是手动的,在实际的开发测试时,自动化的打包部署,可以大大提升团队开发的效率

一、去官网下载

1.1 官网安装命令

对于如何安装的问题,我向来推荐官网

wget -O /usr/share/keyrings/jenkins-keyring.asc \https://pkg.jenkins.io/debian-stable/jenkins.io-2023.keyecho "deb [signed-by=/usr/share/keyrings/jenkins-keyring.asc]" \https://pkg.jenkins.io/debian-stable binary/ | sudo tee \/etc/apt/sources.list.d/jenkins.list > /dev/nullsudo apt-get updatesudo apt-get install fontconfigsudo apt-get install jenkins

1.2 错误解决

如果出现如下错误:

Created symlink /etc/systemd/system/multi-user.target.wants/jenkins.service → /lib/systemd/system/jenkins.service.
Could not execute systemctl:  at /usr/bin/deb-systemd-invoke line 148.

则键入:

journalctl -u jenkins
journalctl -xeu jenkins.service

查看到底错哪了,显示说:

jenkins: failed to find a valid Java installation
jenkins.service: Main process exited, code=exited, status=1/FAILU>
jenkins.service: Failed with result 'exit-code'.
Failed to start Jenkins Continuous Integration Server.

这说明jenkins没找到jre环境
用vim打开/lib/systemd/system/jenkins.service
我们可以看到,执行的脚本是/usr/bin/jenkins,用vim打开它

其实,应该是jenkins无法获取我在root中设置的环境,那就把jenkins改成root。
再次vim /lib/systemd/system/jenkins.service,更改如下配置

[Service]
...
#执行脚本前,运行一下设置环境变量
ExecStart=/bin/bash -c 'source /etc/profile &&  /usr/bin/jenkins'Environment="JENKINS_PORT=8888"
#让jenkin放到nginx后面
Environment="JENKINS_PREFIX=/jenkins"
User=root
Group=root
systemctl daemon-reload
systemctl start jenkins

1.3 配置nginx

location /jenkins {proxy_pass http://127.0.0.1:8888;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_read_timeout 90;
}

这样一来,我们就可以通过192.160.0.64/jenkins访问jenkins了

二、jenkins插件安装与设置

2.1 初始化

进入jenkins,首先页面如图所示
在这里插入图片描述

vim /var/lib/jenkins/secrets/initialAdminPassword

把密钥拷贝过来,进入jenkins,然后安装需要的插件。
尤其要安装的是SSH Pipeline Steps,用于远程访问

2.2 记得安装git

如果出现Failed to connect to repository : Error performing git command: git ls-remote -h https://gitee.com/**/*.git HEAD 这一类的错误时,说明宿主机没有装git,apt install git一下即可

2.3 git的账户密码设置

点击Credentials
在这里插入图片描述
添加一个凭证
在这里插入图片描述
在这里插入图片描述

三、流水线自动编译部署

3.1 目标

上节我们讲了SpringBoot下的打包,把lib,resource,config等分离了出去。所以我们这次的自动化编译,需要可以勾选是否更新lib,resource,config的选项。
同一个项目,可能被部署为多个实例,不同实例部署在不同端口。
编译好的项目,将被部署到/WORK/APP/study2024-class004/$appName,并调用startup.sh脚本启动项目

3.2 参数化

勾选This project is parameterized,添加如下参数

参数名默认值描述
profiletest环境
appNameapp001部署文件夹
port8081端口
version1.0.0版本
isUpdateCodetrue是否更新代码
isUpdateBinfalse是否更新bin
isUpdateConfigfalse是否更新配置文件
isUpdateLibfalse是否更新lib包
isUpdateStaticfalse是否更新静态资源
isUpdateMapperfalse是否更新mapper
gitTag*/mastergit分支

要值得注意的是,gitTag是Git parameter,Advance里,Branch Filter设置为origin/(.*)

3.3 jenkins文件

import java.text.SimpleDateFormatnode{def remote = [:]remote.name = '地下室主机'remote.host = '192.168.0.64'remote.user = 'root'remote.password = 'ilv0404@1314'remote.deploymentHome = "/WORK/APP/study2024-class003"remote.allowAnyHosts = truedef app = [:]app.module = "busy/general-test"app.name = "nbr"app.version = "${version}"app.cd = "${appName}"app.port = "${port}"def timestamp = currentBuild.getTimeInMillis()def formattedTimestamp = new SimpleDateFormat("yyyy-MM-dd-HH_mm_ss").format(timestamp)stage("拉取代码"){git branch: "${gitTag}", credentialsId: 'gitSec', url: 'https://gitee.com/hataksumo/study2024-class004.git'}stage("编译代码"){sh """cd codemvn cleanmvn package -pl busy/general-test -am -P${profile} -Dmaven.test.skip=true"""}stage("远程推送"){echo "停服"sshCommand remote: remote, failOnError:false, command: """cd ${remote.deploymentHome}/${app.cd}/bin./shutdown.sh --appName ${app.cd}"""if(isUpdateCode == "true"){echo "备份jar包"sshCommand remote: remote, failOnError:false, command: "mv ${remote.deploymentHome}/${app.cd}/${app.name}-${app.version}.jar ${remote.deploymentHome}/${app.cd}/${app.name}-${app.version}.jar.bac"echo "拷贝jar包"sshPut remote: remote, from: "code/${app.module}/target/${app.name}.jar", into: "${remote.deploymentHome}/${app.cd}/${app.name}-${app.version}.jar"echo "删除jar包"sshRemove remote: remote, failOnError:false, path: "${remote.deploymentHome}/${app.cd}/${app.name}-${app.version}.jar.bac"}if(isUpdateConfig == "true"){echo "删除config"sshRemove remote: remote, failOnError:false, path: "${remote.deploymentHome}/${app.cd}/config"echo "拷贝lib包"sshPut remote: remote, from: "code/${app.module}/target/config", into: "${remote.deploymentHome}/${app.cd}"}if(isUpdateLib == "true"){echo "删除lib包"sshRemove remote: remote, failOnError:false, path: "${remote.deploymentHome}/${app.cd}/lib"echo "拷贝lib包"sshPut remote: remote, from: "code/${app.module}/target/lib", into: "${remote.deploymentHome}/${app.cd}"}sshCommand remote: remote, failOnError:false, command: "mkdir ${remote.deploymentHome}/${app.cd}/resources"if(isUpdateStatic == "true"){echo "清除resources/static文件"sshRemove remote: remote, failOnError:false, path: "${remote.deploymentHome}/${app.cd}/resources/static"echo "拷贝static文件"sshPut remote: remote, from: "code/${app.module}/target/resources/static", into: "${remote.deploymentHome}/${app.cd}/resources"}if(isUpdateMapper == "true"){echo "清除resources/mybatis文件"sshRemove remote: remote, failOnError:false, path: "${remote.deploymentHome}/${app.cd}/resources/mybatis"echo "拷贝mybatis文件"sshPut remote: remote, from: "code/${app.module}/target/resources/mybatis", into: "${remote.deploymentHome}/${app.cd}/resources"}if(isUpdateBin == "true"){echo "清除bin文件"sshRemove remote: remote, failOnError:false, path: "${remote.deploymentHome}/${app.cd}/bin"echo "拷贝bin文件"sshPut remote: remote, from: "code/${app.module}/target/bin", into: "${remote.deploymentHome}/${app.cd}"echo "赋予可执行权限"sshCommand remote: remote, failOnError:false, command: """cd ${remote.deploymentHome}/${app.cd}/binchmod +x startup.shchmod +x shutdown.sh"""}echo "启服"sshCommand remote: remote, command: """source /etc/profileecho "path = $PATH"cd ${remote.deploymentHome}/${app.cd}/bin./startup.sh --version ${app.version} --appName ${app.cd} --port ${app.port}"""}}

3.4 启动

在这里插入图片描述
点击后,就可以自动的编译部署了。

相关文章:

  • 【 Java 】工具类 —— Collections 与 Arrays 的实用操作全解析
  • Llama3:全模型GQA与tiktoken分词的新突破
  • BFS之最短路径模型
  • 解决银河麒麟V10中/data目录执行权限问题
  • JDK1.8安装配置教程(图文结合,最简洁易懂)
  • undeclared identifier ‘UNITY_PREV_MATRIX_M‘ - Unity Shader自己写URP,引用内部 hlsl
  • 15年408计算机网络
  • FPGA-Vivado-IP核-逻辑分析仪(ILA)
  • 机器学习和深度学习的区别
  • 多模态——基于XrayGLM的X光片诊断的多模态大模型
  • MYSQL(学习笔记)
  • STM32F407之Flash
  • 3.4 爬虫实战-爬去智联招聘职位信息
  • 演示:基于WPF的DrawingVisual开发的频谱图和律动图
  • 【分布式微服务云原生】10分钟打造坚不可摧的系统:深入探索系统的鲁棒性
  • [PHP内核探索]PHP中的哈希表
  • [数据结构]链表的实现在PHP中
  • Laravel Mix运行时关于es2015报错解决方案
  • Mac转Windows的拯救指南
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • TypeScript实现数据结构(一)栈,队列,链表
  • Vue官网教程学习过程中值得记录的一些事情
  • 阿里云应用高可用服务公测发布
  • 高程读书笔记 第六章 面向对象程序设计
  • 基于HAProxy的高性能缓存服务器nuster
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 前端面试之CSS3新特性
  • 如何进阶一名有竞争力的程序员?
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 小试R空间处理新库sf
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • 7行Python代码的人脸识别
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 国内开源镜像站点
  • ​如何在iOS手机上查看应用日志
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • ###C语言程序设计-----C语言学习(6)#
  • #QT(一种朴素的计算器实现方法)
  • #面试系列-腾讯后端一面
  • (python)数据结构---字典
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (论文阅读30/100)Convolutional Pose Machines
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (限时免费)震惊!流落人间的haproxy宝典被找到了!一切玄妙尽在此处!
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (转载)从 Java 代码到 Java 堆
  • .FileZilla的使用和主动模式被动模式介绍
  • .java 9 找不到符号_java找不到符号
  • .Net 8.0 新的变化
  • .NET BackgroundWorker
  • .NET Framework、.NET Core 、 .NET 5、.NET 6和.NET 7 和.NET8 简介及区别
  • .NET 反射 Reflect
  • .NET 中选择合适的文件打开模式(CreateNew, Create, Open, OpenOrCreate, Truncate, Append)