jenkins流水线实现xjar加固

jenkins流水线实现xjar加固

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

xjar使用

复制代码
https://github.com/core-lib/xjar-maven-plugin
修改项目中的pom.xml,一般都是开发改
shell 复制代码
    <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>

jenkins流水线配置

shell 复制代码
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']
                                ]
                            )]
                        )
                    }
                }
            }      
        }
    }
}

查看jenkins工作目录

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

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

获取授权服务器信息

复制代码
#!/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"

执行脚本

脚本内容,

1.判断镜像是否存在

2.把xjar.go解压,需要有go环境

3.制作镜像,然后把镜像制作成tar包

4...省略,有需要这个脚本大家可以自行更改

shell 复制代码
#!/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包加固到这里就结束了
相关推荐
用户0328472220709 小时前
如何搭建本地yum源(上)
运维
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
AC赳赳老秦3 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw
java_cj3 天前
深入kube-apiserver认证机制:从Bearer Token到mTLS的完整认证链解析
linux·运维·服务器·云原生·容器·kubernetes