Jenkins 构建流水线规范
1. 参数解析与初始化
# Python 脚本示例:解析 Jenkins 参数
import argparse
parser = argparse.ArgumentParser()
parser.add_argument("--svn_repo", help="SVN 仓库地址", required=True)
parser.add_argument("--unity_project", help="Unity 工程路径", default="./UnityProject")
parser.add_argument("--build_target", choices=["android", "ios"], default="android")
args = parser.parse_args()
2. 工作区清理
# 清理旧文件
import shutil, os
def clean_workspace():
# 删除旧 APK
if os.path.exists("./build"):
shutil.rmtree("./build")
# 还原 SVN 工程(避免残留冲突)
os.system("svn revert --recursive .")
os.system("svn cleanup --remove-unversioned")
3. 代码与资源更新
# SVN 更新与冲突检测
def update_code():
result = os.system("svn update --accept theirs-full")
if result != 0:
raise Exception("SVN 更新失败或存在未解决冲突!")
4. 资源分包处理
# 分包脚本核心逻辑
def split_assets():
# 1. 读取配置清单 asset_config.json
# 2. 按规则分割资源文件
# 3. 生成每个分包的 MD5 校验文件
# 4. 生成 version.xml(包含渠道 Sign、分包数量、服务器地址)
with open("version.xml", "w") as f:
f.write(f"<Version sign='{args.channel}'>...</Version>")
5. Unity 导出 Android 工程
# Unity 命令行导出(示例)
Unity -quit -batchmode -projectPath ./UnityProject -executeMethod BuildTool.ExportAndroidProject -logFile build.log
只保留主工程需要的文件,删除如mainfest,java,res的东西。
导出后清理冗余文件:
# 删除非必要文件(Gradle 构建专用)
to_delete = ["src", "res", "AndroidManifest.xml"]
for path in to_delete:
if os.path.exists(path):
shutil.rmtree(path)
6. Gradle 构建 APK
// build.gradle 优化配置
android {
buildTypes {
release {
minifyEnabled true
proguardFiles 'proguard-unity.txt'
signingConfig signingConfigs.release // 预配置签名
}
}
}
Jenkins 执行构建:
./gradlew assembleRelease --stacktrace
7. APK 加固与签名
# 使用 ACE 加固(命令行工具)
def reinforce_apk():
os.system("java -jar ace_cli.jar -i app-release.apk -o app-reinforced.apk")
# 强制重新签名(避免加固破坏签名)
os.system("apksigner sign --ks release.keystore app-reinforced.apk")
通过签名,玩家可以通过 apk大小生成一个哈希值,然后通过私钥+哈希值=证书,然后通过证书加算法可以得到对应的哈希值,然后通过哈希值可以反推apk文件是否发生改变,如果发生改变需要重新签名,
就相当于信封一样,证书和apk绑定在一起,如果修改apk就会导致哈希值变化也就是证书被损坏,所以任何导致apk变换的情况都需要重新签名,ace加固也会导致重新签名。
8. 上传与分发
# 上传至资源服务器(示例)
import requests
def upload_file(file_path):
headers = {"Authorization": "Bearer YOUR_TOKEN"}
with open(file_path, "rb") as f:
response = requests.post("https://cdn.yourdomain.com/upload", files={"file": f}, headers=headers)
if response.status_code != 200:
raise Exception("上传失败!")
# 上传符号表(Bugly 兼容)
upload_file("mapping.txt")
upload_file("app-release.md5")
通过以上规范,可实现高效、安全的自动化构建流程。建议配合 Jenkins Pipeline 可视化配置,并通过 Jenkinsfile
实现版本化构建脚本管理。