自定义CI / CD for Unity

图片

现在,我将告诉您在一家小型gamedev公司中Unity的开发过程是什么样的,以及我们如何改进和自动化它。 尽管如此,2020年仍在院子里,足以用鼠标驱动...

关于鼠标,这可不是开玩笑的。 直到最近,与我们一起测试和开发游戏的过程看起来像这样:

安卓系统


  1. 开发人员编写代码
  2. 即将推出Android版本
  3. 上传到Google云端硬盘上的共享文件夹
  4. 测试人员下载最新版本
  5. 在Redmine中测试并抛出任务
  6. 转到:步骤1

iOS版本有点棘手:

的iOS


  1. 开发人员编写代码
  2. 前往Xcode专案
  3. Postbuild脚本向其中添加了本地化,SDK等
  4. 编译项目
  5. 已封存
  6. 导出到IPA文件(这不是很快就完成的,哈哈)
  7. 之后,您可以将IPA上传到Google云端硬盘上的共享文件夹
  8. 或上传到TestFlight,您可以在其中等待几天
  9. 测试仪下载最新的IPA
  10. 连接设备,安装应用程序
  11. 在Redmine中测试并抛出任务
  12. 转到:步骤1

这真是一种悲伤。 如果对于Android,该过程仍然可以接受(否),那么对于iOS,一切都非常漫长,不便且错误。 另外,大多数操作都是由开发人员手动完成的(此处是关于鼠标的操作),并且可能花费在开发上的时间要等待编译,导出Xcode项目等等。 还必须考虑到每个人都在同一个办公室,即 在开始整个地狱过程之前,您可以问/说些什么。

但是,总的来说,它可以正常工作并发布游戏:)

最近,在另一位热爱自行车制造和一切优化的爱好者Leopotam的申请下,我决定使这一过程自动化。 结果是一个BASH脚本,它可以:

  • 从GIT存储库下载最新更改
  • 运行测试
  • 在开发和发布中构建适用于Android的APK
  • 在开发和发布中为iOS Xcode构建一个项目
  • 编译它
  • 存档和导出IPA
  • 为它生成清单
  • 生成要安装的HTML页面
  • 使用sshpass将所有内容上传到服务器
  • 将所有日志放在单独的文件夹中
  • 发送电报通知

只需按一下按钮,所有这些。 无需启动Unity和Xcode。 以某种方式更有趣吧?

图片

现在,当组装完成时,测试人员会在Telegram中收到一条通知,其中包含两个指向Android和iOS版本的链接。 仍然需要仔细研究它们并直接从设备安装应用程序。 它也可以在iOS下运行,并为此生成一个特殊的清单。

实际上,这是我第一次在BASH编程方面的经验,所以无论是否在风水中,我都不知道它是什么,但是它可以正常工作。 无论如何,脚本都会被更新和修改以满足项目的需求。 以下是有关正在执行的一些关键点:

如何开始为特定平台构建Unity项目


手册介绍了可用于构建的所有参数。 运行构建APK:

$UNITY -batchmode -quit -projectPath "$PATH" -executeMethod Game.BuildActions.AndroidDevelopment -buildTarget android -logFile "$LOGS_PATH/android_development.log" 

在这里, -buildTarget只是设置平台,而-executeMethod在Unity项目中调用一个函数,该函数使用给定的参数开始构建,看起来像这样:

 static void AndroidDevelopment () { PlayerSettings.SetScriptingBackend (BuildTargetGroup.Android, ScriptingImplementation.IL2CPP); PlayerSettings.SetScriptingDefineSymbolsForGroup (BuildTargetGroup.Android, "DEV"); EditorUserBuildSettings.SwitchActiveBuildTarget (BuildTargetGroup.Android, BuildTarget.Android); EditorUserBuildSettings.development = true; EditorUserBuildSettings.androidETC2Fallback = AndroidETC2Fallback.Quality32Bit; BuildReport report = BuildPipeline.BuildPlayer (GetScenes (), ANDROID_DEVELOPMENT_FILE, BuildTarget.Android, BuildOptions.None); int code = (report.summary.result == BuildResult.Succeeded) ? 0 : 1; EditorApplication.Exit (code); } 

