jenkins流水线实现xjar加固

news2024/11/26 2:36:37

jenkins流水线实现xjar加固

xjar的定义
Spring Boot JAR 安全加密运行工具,同时支持的原生JAR。
基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动,动态解密运行的方案,避免源码泄露或反编译
功能特性
无需侵入代码,只需要把编译好的JAR包通过工具加密即可。
完全内存解密,杜绝源码以及字节码泄露或反编译。
支持所有JDK内置加解密算法。
可选择需要加解密的字节码或其他资源文件,避免计算资源浪费。xxxxxxxxxx 功能特性无需侵入代码,只需要把编译好的JAR包通过工具加密即可。完全内存解密,杜绝源码以及字节码泄露或反编译。支持所有JDK内置加解密算法。可选择需要加解密的字节码或其他资源文件,避免计算资源浪费。

xjar使用

https://github.com/core-lib/xjar-maven-plugin

image-20230926112508480

修改项目中的pom.xml,一般都是开发改
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.5.RELEASE</version>
                <configuration>
                    <finalName>${project.name}</finalName>
                </configuration>
            </plugin>
            <!-- 打包时跳过test插件,不运行test测试用例 -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>${maven-surefire-plugin.version}</version>
                <configuration>
                    <skipTests>true</skipTests>
                </configuration>
            </plugin>
        </plugins>
    </build>

image-20230926112752708

jenkins流水线配置

image-20230926112914380

pipeline {   
    agent any    
    stages {
        stage('拉取代码') {
            steps { 
                checkout([
                    $class: 'GitSCM',
                    branches: [[name: '*/yangyu']],
                    gitTool: 'Default',
                    userRemoteConfigs: [[credentialsId: '6', url: 'xxx']]
                ])
            }
        }

        stage('发布系统审核') {
            steps {
                script {
            		hook = registerWebhook(authToken: 'xxx')
            		webhookId = hook.url.substring(hook.url.lastIndexOf('/') + 1)
                		
                    dingtalk (
                        robot: 'xxx',
                        type: 'ACTION_CARD',
                        title: '确认发布',
                        text: [
                            '**是否更新安装包**',
                            '',
                            '---',
                            "- 任务名称:${JOB_NAME}",
                            "- 构建ID:[#${env.BUILD_NUMBER}](${env.BUILD_URL})",
                            "- 构建人:${env.USER}",
                            "- 持续时长:${currentBuild.durationString}",
                            "- 测试状态:<font color='${env.color == 'true' ? '#00CD00' : '#EE0000'}'>${env.SUB_JOB_STATUS}</font>",
                            "- 测试结果:[查看详情](${env.SUB_JOB_URL})"                            
                        ],
                        btns: [
                            [
                                title: '确认',
                                actionUrl: "http://xxxx:8769/jenkins/webhook?url=${webhookId}&type=confirm&jobName=${JOB_NAME}&buildNumber=${env.BUILD_NUMBER}"
                            ],
                            [
                                title: '取消',
                                actionUrl: "http://xxxxx:8769/jenkins/webhook?url=${webhookId}&type=cancel&jobName=${JOB_NAME}&buildNumber=${env.BUILD_NUMBER}"
                            ]
                        ]
                    )
                    
                    // 30秒没有确认 取消任务
                    timeout(time: 300, unit: 'SECONDS') {
                        data = waitForWebhook hook
                        // 解析 JSON 字符串
                        def json = new groovy.json.JsonSlurperClassic().parseText(data)
                        def type = json.type
                        // 判断 type 的值
                        if (type == 'cancel') {
                            currentBuild.result = 'ABORTED'
                            error('任务被取消')
                        }
                    }
                }
            }
        } 

        stage('Promote to test') {
            
            steps {
                timeout(time: 5, unit: 'MINUTES') {
                    
                    script { 
                        sh 'mvn clean package "-Dxjar.password=123456" "-Dmaven.test.skip=true" -D profiles.active=dev'
                    } 
                        
                    script {
                        def commonTransferConfig = [
                            cleanRemote: false,
                            excludes: '',
                            execCommand: 'source /etc/profile && bash /mydata/docker-up.sh ',                            
                            execTimeout: 120000,
                            flatten: false,
                            makeEmptyDirs: false,
                            noDefaultExcludes: false,
                            patternSeparator: '[, ]+',
                            remoteDirectory: '/mydata/targz',
                            remoteDirectorySDF: false,
                            removePrefix: 'target/',
                            usePty: true
                        ]
                        
                        sshPublisher(
                            publishers: [sshPublisherDesc(
                                configName: 'centos-192.168.31.254',
                                transfers: [
                                    commonTransferConfig + [sourceFiles: 'target/hik-dev-xjar.jar'],
                                    commonTransferConfig + [sourceFiles: 'target/xjar_agentable.go'],
                                    commonTransferConfig + [sourceFiles: 'target/xjar.go']
                                ]
                            )]
                        )
                    }
                }
            }      
        }
    }
}

