[Unity workflows] Unity 5.6.1f1 与 Docker 和 Bitrise 的持续集成
CI 过程在软件开发的大多数领域都广为人知,尽管很难应用于 Unity 项目。那么是什么让 CI 难以在 Unity 项目中实施呢?多平台支持。当然,Unity 在营销方面做得很好,因为它坚持同时为多个平台开发是多么容易。然而,在实践中,它并不像“一键启动”那么简单。每个平台都有自己的工作流程,必须单独考虑(尤其是 iOS)。有限的命令行支持。Unity 提供了用于构建的 CLI;理论上对于 he
英文原文:https://thegamedev.guru/unity-workflows/continuous-integration-for-unity-5-6-1f1-with-docker-and-bitrise/
我敢打赌,您已经知道通过采用持续集成流程可以提高生产力,所以我将大致跳过这一部分。 当你停止手动做事的那一刻,你就会意识到你可以多么专注于真正重要的工作。

介绍
CI 过程在软件开发的大多数领域都广为人知,尽管很难应用于 Unity 项目。 那么是什么让 CI 难以在 Unity 项目中实施呢?
- 多平台支持。当然,Unity 在营销方面做得很好,因为它坚持同时为多个平台开发是多么容易。 然而,在实践中,它并不像“一键启动”那么简单。 每个平台都有自己的工作流程,必须单独考虑(尤其是 iOS)。
- 有限的命令行支持。Unity 提供了用于构建的 CLI; 理论上对于 headless 系统来说非常棒的功能。 但是,它往往会破裂,并且没有很好的文档记录。 每个必须处理批处理模式、无图形、强制 opengl 等的人都可以向您证实这一点。
- Linux 支持有限。大多数 CI 工具在 Linux 中运行良好,但遗憾的是 Unity 提供的 Linux 版本仍处于试验阶段。 它们工作得很好,并且经常是最新的,但是你可能会遇到破坏你的构建的边缘情况。 使用功能强大的 Mac 机器可能是合理的,因为您可以在那里构建最常见的目标。 然而,考虑到更强大的 linux 机器的价格较低,我们决定使用 Linux 以缩短构建时间。
- 许可证管理。要构建项目,您必须激活许可证,从而限制您可能拥有的并行构建数量。
我将保持这份文件简短; 我的主要目标是向您展示这样的 CI 系统是可能的、可行的和强大的。
流程概述
在开始之前,对该过程的快速总结可能会有所帮助,所以我们开始吧:
- 开发人员将提交推送到分支。
- 推送会在 Jenkins 等工具中触发构建作业。
- 一个 docker 容器是基于一个离线构建的镜像来实例化的。
- 调用 Bitrise CLI 以执行 yaml 配置文件中定义的构建步骤。
基本思想是让服务在推送分支或我们通过 REST API 调用(例如,通过 Unity 编辑器)触发构建时执行构建。 为此,我们选择了 Jenkins 。 这就像设置存储库并添加一个独特的构建步骤一样简单,该步骤使用一行 shell 脚本触发我们的构建过程。 那条魔法线是什么?
我正在谈论的那一行看起来像 docker-compose run android。 基本上,它告诉 docker 根据预先安装了所有内容的具体映像实例化一个容器,并运行配置文件中描述的 android 构建过程。 用于生成容器的映像包含特定版本的 Unity(撰写本文时为 5.6.1fx1)、正确的 SDK 和 NDK 版本以及构建管道所需的每个工具。 这样,我们避免了只会减慢进程的运行时安装。
在容器内,运行 Bitrise CLI。 在我们的例子中,它执行以下操作:
- 激活 Unity 许可证。 根据环境变量注入数据。
- 根据 Unity 的命令行触发 Unity 构建。
- 停用 Unity 许可证。
- 将工件存储并上传到第三方提供商,例如 S3、HockeyApp、FTP 等。
- 通知团队成员 (Slack)。
就是这样。
关于 Docker
简而言之,Docker 是一种允许用户动态创建、运行和销毁容器的技术。 容器是基于镜像的轻量级虚拟机。 这些 Image 就像模板,为我们的目的提供所需的环境。 与虚拟机相比,生成过程非常快,通常不到一秒钟。 通过这种方式,我们将构建过程彼此隔离,以便它们可以并行运行,甚至可以在不同的机器上运行。
这种范例的最大优势是提供了并行化、扩展和重新定位这些容器的灵活性,而无需每次在每个构建节点中手动设置操作系统环境。 您创建一次映像并在不同的机器上无休止地部署它,因为配置存储在映像中。 由于它们是容器,我们不会产生明显的性能开销。
我实际上为我们的目的构建了两个Images:
- unity-base-image:它包含了Unity在Linux上运行所需的所有常用软件,例如xvfb、android sdk/ndk的正确版本等。
- unity-image-5.6.1f1:该图像基于 unity-base-image,它所做的只是下载 Unity 并安装它。
我的 docker-compose.yml 文件的一部分如下所示:
android: image: unity-image-5.6.1f1:v1.1 command: bitrise run
android privileged: true environment:
- UNITY_EMAIL
- UNITY_PASSWORD
- UNITY_SERIAL
- HOCKEYAPP_ANDROID_APP_ID
- HOCKEYAPP_API_TOKEN volumes:
- ./:/bitrise/src
- /var/run/docker.sock:/var/run/docker.sock
您可能会注意到,我通过 Jenkins 设置的环境变量传递了一些(秘密)参数,因此它们不会在配置文件中得到版本控制。
关于 Bitrise CLI
Bitrise CLI 是一个执行构建过程的命令行应用程序。 您在 Yaml 文件中定义不同的工作流程和步骤,然后按顺序执行它们。 它背后最强大的概念之一是添加步骤的速度和简单性。
bitrise 构建步骤是开源的,您可以创建自己的。 有非常有用的,比如上传到 HockeyApp/S3/FTP,用 Fastlane 部署,用 XCode 归档和签名,下载和解压压缩文件,当然 shell 脚本也可以执行。 例如,我创建了自定义步骤来激活和停用 Unity 许可证以及触发 Unity 构建。 这些步骤旨在可重用,并且支持版本控制。
我的 bitrise.yml 的 Android 部分如下所示:
android:
steps:
- git::https://github.com/rubentorresbonet/activate-unity-license@master:
title: Activate Unity License
- git::https://github.com/rubentorresbonet/unity-build-ubs@master:
title: Trigger Android build
inputs:
- project_path: $PROJECT_PATH
- build_collection: $BUILD_COLLECTION
- git::https://github.com/rubentorresbonet/deactivate-unity-license@master:
title: Deactivate Unity License
- git::https://github.com/bitrise-io/steps-hockeyapp-deploy@master:
title: Upload APK to HockeyApp
inputs:
- ipa_path: $BUILDS_PATH/Android.apk
- app_id: $HOCKEYAPP_ANDROID_APP_ID
- api_token: $HOCKEYAPP_API_TOKEN
- notify: "0"
- git::https://github.com/bitrise-io/steps-slack-message@master:
title: Post build link to slack
inputs:
- webhook_url: $SLACK_WEBHOOK_URL
- message: "Android Build: $HOCKEYAPP_DEPLOY_PUBLIC_URL"
- emoji: ":panda_face:"
- emoji_on_error: ":cryingpanda:"
envs:
- BUILD_COLLECTION: Assets/BuildCollections/Android.asset
- PROJECT_PATH: $BITRISE_SOURCE_DIR/MyUnityProject
- BUILDS_PATH: $PROJECT_PATH/Builds
- SLACK_WEBHOOK_URL: https://hooks.slack.com/services/.....
- SLACK_CHANNEL: "#ci"
其他平台也可以类似地定位,最后 iOS 会有所不同,因为我们在 Linux 中运行这个过程。 在 iOS 案例中,当 xcode 项目在 Linux 中生成时,我将其上传到负责存档和签名的 bitrise 服务的在线版本,以及发布松弛通知等。在线服务具有 在预装了 xcode 并且理解 bitrise yaml 文件的 mac 虚拟机中运行构建的优势。
为什么这么麻烦?
看起来可能很难。 因为它是。 但是,使用 Unity 构建管道绝非易事。 那么,何苦呢?
| 降低构建时间 | 由于我们使用功能强大的 linux 机器(128 GB RAM、SSD、32 核),我们的构建需要更少的时间来完成,其中许多可以并行执行 |
|---|---|
| 便宜的 | Linux机器比其他替代品便宜得多 |
| 灵活性 | 许多有用的构建步骤易于集成,也易于创建和重用 |
| 可扩展的解决方案 | 配置一次,到处运行。 我们可以在不同的计算机上运行任意数量的节点; 他们只需要安装 docker,图像就会自动拉取。 一个节点坏了? 没问题,只需激活另一个 |
但是,肯定有一些缺点!
| 实验性Unity | Linux Unity 编辑器仍处于试验阶段。 Linux的市场份额正在增长! |
|---|---|
| 陡峭的学习曲线 | 不过,希望这篇文章能为您节省几个小时 |
总结
到目前为止,我对结果非常满意。 它不仅运行速度非常快(中等规模的 WebGL 和 Android 项目只需 3 到 4 分钟),而且非常灵活和可扩展。 我成功地为 iOS、WebGL 和 Android (il2cpp) 构建了我们的游戏。
更多推荐
所有评论(0)