在这里,您可以设置自己的构建,条件等参数。 结果返回到BASH脚本。

如何编译和导出Xcode项目


Unity成功发布Xcode项目后,必须对其进行编译,存档并导出到IPA文件中,如下所示:

 xcodebuild -project "$IOS_PATH/Unity-iPhone.xcodeproj" -quiet > "$LOGS_PATH/ios_build_release.log" 2>&1 

 xcodebuild -project "$IOS_PATH/Unity-iPhone.xcodeproj" -scheme "Unity-iPhone" archive -archivePath "$IOS_RELEASE/Unity-iPhone.xcarchive" -quiet > "$LOGS_PATH/ios_archive_release.log" 2>&1 

 xcodebuild -exportArchive -archivePath "$IOS_RELEASE/Unity-iPhone.xcarchive" -exportOptionsPlist "$IOS_RELEASE/options.plist" -exportPath $IOS_RELEASE -allowProvisioningUpdates -quiet > "$LOGS_PATH/ios_export_release.log" 2>&1 


这里options.plist是一个特殊的清单,指示导出方法,TeamID等。 可以通过以下命令查看所有可用参数:

 xcodebuild -help 

通过所有这些操作,指定了Unity生成的标准Unity-iPhone.xcodeproj 。 如果您有xcworkspace ,那么您需要检查其可用性和使用。

如何从BASH脚本向电报发送消息


您需要找到BotFather机器人,将其写为/ start或/ newbot,填写字段并接收带有令牌的消息和指向文档的链接。 要使用漫游器发送消息,您需要运行以下命令:

 curl $BOT_PROXY https://api.telegram.org/bot$BOT_TOKEN/sendMessage -m 60 -s -X POST -d chat_id=$CHAT_ID -d text="$1" > "$LOGS_PATH/bot.log" 2>&1 

这里CHAT_ID是在其中发送消息的聊天标识符。 例如,您可以将漫游器添加到测试人员所在的组中,并赋予其读取消息的权限。 之后执行:

 https://api.telegram.org/bot[BOT_TOKEN]/getUpdates 

并获取撰写内容的小组和成员的ID。 之后,指出要发送到的组或特定成员的ID。 我认为如何找到和配置通过代理发送,这不是问题。

其他功能,使用sed的补丁清单模板和HTML,以及使用sshpass将必要的文件上传到服务器。

可以快速更改的参数:

 # # PARAMS TO CHANGE # BRANCH='master' COMPANY='my_company' GAME_NAME='new_game' BUNDLE='com.mygames.game' TEAM='ios_team_id' REMOTE_PATH='url_my_builds_server' SSH_LOGIN='my_login' SSH_PASS='my_pass' SSH_HOST='my_builds_server.ru' SSH_PATH='~/domains/my_builds_server.ru/builds' TEMPLATE_FILE=$(PWD)'/template.html' MANIFEST_FILE=$(PWD)'/manifest.plist' VERSION_FILE=$(PWD)'/version.txt' LOGS_PATH=$PROJECT_PATH'/Logs' ANDROID_PATH=$PROJECT_PATH'/Builds/Android' BUILDS_PATH=$PROJECT_PATH'/Builds' IOS_PATH=$PROJECT_PATH'/Builds/iOS' IOS_BUILD_PATH=$PROJECT_PATH'/Builds/iOS/build' IOS_DEVELOPMENT=$PROJECT_PATH'/Builds/iOS/build/development' IOS_RELEASE=$PROJECT_PATH'/Builds/iOS/build/release' BOT_TOKEN='my_bot_token' BOT_PROXY='--proxy 185.189.211.70:8080' CHAT_ID='123456798' UNITY='/Applications/Unity/Hub/Editor/2019.3.0f1/Unity.app/Contents/MacOS/Unity' # # # 

演示和来源



当然,所有这些都可以通过相同的Gitlab CI / CD来完成,为此已经有现成的脚本,可以运行,构建和测试。 简而言之,请使用现成的基础架构和机制。 但是您需要移动到它并进行配置。 也许我们会来解决这个问题,尽管它比以前要好得多。 而且,整个脚本编写得足够快。

2020年实现全自动化! 机器人注射,不是人。

Source: https://habr.com/ru/post/zh-CN479884/


All Articles