jenkins流水线实现xjar加固
xjar的定义
Spring Boot JAR 安全加密运行工具,同时支持的原生JAR。
基于对JAR包内资源的加密以及拓展ClassLoader来构建的一套程序加密启动,动态解密运行的方案,避免源码泄露或反编译
功能特性
无需侵入代码,只需要把编译好的JAR包通过工具加密即可。
完全内存解密,杜绝源码以及字节码泄露或反编译。
支持所有JDK内置加解密算法。
可选择需要加解密的字节码或其他资源文件,避免计算资源浪费。xxxxxxxxxx 功能特性无需侵入代码,只需要把编译好的JAR包通过工具加密即可。完全内存解密,杜绝源码以及字节码泄露或反编译。支持所有JDK内置加解密算法。可选择需要加解密的字节码或其他资源文件,避免计算资源浪费。
xjar使用
https://github.com/core-lib/xjar-maven-plugin
修改项目中的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>
jenkins流水线配置
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工作目录
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…省略,有需要这个脚本大家可以自行更改
#!/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包加固到这里就结束了