在小游戏开发中,手动完成代码拉取、项目构建、资源混淆、预览和上传等步骤耗时且容易出错。借助 Jenkins,我们可以搭建一个自动化流水线,将这些任务整合为高效的工作流程。本文将介绍 Jenkins 的基本概念、安装与部署方法,并基于一个实际的 Pipeline 示例,展示如何自动化构建、混淆、预览和上传小游戏(以某轻量级游戏平台为例)。我们会聚焦核心实现逻辑,展示部分通用代码片段(不暴露真实信息),并介绍相关脚本的作用,最后提供 Pipeline 结构大纲。
一、什么是 Jenkins?Jenkins 是一个开源的自动化服务器,广泛应用于持续集成(CI)和持续部署(CD)。通过 Pipeline 脚本(声明式或脚本式),开发者可以定义从代码拉取到部署的完整流程。对于小游戏开发,Jenkins 能整合 Git、游戏引擎(如 Cocos Creator)、代码混淆工具和平台 CLI,实现从开发到上线的自动化。Jenkins 的核心优势
灵活性:支持插件生态,适配 Git、Python、邮件通知等。
可扩展性:Pipeline 支持复杂工作流定制。
易用性:Web 界面便于任务配置和监控。
二、Jenkins 安装与部署1. 安装 Jenkins以下以 Windows 系统为例,简述安装步骤:
下载 Jenkins:
从 Jenkins 官网 下载 .war 文件。
运行命令启动:
java -jar jenkins.war --httpPort=8080
安装 Java:
Jenkins 依赖 Java,推荐安装 JDK 11 或 17(下载自 Oracle JDK)。
配置环境变量,确保 java -version 正常运行。
初始化:
访问 http://localhost:8080,输入 ~/.jenkins/secrets/initialAdminPassword 中的初始密码。
安装推荐插件(如 Git、Pipeline、Credentials),创建管理员账户。
2. 配置环境
安装工具:
Git:用于拉取代码。
Python:运行混淆和上传脚本。
Node.js:支持平台 CLI(如 tmg)。
游戏引擎:如 Cocos Creator,确保 CLI 可调用。
配置插件:
安装 Git、Pipeline 和 Credentials 插件。
在 Jenkins 中添加 Git 凭据(用户名/密码或 SSH 密钥)。
全局配置:
在 Manage Jenkins > Global Tool Configuration 中配置 JDK、Git、Node.js 路径。
设置环境变量(如引擎路径、脚本路径)。
3. 创建 Pipeline 项目
在 Jenkins 首页点击“新建任务”,选择“Pipeline”。
输入任务名称,粘贴 Pipeline 脚本(后文介绍)。
保存并运行测试。
三、自动化构建小游戏的核心流程我们以一个基于 Cocos Creator 的小游戏项目为例,目标是自动化构建并上传到某轻量级游戏平台。以下是 Pipeline 的核心设计思路,包含部分通用代码(不暴露真实信息)。核心思想
模块化:将流程拆分为独立阶段(如拉取代码、构建、混淆、上传),可通过参数控制。
参数化:允许用户选择是否执行构建、预览、上传等步骤。
错误处理:检测构建错误,及时中断并通知。
通知机制:通过内网消息或邮件反馈构建状态。
用到的脚本及其作用
日志检查脚本(Python,check_log.py):
作用:解析构建日志,检查是否存在特定错误(如时间戳异常)。
示例代码:
python
import sys with open(sys.argv[1], 'r') as f: if "bad timestamp" in f.read(): sys.exit(1) sys.exit(0)
代码混淆脚本(Python,obfuscate_js.py):
作用:对 JavaScript 代码进行混淆,增强安全性。
示例代码:
python
import os from javascript_obfuscator import obfuscate input_path = sys.argv[1] obfuscate(input_path, output_path=os.path.join(input_path, "obfuscated"))
图片混淆脚本(Python,obfuscate_images.py):
作用:处理图片资源(JPG/PNG),防止资源被轻易提取。
示例代码:
python
import os from PIL import Image input_dir = sys.argv[1] for file in os.listdir(input_dir): if file.endswith(('.jpg', '.png')): img = Image.open(os.path.join(input_dir, file)) # 应用混淆逻辑(如添加水印) img.save(os.path.join(input_dir, f"obf_{file}"))
CDN 上传脚本(Python,upload_cdn.py):
作用:将资源上传至 CDN(如火山引擎)。
示例代码:
python
import sys import boto3 # 示例使用 AWS SDK,实际替换为 CDN API client = boto3.client('s3', endpoint_url=sys.argv[2]) client.upload_file(sys.argv[1], 'bucket', 'remote/file')
二维码处理脚本(Python,process_qr.py):
作用:优化生成的预览二维码图片。
示例代码:
python
from PIL import Image img = Image.open(sys.argv[1]) img = img.convert('RGB') # 转换为标准格式 img.save(sys.argv[1])
平台预览与上传脚本(Node.js,preview.js 和 upload.js):
作用:调用平台 CLI(如 tmg)生成预览二维码或上传构建产物。
示例代码(preview.js):
javascript
const { execSync } = require('child_process'); execSync(`tmg preview -o ./qrcode.png`, { stdio: 'inherit' });
关键步骤解析
代码拉取:
从 Git 仓库拉取指定分支代码。
示例代码:
groovy
stage('更新代码') { steps { dir('project_path') { git branch: 'main', credentialsId: 'git-cred-id', url: 'https://example.com/repo.git' } } }
分配预览地址:
生成时间戳,构造预览二维码 URL。
示例代码:
groovy
stage('分配预览地址') { steps { script { def timestamp = new Date().format("HH.mm.ss-MM-dd-yyyy") echo "Preview URL: http://server/qrcode/preview-${params.Version}-${timestamp}.png" } } }
项目构建:
调用 Cocos Creator CLI 构建项目,检查日志错误。
示例代码:
groovy
stage('构建工程') { steps { dir('project_path') { script { if (params.Build) { def code = bat returnStatus: true, script: "creator.exe --project . --build configPath=build.json" if (code != 0) error("Build failed with code ${code}") } } } } }
代码混淆:
运行 Python 脚本混淆 JS 代码。
示例代码:
groovy
stage('代码混淆') { steps { script { if (params.Obfuscation) { bat "python obfuscate_js.py build/output" } } } }
资源上传:
上传资源至 CDN,验证结果。
示例代码:
groovy
stage('资源上传') { steps { script { if (params.UploadBundle) { bat "python upload_cdn.py build/remote https://cdn.example.com" } } } }
图片混淆:
运行 Python 脚本处理图片资源。
示例代码:
groovy
stage('图片混淆') { steps { script { if (params.ObfuscationImage) { bat "python obfuscate_images.py build/output" } } } }
平台预览:
生成预览二维码,发送通知。
示例代码:
groovy
stage('平台预览') { steps { script { if (params.Preview) { bat "tmg preview -o qrcode.png" bat "python process_qr.py qrcode.png" } } } }
平台上传:
上传构建产物至平台。
示例代码:
groovy
stage('平台上传') { steps { script { if (params.Upload) { bat "tmg upload -v ${params.Version}" } } } }
通知机制:
发送内网消息或邮件通知。
示例代码:
groovy
post { success { mail to: 'team@example.com', subject: 'Build Success', body: 'Build completed successfully.' } }
四、Pipeline 脚本大纲
Pipeline {
Agent: 任意节点
Parameters:
- Version: 版本号(字符串)
- Build: 是否构建(布尔)
- Preview: 是否预览(布尔)
- Upload: 是否上传(布尔)
- LocalMsg: 是否内网通知(布尔)
- EmailNotice: 是否邮件通知(布尔)
- Obfuscation: 是否代码混淆(布尔)
- ObfuscationImage: 是否图片混淆(布尔)
- UploadBundle: 是否上传资源(布尔)
Environment:
- Git 仓库、分支、项目路径
- 引擎路径、构建配置路径
- 脚本路径(日志检查、混淆、上传、预览)
Stages:
1. 更新代码
- 拉取 Git 分支
2. 分配预览地址
- 生成时间戳和二维码 URL
3. 构建工程
- 执行游戏引擎构建
- 检查日志错误
- 发送通知
4. 代码混淆
- 运行混淆脚本
- 发送通知
5. 资源上传
- 上传至 CDN
- 发送通知
6. 图片混淆
- 处理图片资源
- 发送通知
7. 平台预览
- 生成二维码
- 发送通知
8. 平台上传
- 上传至平台
- 发送通知
Post:
- 邮件通知(成功、失败)
}
五、总结通过 Jenkins Pipeline,我们可以将小游戏开发的复杂流程自动化,从代码拉取到平台上传一气呵成。参数化设计让流程灵活可控,脚本支持(Python、Node.js)增强了混淆和上传能力,通知机制则提升了团队协作效率。对于小游戏开发者,这套流程能显著节省时间并确保质量。尝试搭建你的 Jenkins 流水线,体验自动化的魅力!有问题或优化建议,欢迎留言交流!
评论区