Gitea+DroneCI搭建Unity3d轻量级持续集成平台
参考资料
- 本地代码托管网站推荐使用Gogs: A painless self-hosted Git service/Gitea,局域网的速度+仓库的大小不限+仓库的保密性这几个优点都建议在本地自己搭建代码托管平台,利用反向代理或者ipv6也可以支持互联网访问。
- ci平台选择Drone CI – Automate Software Testing and Delivery,优势基于docker,方便部属,与
gogs/gitea
连接紧密,配置简单,缺点就是插件较少Plugins | Drone,文档模糊不全。 - docker不再详述,Enterprise Container Platform | Docker 、 Docker Hub - Container Image Library | Docker
- Unity3d docker image:Docker Hub unity3d docker image, 有了这个才能让unity3d在搭建持续集成的平台上有了可行性。普通的编译性语言使用CI平台肯定是相当顺利了,就类似unity3d可视化游戏引擎要折腾一些,其他游戏引擎也可以参考类似的方法进行持续集成比如Docker Hub godot-ci
- unity3d纯命令操作,Unity - Manual: Command line arguments
执行步骤
0x00. 安装gitea
具体安装看官方文档,这里没有选择gogs,是因为gitea支持lfs
0x01. 安装运行drone ci
- docker拉取drone镜像
docker pull drone/drone:1
- 运行,
${DRONE_GITEA_SERVER}
是gitea
服务器的域名地址,${DRONE_SERVER_HOST}
是drone ci
服务器的域名地址,${DRONE_SERVER_PROTO}
是协议类型:http
/https
docker run \
--volume=/var/run/docker.sock:/var/run/docker.sock \
--volume=/var/lib/drone:/data \
--env=DRONE_GITEA_SERVER=${DRONE_GITEA_SERVER} \
--env=DRONE_GIT_ALWAYS_AUTH=false \
--env=DRONE_RUNNER_CAPACITY=2 \
--env=DRONE_SERVER_HOST=${DRONE_SERVER_HOST} \
--env=DRONE_SERVER_PROTO=${DRONE_SERVER_PROTO} \
--env=DRONE_TLS_AUTOCERT=false \
--publish=80:80 \
--publish=443:443 \
--restart=always \
--detach=true \
--name=drone \
drone/drone:1
0x02. 安装unity3d docker image
- docker拉取unity3d 2018.2.6f1,因为等下使用官方demo是这个版本
docker pull gableroux/unity3d:2018.2.6f1
- 自己的工程也可以选择其他版本,据说是有unity全版本支持的
- 默认的平台包括了
linux
、windows
、mac
、webgl
,不过针对android
和ios
平台比较特殊,好像是两个单独的镜像,后面还是自己做成一个镜像感觉会好一些
0x03. 测试步骤
- 下载Gabriel Le Breton / unity3d-gitlab-ci-example · GitLab测试工程,并上传到本地gitea上
- 然后输入
drone
的服务器地址,用gitea
的帐号密码登录,激活刚刚的unity3d-gitlab-ci-example
工程 - 然后开始获取unity的激活许可,这里需要使用docker进入unity的镜像操作,如下图,依然参照上面的example连接里面的激活教程,将里面的xml内容保存为
unity3d.alf
文件,然后上传到unity的激活许可网站上,最后得到一个Unity_v2018.x.ulf
文件,保存到example
工程目录下就可以了
- 然后再根据自己的测试快速修改一下
example
工程下的befor_script.sh
和build.sh
befor_script.sh
#!/usr/bin/env bash
set -e
set -x
mkdir -p /root/.cache/unity3d
mkdir -p /root/.local/share/unity3d/Unity/
set +x
echo 'Writing $UNITY_LICENSE_CONTENT to license file /root/.local/share/unity3d/Unity/Unity_lic.ulf'
#echo "$UNITY_LICENSE_CONTENT" | tr -d '\r' > /root/.local/share/unity3d/Unity/Unity_lic.ulf
cp Unity_v2018.x.ulf /root/.local/share/unity3d/Unity/Unity_lic.ulf
build.sh
#!/usr/bin/env bash
set -e
set -x
BUILD_TARGET=StandaloneLinux64
BUILD_NAME=ExampleProjectName
echo "Building for $BUILD_TARGET"
export BUILD_PATH=./Builds/$BUILD_TARGET/
mkdir -p $BUILD_PATH
${UNITY_EXECUTABLE:-xvfb-run --auto-servernum --server-args='-screen 0 640x480x24' /opt/Unity/Editor/Unity} \
-projectPath $(pwd) \
-quit \
-batchmode \
-buildTarget $BUILD_TARGET \
-customBuildTarget $BUILD_TARGET \
-customBuildName $BUILD_NAME \
-customBuildPath $BUILD_PATH \
-customBuildOptions AcceptExternalModificationsToPlayer \
-executeMethod BuildCommand.PerformBuild \
-logFile
UNITY_EXIT_CODE=$?
if [ $UNITY_EXIT_CODE -eq 0 ]; then
echo "Run succeeded, no failures occurred";
elif [ $UNITY_EXIT_CODE -eq 2 ]; then
echo "Run succeeded, some tests failed";
elif [ $UNITY_EXIT_CODE -eq 3 ]; then
echo "Run failure (other failure)";
else
echo "Unexpected exit code $UNITY_EXIT_CODE";
fi
ls -la $BUILD_PATH
[ -n "$(ls -A $BUILD_PATH)" ] # fail job if build folder is empty
- 在
example
工程下,创建一个.drone.yml
文件
kind: pipeline
name: default
steps:
- name: unity-build
image: gableroux/unity3d:2018.2.6f1
commands:
- chmod +x ./ci/before_script.sh && ./ci/before_script.sh
- chmod +x ./ci/build.sh && ./ci/build.sh
- 在
example
工程中,将上面的所有改动都提交推送到gitea
上 - 在浏览器中输入
drone
服务器的地址,既可以看到drone
自动打包的状态,直到打包完成
0x04. 上传资源
- 利用
drone
的Gitea Release | Drone插件,可以将上面打包文件上传到gitea
的release
页面 - 在
build.sh
末尾添加一行打包命令tar -zcvf $(pwd)/Builds/build.tar.gz $BUILD_PATH
- 再在
.drone.yml
中添加推送事件
kind: pipeline
name: default
steps:
- name: unity-build
image: gableroux/unity3d:2018.2.6f1
commands:
- chmod +x ./ci/before_script.sh && ./ci/before_script.sh
- chmod +x ./ci/build.sh && ./ci/build.sh
- name: unity-gitea-release
image: plugins/gitea-release
settings:
api_key: b12d6eb04cf32b9559ddfebdd8f9756ecf858c2c
base_url: http://192.168.1.222:3000
title: v_drone_0.1
files:
- ./Builds/build.tar.gz
when:
event: tag
- 再将修改推送到
gitea
上,并在此处打上一个标签推送到gitea
上, 等待打包完成,就可以在gitea
的release
界面看到最新对应标签的资源包,上面的when
是响应tag
事件才会执行的步骤
- 这里都是测试性步骤,通用性步骤应该是
clone->test->build->publish->notice
,带热更新资源的项目,在资源打包完成后,也可以自动将直接直接更新到服务器上
粗略解释
- 使用
docker
主要是因为drone
需要使用docker
,并且部署确实方便 unity3d-docker-image
的原理,就是在docker
里面安装了一个Linux
版本的unity3d
,再借助xvfb
虚拟一个X server
实现无界面运行unity3d
- 使用
unity3d
的命令模式-executeMethod
去执行工程下面的某一个脚本,比如测试工程的中BuildCommand.PerformBuild
,来实现打包功能,具体再参考最上面的链接和测试工程 unity3d-docker-image
的激活许可,是个比较麻烦的步骤,在后面使用docker build
打包自己实际项目对应的unity3d
版本,也是需要这个激活步骤的- 如果支持
android
和ios
两个平台的话,最好使用到cache server
来节省频繁切换平台的时间,命令模式-CacheServerIPAddress
可以支持连接缓存服务器