image-20230926113350206

查看jenkins工作目录

mvn clean package "-Dxjar.password=123456" "-Dmaven.test.skip=true" -D profiles.active=dev   #执行构建会生成这个

image-20230926113126688

远端服务器配置–☞需要授权的服务器

获取授权服务器信息

#!/bin/bash

# 获取IP地址列表
ip_addresses=$(hostname -I)

# 获取MAC地址列表并转换为大写
mac_addresses=$(ifconfig | grep -o -E '([0-9a-fA-F]{2}:){5}[0-9a-fA-F]{2}' | tr '[:lower:]' '[:upper:]' | tr '\n' ',' | sed 's/,$//')

# 获取CPU序列号
cpu_serial=$(sudo dmidecode -t processor | grep "ID" | awk -F': ' '{print $2}' | tr -d ' ')

# 获取主板序列号
mainboard_serial=$(dmidecode | grep 'Serial Number' | awk -F ':' '{print $2}' | head -n 1 )

# 输出结果
echo "IP地址:[$ip_addresses]"
echo "MAC地址:[$mac_addresses]"
echo "CPU序列号:$cpu_serial"
echo "主板序列号:$mainboard_serial"

image-20230926113623073

执行脚本

脚本内容,
1.判断镜像是否存在
2.把xjar.go解压,需要有go环境
3.制作镜像,然后把镜像制作成tar包
4…省略,有需要这个脚本大家可以自行更改

#!/bin/bash
# 1. 判断是否存在 hik-dev:v1.0 镜像,如果存在则删除
if docker image ls | grep -q 'hik-dev:v1.0'; then
    echo "发现 hik-dev:v1.0 镜像,删除中..."
    docker image rm hik-dev:v1.0
    echo "hik-dev:v1.0 镜像删除成功"
else
    echo "hik-dev:v1.0 镜像不存在"
fi

# 2. 进入 /mydata/targz 目录
cd /mydata/targz

# 3. 使用 go 解压包
echo "使用 go 解压包..."
go build xjar.go

# 4. 使用 Docker 构建 hik-dev:v1.0 镜像
echo "使用 Docker 构建 hik-dev:v1.0 镜像..."
docker build -t hik-dev:v1.0 .

# 5. 使用 Docker save 打包 hik-dev:v1.0 镜像
echo "使用 Docker save 打包 hik-dev:v1.0 镜像..."
docker save hik-dev:v1.0 > hik-dev.tar

# 6. 删除目录中除了 docker-compose.yaml 和 Dockerfile 的其他文件和目录
shopt -s extglob # 启用扩展模式匹配
echo "删除目录中除了 docker-compose.yaml 和 Dockerfile 的其他文件和目录..."
rm -r !("docker-compose.yaml"|"Dockerfile"|"hik-dev.tar")

# 7. 打包 /mydata/targz 目录
echo "打包 /mydata/targz 目录..."
tar -cvf /mydata/targz.tar /mydata/targz

