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

前言

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

一、去官网下载

1.1 官网安装命令

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

wget -O /usr/share/keyrings/jenkins-keyring.asc \
    https://pkg.jenkins.io/debian-stable/jenkins.io-2023.key

  echo "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/null
 
 sudo apt-get update
 sudo apt-get install fontconfig
 sudo 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]
...
#执行脚本前,运行一下设置环境变量
#这样做的好处是,即使在jenkins的pipline中,也可以使用linux的环境变量了
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
gitTagmastergit分支

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

3.3 jenkins文件

import java.text.SimpleDateFormat

node{

    def remote = [:]
    remote.name = '地下室主机'
    remote.host = '192.168.0.64'
    remote.user = 'root'
    remote.password = '???@1314'
    remote.deploymentHome = "/WORK/APP/study2024-class003"
    remote.allowAnyHosts = true

    def 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 code
            mvn clean
            mvn 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}/bin
            chmod +x startup.sh
            chmod +x shutdown.sh
            """
        }

        echo "启服"
        sshCommand remote: remote, command: """
        source /etc/profile
        echo "path = $PATH"
        cd ${remote.deploymentHome}/${app.cd}/bin
        ./startup.sh --version ${app.version} --appName ${app.cd} --port ${app.port}
        """
    }

}

3.4 启动

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/887058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

针对考研的C语言学习(定制化快速掌握重点4)

typedef的使用 简化变量类型 逻辑结构 集合结构:无关系 线性结构:一对一 树形结构:一对多 图形结构:多对多 存储结构 顺序存储和链式存储(考代码) 顺序存储优点:1.可以实现随机存取。2.…

C语言 | Leetcode C语言题解之题451题根据字符出现频率排序

题目: 题解: #define HASH_FIND_CHAR(head, findint, out) HASH_FIND(hh, head, findint, sizeof(char), out) #define HASH_ADD_CHAR(head, intfield, add) HASH_ADD(hh, head, intfield, sizeof(char), add)struct HashTable {char key;int val;UT_ha…

今日凌晨,ChatGPT重磅更新!—— 我心目中的终极AGI界面

今日凌晨,ChatGPT重磅更新!—— 我心目中的终极AGI界面 我心目中的终极 AGI 界面是一张空白画布(canvas)。 今日凌晨,OpenAI 发布 canvas,一个与 ChatGPT 合作写作和编程的新界面! canvas&…

C语言复习概要(二)

本文目录 C语言中的数组与函数详解1. 引言2. 数组2.1. 什么是数组?语法:示例: 2.2. 数组的初始化示例 1:在声明时初始化示例 2:部分初始化示例 3:运行时赋值 2.3. 数组的访问与修改示例: 2.4. 多…

Docker启动 Redis提示:Can‘t initialize Background Jobg

问题说明: 在使用docker启动redis失败,但是查看容器日志,除了提示 Fatal:Cant initialize Background Jobg,没有其他错误信息。经过长时间查找资料及试错,现记录下可能的产生原因及解决方案,以便以后参考。 产生原因&…

【从零开始实现stm32无刷电机FOC】【实践】【7.1/7 硬件设计】

目录 stm32电路磁编码器电路电机驱动电路电流采样电路电机选择本文示例硬件说明 为了承载和验证本文的FOC代码工程,本节设计了一个简易的三相无刷电机 硬件套件,主控采用非常常用的stm32f103c8t6单片机,电机编码器采用MT6701,电机…

mysql怎么修改一个字段中的所有部分数据

UPDATE videos SET VideoCode replace(VideoCode,flv,mp4); update 表名 set 字段名 replace(字段名,‘修改前’,‘修改后’);

【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段

文章目录 【工欲善其事】巧用 Sublime Text 生成带格式的 HTML 片段1 问题由来2 操作流程步骤1:打开代码片段定制页步骤2:在新标签页输入定制 XML步骤3:保存定义内容步骤4:功能测试 3 拓展 【工欲善其事】巧用 Sublime Text 生成带…

Elasticsearch使用Easy-Es + RestHighLevelClient实现深度分页跳页

注意!!!博主只在测试环境试了一下,没有发到生产环境跑。因为代码还没写完客户说不用弄了( •̩̩̩̩_•̩̩̩̩ ) 也好,少个功能少点BUG 使用from size的时候发现存在max_result_window10000的限制&…

如何使用工具删除 iPhone 上的图片背景

在 iPhone 上删除背景图像变得简单易行。感谢最近 iOS 更新中引入的新功能。如今,iOS 用户现在可以毫不费力地删除背景,而无需复杂的应用程序。在这篇文章中,您将学习如何使用各种方法去除 iPhone 上的背景。这可确保您可以选择最适合您偏好的…

自动驾驶核心技术:感知融合、规划决策、控制执行

1、前言 简单来说,实现自动驾驶需要解决三个核心问题:“我在哪?我要去哪?我该如何去?”能完整解决这三个问题就是真正的自动驾驶。 目前,自动驾驶汽车关键技术主要包括环境感知、精准定位、决策与规划、控制与执行、高精地图与车联网V2X以…

Linux下的IO模型

阻塞与非阻塞IO(Input/Output) 阻塞与非阻塞IO(Input/Output)是计算机操作系统中两种不同的文件或网络通信方式。它们的主要区别在于程序在等待IO操作完成时的行为。 阻塞IO(Blocking IO) 在阻塞IO模式下…

无IDEA不Java:快速掌握Java集成开发环境

IntelliJ IDEA是一种强大的Java集成开发环境,是Java开发人员的首选工具之一。本文将介绍IDEA的基本使用方法和常用功能,以帮助初学者快速上手。 安装和配置 首先,需要下载并安装IntelliJ IDEA。在安装完成后,需要配置JDK&#xff…

pygame--超级马里奥(万字详细版)

超级马里奥点我下载https://github.com/marblexu/PythonSuperMario 1.游戏介绍 小时候的经典游戏,代码参考了github上的项目Mario-Level-1,使用pygame来实现,从中学习到了横版过关游戏实现中的一些处理方法。原项目实现了超级玛丽的第一个小…

稀缺森林火险等级预测算法,基于xgboost方法的火险等级预测,共划分5级,依据当前地区月份,降水量,风力等参数进行预测,并提供15000字的报告

森林火险等级预测算法,基于xgboost方法的火险等级预测,共划分5级,依据当前地区月份,降水量,风力等参数进行预测,并提供15000字的报告 森林火险等级预测算法介绍 项目名称 基于XGBoost的森林火险等级预测算…

无环SLAM系统集成后端回环检测模块(loop):SC-A-LOAM以及FAST_LIO_SLAM

最近在研究SLAM目标检测相关知识,看到一篇论文,集成了SC-A-LOAM作为后端回环检测模块,在学习了论文相关内容后决定看一下代码知识,随后将其移植,学习过程中发现我找的论文已经集成了回环检测模块,但是我的另…

mybatis-plus使用总结

基本使用 mybatis-plus依赖 <!-- mybatis-plus开始 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.7</version></dependency><dependency>&l…

【Linux探索学习】第二弹——Linux的基础指令(中)——夯实基础第二篇

Linux基础指令&#xff08;上&#xff09;&#xff1a;【Linux探索学习】第一弹——Linux的基本指令&#xff08;上&#xff09;——开启Linux学习第一篇-CSDN博客 前言&#xff1a; 在前面我们已经讲解了一些常用的Linux的基础指令&#xff0c;那些当然是远远不够的&#xff…

自定义 shell文件系统

&#x1f3f7;️ 材料准备 创建一个文件:myshell.c: #include <stdio.h>int main() {return 0; }创建一个 Makefile 文件&#xff0c;文件内容如下&#xff1a; 1 mybash:myshell.c2 g -o $ $^ -stdc11 3 .PHONY:…

仿RabbitMQ实现消息队列服务端(二)

文章目录 ⽹络通信协议设计信道管理模块连接管理模块服务器模块实现 ⽹络通信协议设计 其中⽣产者和消费者都是客⼾端&#xff0c;它们都需要通过⽹络和BrokerServer进⾏通信。具体通信的过程我们使⽤Muduo库来实现&#xff0c;使⽤TCP作为通信的底层协议&#xff0c;同时在这个…