• jenkins流水线实现xjar加固


    jenkins流水线实现xjar加固

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

    xjar使用

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

    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>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    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}",
                                "- 测试状态:#00CD00' : '#EE0000'}'>${env.SUB_JOB_STATUS}",
                                "- 测试结果:[查看详情](${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']
                                    ]
                                )]
                            )
                        }
                    }
                }      
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104

    image-20230926113350206

    查看jenkins工作目录

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

    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"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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 "脚本执行完毕"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    基本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包加固到这里就结束了
    
    
    • 1
    • 2
    • 3
  • 相关阅读:
    CSS 基础知识-01
    大数据之LibrA数据库常见术语(五)
    Oracle数据库安装及配置
    Siamese Neural Network (SNN: 孪生神经网络)
    Arcgis js Api日常天坑问题3——加载geojson图层,元素无属性
    [Android开发学iOS系列] 快速上手UIKit
    二分套网络流:ABC320G
    SpringCloud Stream笔记整理
    Java 异常处理
    FPGA设计时序约束二、输入延时与输出延时
  • 原文地址:https://blog.csdn.net/tianmingqing0806/article/details/133302590