与Jenkins,Xcode和GitHub的基本持续集成

在上一篇文章中,我论证了为什么单元测试和代码审查很有价值。 在这一篇中,我将向您展示如何建立一个自动化系统来执行这些原则。 在允许PR合并之前,我们将要求有人对其进行审查,并且所有单元测试都已通过。

开发人员在提交PR之前不应该运行单元测试吗? 是的,但是拥有护栏并没有什么可耻的。 专家通常会忘记一两个细节。 看看医院开始允许护士对医生实施检查清单时发生了什么。

2001年,约翰·霍普金斯医院的重症监护专家Peter Pronovost决定尝试[检查清单]……他和他的团队说服医院管理部门授权护士在发现医生跳过检查清单的步骤时停止医生治疗……

Pronovost和他的同事们监视了一年后发生的事情。 结果是如此惊人,以至于他们不确定是否要相信: 十天的线感染率从11%降至零。 因此,他们又跟踪患者十五个月。 在整个时期内仅发生了两次线感染。 他们计算出,在这家医院中, 清单已预防了43次感染和8例死亡,并节省了200万美元的成本

https://www.newyorker.com/magazine/2007/12/10/the-checklist

由于可能会出现错误,为什么不解释这些错误呢? 我们可以告诉计算机强制执行我们自己设计的清单。

有3个主要部分可实现这一目标:

  • 设置Jenkins以构建和测试iOS应用
  • 获取GitHub以加入Jenkins以触发构建并报告测试结果
  • 配置GitHub阻止PR,直到所有检查通过

您将需要Jenkins在Mac上运行。 如果您不能这样做,请立即保释。 👋

Jenkins有大量的插件可以使您的生活更轻松。 我们想要的是:

  • GitHub,GitHub API,GitHub身份验证和GitHub Pull Request Builder —与GitHub交互
  • JUnit —报告单元测试结果
  • Xcode集成-帮助我们构建iOS应用

要安装插件,请转到主页->管理Jenkins->管理插件。 然后检查“可用/已安装”选项卡。 您可能已经安装了其中一些!

首先,让我们构建我们的应用程序。 进行Freestyle作业,然后输入您的回购URL和凭据并指定您的主分支:

接下来,浏览至Xcode部分,并将其放入常规设置。 该插件的作用是在您的项目中运行xcodebuild ,并使其易于配置参数。

现在转到Advanced Xcode build options-> Advanced build settings

看到“目的地”参数了吗? 这指向您要测试的特定设备。 要获取可用设备的列表,请在终端中运行以下命令:

  xcrun simctl列表 

我遇到了一个问题,即我的构建服务器尚未更新。 我的应用程序将部署目标指定为11.4,但是服务器上的设备仅支持11.3。 如果.xcodeproj说您需要11.4,则将参数更改为11.3不会影响构建(答案是不需要这么高的部署目标)。 有关从命令行控制模拟器的更多详细信息。

单击作业上的“立即构建”,确保一切正常。

我们首先这样做是因为如果您尝试在`test-reports`文件夹存在之前指定它,Jenkins就会发疯。 现在转到Post-build Actions并添加一个Publish JUnit测试结果报告 。 输入test-reports/*.xml

做得好! Jenkins都可以测试您的应用程序!

还记得我们在第1步中告诉Jenkins如何寻找master分支吗? 为了与GitHub很好地配合,我们希望告诉它查看所有PR分支。 返回到“ 源代码管理”。origin放在“名称”(远程名称)中,并将+refs/pull/*:refs/remotes/origin/pr/*放在“ Refspec”中。 (您必须单击“高级”以打开本节。)最后,请确保从分支说明符中删除master

Build Triggers下 ,选择GitHub Pull Request Builder

在“ 触发器设置”下在构建过程中添加“ 更新”提交状态,并放入所需的任何标签。 (我选择了“单元测试”)

现在是时候离开Jenkins并转到GitHub。 假设您具有管理员访问权限,请在您的存储库中导航至“设置”->“挂钩” 。 GitHub真正酷的地方是您可以根据回购中发生的事件,告诉他们将JSON发布到您喜欢的任何位置。 例如,您对PR的每次评论后都可能收到有效载荷!

我们关心的是在推送代码时运行测试。 为此,请单击“ 添加webhook ”,然后输入https://your-jenkins-server.com/ github-webhook /

GitHub将发出ping事件,以确保您的Jenkins服务器存在。 确保它! 如果GitHub无法与Jenkins通信,那么继续下去是没有意义的。

如果您怀疑GitHub是否确实在尝试发送事件,请回到Web Hook并查看底部。 它列出了发送了哪些事件,并向您显示了有效负载(单击“ …”),非常便于调试。

现在让我们对其进行测试!

在您的仓库上创建一个新分支,并推送到GitHub。 您应该在“最近的交付”(如上所示)中看到一个新的有效负载,并看到Jenkins开始构建。 有时候,詹金斯(Jenkins)的前进可能会有些慢,因此请在声明一切都已结束之前给它几分钟。

最后一步是最简单的。

您可以“保护”分支-禁止合并直到满足某些要求。

进入仓库的“设置”->“分支”,然后选择要保护的分支。

我希望至少需要1位审阅者,要求分支机构是最新的,并且所有单元测试都通过。 如果您确实愿意,您始终可以覆盖并强制以管理员身份进行合并(提示:请勿这样做)。

现在,您的主分支已受到保护,可以避免容易犯的错误。 感谢GitHub / Jenkins使我们诚实。

肖恩试图在 Livefront 达到自己的标准