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包加固到这里就结束了
相关推荐
佐杰5 分钟前
什么是DevOps
运维·devops
CaracalTiger6 分钟前
本地部署 Stable Diffusion3.5!cpolar让远程访问很简单!
java·linux·运维·开发语言·python·微信·stable diffusion
梁萌1 小时前
linux中使用docker安装MySQL
linux·运维·docker·容器·mysql安装
文言一心1 小时前
SenseVoice 离线部署指南(Xinference Docker v1.12)
运维·docker·ai·容器
AIchiNiurou1 小时前
mermaid install for free docker
运维·docker·容器
wei_shuo1 小时前
智能运维×低资源占用:金仓数据库助力能源企业降本增效与国产化替换实践
运维·数据库·king base
❀͜͡傀儡师1 小时前
根据docker服务保存日志脚本,时间可选版本
运维·docker·容器
搬砖的小码农_Sky1 小时前
Ubuntu Desktop Linux 文件和文件夹操作命令详解
linux·运维·ubuntu
落日漫游1 小时前
Ansible主机清单:自动化管理的核心基石
运维·ansible
gpfyyds6662 小时前
配置dns主从服务。要求从服务器能够定时从主服务器同步数据。
运维·服务器