英文原文: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 系统是可能的、可行的和强大的。

流程概述

  在开始之前,对该过程的快速总结可能会有所帮助,所以我们开始吧:

  1. 开发人员将提交推送到分支。
  2. 推送会在 Jenkins 等工具中触发构建作业。
  3. 一个 docker 容器是基于一个离线构建的镜像来实例化的。
  4. 调用 Bitrise CLI 以执行 yaml 配置文件中定义的构建步骤。

  基本思想是让服务在推送分支或我们通过 REST API 调用(例如,通过 Unity 编辑器)触发构建时执行构建。 为此,我们选择了 Jenkins 。 这就像设置存储库并添加一个独特的构建步骤一样简单,该步骤使用一行 shell 脚本触发我们的构建过程。 那条魔法线是什么?

  我正在谈论的那一行看起来像 docker-compose run android。 基本上,它告诉 docker 根据预先安装了所有内容的具体映像实例化一个容器,并运行配置文件中描述的 android 构建过程。 用于生成容器的映像包含特定版本的 Unity(撰写本文时为 5.6.1fx1)、正确的 SDK 和 NDK 版本以及构建管道所需的每个工具。 这样,我们避免了只会减慢进程的运行时安装。

在容器内,运行 Bitrise CLI。 在我们的例子中,它执行以下操作:

  1. 激活 Unity 许可证。 根据环境变量注入数据。
  2. 根据 Unity 的命令行触发 Unity 构建。
  3. 停用 Unity 许可证。
  4. 将工件存储并上传到第三方提供商,例如 S3、HockeyApp、FTP 等。
  5. 通知团队成员 (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) 构建了我们的游戏。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