echo "脚本执行完毕"
基本xjar包加固到这里就结束了

cker-compose.yaml 和 Dockerfile 的其他文件和目录…"
rm -r !(“docker-compose.yaml”|“Dockerfile”|“hik-dev.tar”)

7. 打包 /mydata/targz 目录

echo “打包 /mydata/targz 目录…”
tar -cvf /mydata/targz.tar /mydata/targz

echo “脚本执行完毕”


###### 基本xjar包加固到这里就结束了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nvm nodejs的版本管理工具

nvm 全英文名叫 node.js version management&#xff0c;是一个 nodejs 的版本管理工具&#xff0c;为了解决 nodejs 各种版本存在不兼容现象可以通过他安装和切换不同版本的 nodejs。 一、完全删除之前的 node 和 npm 1. 打开 cmd 命令窗口&#xff0c;输入 npm cache clean…

rs渲染VRAM内存不足怎么解决?Redshift 处理 VRAM 不足的情况

在某些极少数情况下&#xff0c;Redshift 可能会生成以下类型的消息并中止渲染&#xff1a; Redshift cannot operate with less than 256MB of free VRAM. Frame rendering aborted. 或者… There is less than 128MB of free VRAM once fixed data and minimal ray memory ar…

用简单例子讲清楚webgl模板测试

文章目录 搭建简易的webgl环境绘制简单三角形&#xff08;不带stencilTest)绘制另一个三角形&#xff08;不带模板测试&#xff09;加入模板测试总结调参练习 搭建简易的webgl环境 一直以来&#xff0c;我只是想通过搭建纯webgl环境&#xff0c;进行开发&#xff0c;来清楚地了…

计算机毕业设计 基于微信小程序的学习资料销售平台的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

IP地址最终弹,DNS,数据链路层,特殊地址

目录 一、特殊地址 二、数据链路层 三、DNS 一、特殊地址 将IP地址中的主机IP全部设置为0&#xff0c;就成了网络号&#xff0c;代表这个局域网&#xff08;不可给具体的设备分配这个IP&#xff09; 将IP地址中的主机IP全部设置为1&#xff0c;就成了广播地址&#xff0c;给同…

灰色预测GM(1,1)

目录 一、灰色预测模型简介 二、GM(1,1)灰色模型 1、GM(1,1)模型预测方法 &#xff08;1&#xff09;原始数据&#xff08;参考列&#xff09; &#xff08;2&#xff09;累加生成序列&#xff08;Acumulated Generating Operator,1-AGO&#xff09; &#xff08;3&#xff…

一台电脑安装多个不同版本Python

1、前提 当前Windows电脑下已经安装了一个python3.11&#xff0c;现在需要安装一个python3.9。下载地址&#xff1a;Python Releases for Windows | Python.org 2、步骤 找到对应的版本&#xff0c;并下载安装包。下载后&#xff0c;打开安装包。按图片勾选&#xff0c;点击n…

【网络安全自学宝典】从零开始自学网络安全,按照这个路线就可以了

前景 很多零基础朋友开始将网络安全作为发展的大方向&#xff0c;的确&#xff0c;现如今网络安全已经成为了一个新的就业风口&#xff0c;不仅大学里开设相关学科&#xff0c;连市场上也开始大量招人。那么网络安全到底前景如何&#xff1f;大致从市场规模、政策扶持、就业方…

共赴华为全联接大会2023,新点软件携手加速数字政府建设

数字技术使能&#xff0c;加速行业智能化。9月20—22日&#xff0c;华为全联接大会2023在上海拉开序幕&#xff0c;来自全球ICT产业的业界思想领袖、商业精英、技术专家、先锋企业、生态合作伙伴、应用服务商以及开发者共襄盛会&#xff0c;共同探讨行业智能化的未来路径。 作…

【c语言】详解动态内存管理

