Gitea+DroneCI搭建Unity3d轻量级持续集成平台

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全版本支持的
  • 默认的平台包括了linuxwindowsmacwebgl,不过针对androidios平台比较特殊,好像是两个单独的镜像,后面还是自己做成一个镜像感觉会好一些

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工程目录下就可以了
    Gitea+DroneCI搭建Unity3d轻量级持续集成平台_第1张图片
  • 然后再根据自己的测试快速修改一下example工程下的befor_script.shbuild.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自动打包的状态,直到打包完成
    Gitea+DroneCI搭建Unity3d轻量级持续集成平台_第2张图片

0x04. 上传资源

  • 利用drone的Gitea Release | Drone插件,可以将上面打包文件上传到gitearelease页面
  • 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上, 等待打包完成,就可以在gitearelease界面看到最新对应标签的资源包,上面的when是响应tag事件才会执行的步骤
    Gitea+DroneCI搭建Unity3d轻量级持续集成平台_第3张图片
  • 这里都是测试性步骤,通用性步骤应该是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版本,也是需要这个激活步骤的
  • 如果支持androidios两个平台的话,最好使用到cache server来节省频繁切换平台的时间,命令模式-CacheServerIPAddress可以支持连接缓存服务器

你可能感兴趣的:(Unity)