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包加固到这里就结束了
相关推荐
tingting011924 分钟前
docker 释放磁盘空间--常用清理命令
运维·docker·容器
乐维_lwops30 分钟前
安全筑堤,效率破浪 | 统一运维管理平台下的免密登录应用解析
运维·服务器·安全
恩爸编程1 小时前
深入浅出 Linux 操作系统
linux·运维·服务器·linux系统介绍·linux操作系统介绍·linux操作系统是什么·linux操作是什么
明达技术1 小时前
分布式 I/O 配合高冗余 PLC,打造高效控制新典范
运维·分布式
激进的猴哥1 小时前
day20-yum精讲
linux·运维·服务器
忆源1 小时前
Linux基础--1.1 什么是 Linux 操作系统
linux·运维·服务器
dessler1 小时前
Docker-Dockerfile案例(一)
linux·运维·docker
徐子元竟然被占了!!2 小时前
磁盘分区格式
运维·服务器
Luke~~3 小时前
实验室服务器Ubuntu安装使用全流程
linux·运维·ubuntu
苹果醋34 小时前
Vue3响应式数据: 深入分析Ref与Reactive
java·运维·spring boot·mysql·nginx