目录 关于动态内存分配malloc和calloc函数介绍动态内存回收----freerealloc函数介绍常见的动态内存错误 关于动态内存分配 回想一下我们之前学过的内存开辟方式&#xff1a; int val 20;//在栈空间上开辟四个字节 char arr[10] {0};//在栈空间上开辟10个字节的连续空间在学…

Windows系统ping命令的c++实现

// ping.cpp : 定义控制台应用程序的入口点。 //#include <winsock2.h> #include <stdio.h> #include <stdlib.h> #define ICMP_ECHO 8 #define ICMP_ECHOREPLY 0 /* The IP header */ typedef struct iphdr { unsigned char h_len:4; // length of the…

什么是内容运营?

关于内容运营&#xff0c;在不同种类的公司&#xff0c;侧重点也不一样。 电商平台的内容运营岗更偏内容营销&#xff1b;产品功能比较简单的公司&#xff0c;内容运营和新媒体运营的岗位职责差不多&#xff1b;而内容平台的内容运营更多的是做内容的管理和资源整合。

使用ElementUI结合Vue完善主页的导航菜单和书籍管理的后台数据分页查询

目录 一、动态树 ( 1 ) 数据表 ( 2 ) 后端 ( 2 ) 前端 二、书籍管理 数据表 后端 前端 ElementUI的背景 是一套基于Vue.js的桌面端组件库&#xff0c;由饿了么前端团队开发维护。它提供了丰富的UI组件和交互效果&#xff0c;可以帮助开发者快速构建出美观、易用的We…

第77步 时间序列建模实战:多因素预测 vol-2(以ARIMA为例)

基于WIN10的64位系统演示 一、写在前面 上一期&#xff0c;我们构建了多变量的ARIMA时间序列预测模型&#xff0c;其实人家有名字的&#xff0c;叫做ARIMAX模型&#xff08;X就代表解释变量&#xff09;。 这一期&#xff0c;我们介绍其他机器学习回归模型如何建立多变量的时…

『C语言进阶』qsort函数及模拟实现

&#x1f525;博客主页&#xff1a; 小羊失眠啦 &#x1f516;系列专栏&#xff1a; C语言 &#x1f325;️每日语录&#xff1a;没有退路&#xff0c;只能让自己变得强大 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 前言 在上篇指针进阶中&#xff0c;我们对函数指针、函数…

深入理解 Swift 新并发模型中 Actor 的重入(Reentrancy)问题

问题现象 我们知道,Swift 5.5 引入的新并发模型极大简化了并行逻辑代码的开发,更重要的是:使用新并发模型中的 Actor 原语可以大大降低并发数据竞争的可能性。 不过,即便 Actor 有如此神奇之功效,它也不是“万能药”,仍不能防止误用带来的问题。比如:Actor 重入(Reen…

132.【MySQL_进阶篇】

MySQL_进阶 (一)、存储引擎1.MySQL体系结构(1).连接层(2).服务层(3).引擎层(4).存储层 2.存储引擎简介(1).查看某张表的数据引擎(2).展示此版本支持的所有存储引擎(3).创建表my_myisam,并指定MyIASM存储引擎(4).存储引擎示列 3.存储引擎 _ Innodb(1).Innodb 介绍(2).Innodb 特点…

通过 HelpLook ChatBot AI自动问答机器人降低客户服务成本

在当今竞争激烈的商业环境中&#xff0c;提供卓越的客户服务对于维持忠诚的客户群和推动业务增长至关重要。客户服务涵盖了公司与其客户之间的所有互动&#xff0c;包括解答问题、解决问题和提供支持。它在塑造客户对品牌的看法方面起着关键作用&#xff0c;并且可以显著影响他…

NSSSCTF做题(2)

1.[BJDCTF 2020]easy_md5 打开页面发现没什么东西&#xff0c;只有一个提交表单&#xff0c;然后url会显示你提交的信息 源代码里也看不到什么 &#xff0c;用dirsearch扫一下&#xff0c;这些是扫出来的数据 抓包看到了提示 hint: select * from admin where passwordmd5($pas…