Swift —在Bitbucket上的持续集成

本文是同时介绍TDD和多个CI概念的指南的一部分。 您可以在 此处 查看介绍性文章

当使用位桶时,我们将使用CircleCI来满足CI的需求,因为它与TravisCI非常相似且易于配置。 不幸的是,它仅适用于对我们不起作用的Linux机器(因为我们需要一台macOS机器来构建我们的xcode项目)。 但是CircleCI确实提供了为期两周的免费试用,因此您可以签出它,看看它是否值得。

让我们开始工作:

  1. 首先在CircleCI网站上创建一个帐户,然后对您的Bitbucket帐户进行配对(您也可以使用您的BitBucket凭据直接登录Travis,从而无需进行配对过程)。
  2. 从项目列表中选择所需的项目,以便CircleCI可以为其生成Webhook。
  3. 现在,CircleCI已挂接到您的项目上,并且当您的代码更改时,它会收到通知(默认情况下,它被设置为在每次推送以及合并时都运行)。
  4. 现在是时候告诉CircleCI每次对代码进行推送更改时要做什么。 为此,我们必须将一个文件添加到项目的根目录,并将其circle.yml 。 CircleCI的配置方案需要更多的指令(​​与Travis相比),如果被多个文件分割,则更容易做到,这就是我们要做的。
  5. 首先在项目的根目录下创建一个Scripts文件夹。 现在创建以下文件(每个要点底部的文件名):

7.现在配置CircleCI并准备就绪! 提交并推送您的更改(确保包括.yml文件和所有脚本),应该通知CircleCI,它将开始构建您的项目并运行测试! 如果一切顺利,您应该得到一个类似于以下的屏幕:

有些不对劲? 请在下面发表评论,我将尽力帮助!

9.随着CircleCI的启动和运行,我们现在应该利用它的功能并使我们的CI工作流更加强大。

SwiftLint

Swiftlint是一种工具,可以帮助您识别和标记代码的某些部分,这些部分可能不遵循社区或您的团队所遵循的样式规则。

因此,它将帮助您坚持简洁的代码惯例,并在整个团队之间保持共同的风格。

Swiftlint可以在本地或CI服务器上运行。 让我们先在本地运行它:

  1. 首先在控制台上运行brew updatebrew install swiftlint ,然后在转到项目的根文件夹后,运行swiftlint 。 而已! 短毛猫会检查您的代码并提出可能发现的任何问题!

2. SwiftLint的另一个优点是,您可以配置XCode来运行它,以便在每次构建后进行编码时都能得到实时警告! 为此,我们必须在Xcode的构建过程中添加一个新的“运行脚本阶段”,并包含以下脚本:

尽管非常有用,但SwifLint有时还是会有些干扰。 在某些情况下,您可能会收到您确实不想更改的代码的警告(例如上面的AppDelegate甚至是测试类,它们本来就很长)。 为避免这种情况,您可以配置.yml文件以指定文件排除项。 我希望您更明确一些,并像

// swiftline:disable:next line_length

有了SwiftLint的本地部分,现在该让CircleCI处理它了。 首先,将新文件添加到Scripts文件夹中:

现在是时候创建一个CodeCov帐户了。 使用您的Bitbucket帐户注册,然后从列表中添加您的存储库。 您应该看到类似于此屏幕。 记下令牌ID,因为稍后我们将需要它。

最后,我们现在可以配置CircleCI,以便每次构建项目时也可以检查覆盖范围。 我们必须在yml文件中添加两件事:

  • 通过添加标志-enableCodeCoverage YES ,将xcodebuild配置为也启用coverage数据
  • 使用after_script选项将覆盖率数据上传到codecov

您的文件应如下所示:

已知的错误

xcodebuild目前发生一个已知的错误,其中没有考虑UI测试,这会影响您的覆盖率。 例如,当我想以正确的百分比(在FizzBu​​zz示例中为100%)更新CodeCov时,例如在合并合并请求之前,我直接在XCode中运行整个测试套件,然后手动上载coverage使用相同的命令向codecov报告:

bash <(curl -s https://codecov.io/bash) -t YOUR_TOKEN

CodeBeat

完全基于云且独立于CI的CodeBeat将审查每次提交并在代码库中搜索代码重复,安全问题,过于复杂的功能等(它也能够生成覆盖率报告,但我们不会依靠它,因为我们已经有了一个工具)。

它的配置相当简单。 使用您的Bitbucket帐户注册并选择所需的项目,以便它可以生成所需的Webhook。 我们还希望忽略某些文件夹,因此我们将.codebeatignore文件添加到具有以下内容的根文件夹中: