App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)

版本记录

版本号 时间
V1.0 2019.04.30 星期二

前言

我们在做App开发的时候,开发人员开发完成以后就要交给QA进行测试了,有几种方式,一种就是将QA的测试机加到账号里面的Device里面,这个有个数限制(每种硬件类型不能超过100台,即使删除设备也不会重置),然后利用三方平台比如说蒲公英进行分发,还有一种方法就是使用TestFlight进行测试,这个专题就主要说一下App分发测试相关的内容。感兴趣的看上面几篇。
1. App的分发测试(一) —— 浅谈蒲公英平台分发测试的使用(一)
2. App的分发测试(二) —— TestFlight集成和分发测试(一)
3. App的分发测试(三) —— fastlane自动化打包并上传(一)
4. App的分发测试(四) —— fastlane自动化打包(一)
5. App的分发测试(五) —— GitHub, Fastlane & Jenkins集成(一)

Doing CI With Jenkins

Travis CI是一种即时感觉良好的体验,为什么你会看到其他地方? 好吧,也许是因为您需要私有存储库的CI - 请查看Travis CI Plans & Pricing。 或者,如果您的团队或公司已经维护或租用服务器,那么安装Jenkins可能更具成本效益。

1. Installing Jenkins

Jenkins Docker图像存在,但在Docker容器中运行的Jenkins将无法运行xcodebuild,因此您将直接在Mac上安装Jenkins。 访问the Jenkins download page并单击Mac OS X,下载安装程序。

安装程序下载时,请检查是否安装了适当的Java。 您需要Java 1.8才能安装JenkinsMojave没有预安装Java,但如果您不确定,请输入此命令以查看您是否已拥有它:

java -version

如果输出不包含java version “1.8 …”,则需要安装它。 虽然您可以从Oracle网站下载它,但使用Homebrew(一种流行的macOS包管理器)安装它会更简单。 如果您尚未安装Homebrew,请在终端中输入以下命令:

/usr/bin/ruby -e \
  "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

如果有提示,请输入密码。 完成后,您应该看到Installation Successful

要安装Java,请在终端中输入以下命令:

brew cask install homebrew/cask-versions/java8

再次,如果出现提示,请输入密码。

安装Java 1.8后,运行Jenkins安装程序,该安装程序现在应该已经完成下载。 安装程序完成后,应该在浏览器中打开localhost:8080 - 它需要一个密码:

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第1张图片

查找初始管理员密码(initial admin password)的最简单方法是查看日志 - 输入以下命令:

cat /var/log/jenkins/jenkins.log

此日志中有很多内容,但您只需从底部向上滚动一下即可查看两行三行星号之间的密码:

*************************************************************
*************************************************************
*************************************************************

Jenkins initial setup is required. An admin user has been created and a password generated.
Please use the following password to proceed to installation:



This may also be found at: /Users/Shared/Jenkins/Home/secrets/initialAdminPassword

*************************************************************
*************************************************************
*************************************************************

复制密码并将其粘贴到管理员密码(Administrator password)输入框中。 单击Continue以加载Customize Jenkins页面:

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第2张图片

注意:如果您获得的页面指示您的代理服务器配置不正确,而不是自定义Jenkins页面,您就会遇到Jenkins组织的Web证书问题。 要解决此问题,请在终端中输入以下命令:

sudo nano /Users/Shared/Jenkins/Home/hudson.model.UpdateCenter.xml

这将在简单的文本编辑器中打开违规配置文件。 找到https并将其更改为http。 要退出编辑器并保存文件,请按Control-C,然后按Y,最后按Enter键。 现在,在浏览器中刷新页面,您应该看到正确的页面。

选择Install suggested plugins,然后去散步 - 这需要几分钟。

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第3张图片

啊,你回来了! 现在创建您的管理员帐户 - 为用户名和密码输入admin

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第4张图片

Instance Configuration页面上,只需单击Not now

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第5张图片

在下一页上,单击使用Jenkins开始:

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第6张图片

2. Your First Jenkins Build

接下来,您将看到一个欢迎页面,提示您create new jobs

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第7张图片

点击该链接,您需要登录:

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第8张图片

只需使用您的admin/admin帐户,然后选中Keep me signed in

在下一页上,输入Numero作为项目名称(item name),然后选择Freestyle project

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第9张图片

这是你的新项目页面! 从侧面菜单中选择Configure以真正开始! 当然,如果Jenkins没有自动带你进入配置页面!

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第10张图片

项目配置页面有几个选项卡。 从第一个开始 - General - 您需要做的就是检查GitHub project,然后将您的存储库URL粘贴到出现的Project url字段中。 为简单起见,请确保使用HTTPS而不是对GitHubSSH访问。

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第11张图片

接下来,向下滚动或单击Source Code Management:选择Git并再次粘贴您的Repository URL

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第12张图片

注意:您不需要为本教程输入Credentials,但是您可以提供这些凭据以授予Jenkins对私有存储库的访问权限。 另外,请注意要构建的分支(Branches to build)部分 - 您不会在本教程中使用它,但它对您自己的项目很方便。

向下滚动构建触发器(Build Triggers ) - 稍后您将返回此选项卡。

下一节是构建环境(Build Environment):有时构建会继续进行,即使在控制台日志显示已完成之后,因此,请检查Abort the build if it’s stuck并选择No Activity作为超时策略(Time-out strategy)。 如果您想知道事情何时发生,还要检查添加时间戳到控制台输出(Add timestamps to the Console Output)

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第13张图片

最后,构建部分就是进行工作的一切! 在Add build step步骤菜单中,选择Execute shell

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第14张图片

在出现的Command字段中,粘贴此shell命令:

xcodebuild -scheme Numero -configuration Debug build test \
  -destination 'platform=iOS Simulator,name=iPhone 8'
App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第15张图片

单击Save按钮返回项目页面,然后从侧边菜单中选择Build Now

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第16张图片

Build History部分开始发生一些事情 - 你的第一个版本出现了! 将光标悬停在#1上以显示菜单按钮,然后从菜单中选择Console Output

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第17张图片

以下是我的控制台日志中的一些亮点:

16:46:07 Test Suite 'ConverterTests' started at 2019-02-18 16:46:07.264
16:46:07 Test Case '-[NumeroTests.ConverterTests testConversionForOne]' started.
16:46:07 Test Case '-[NumeroTests.ConverterTests testConversionForOne]' passed (0.004 seconds).
...
16:46:07 Test session results and logs:
16:46:07    /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/Numero-bhnpnysdndqcwobwddhndhxectdi/Logs/Test/Run-Numero-2019.02.18_16-45-19-+1100.xcresult
...
16:46:07 ** TEST SUCCEEDED **
16:46:07 
16:46:14 Testing started on 'iPhone 8'
16:46:16 Finished: SUCCESS

确实成功!

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第18张图片

3. Notifying Jenkins With GitHub Webhook

太棒了,Jenkins拉了你的项目,建立它并运行测试。 但你必须告诉它Build Now - 这不是很自动化。 一旦你按照Travis CI的方式推送GitHub,你就希望Jenkins能够拉动你的项目。 事实证明,Travis CI自动与GitHub做了一些事情,你现在必须手动完成。

您需要创建一个GitHub webhook,以便在您推送新提交时通知Jenkins服务器。 webhook是一种GitHub机制,用于在GitHub存储库中发生特定事件时将通知发布到webhook的URL - 例如,每当您推送提交时。

首先,设置Jenkins项目以期待来自GitHub的通知:使用Numero菜单返回到Configure

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第19张图片

选择Build Triggers选项卡并选中GitHub hook trigger for GITScm polling

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第20张图片

滚动到底部,然后按Save

现在转到GitHub页面设置webhook

如果您想在存储库中禁用Travis-CI以避免在两个位置都运行构建,则需要从存储库中卸载Travis。 这是可选的;看下面以显示说明。 或者,让它保持运行并跳过为Jenkins创建webhook

Numero存储库页面上,单击Settings,选择Integrations & Services,然后单击Travis CI行中的Configure

滚动到底部,然后单击Uninstall。 单击OK,GitHub将安排工作以删除Travis

要为Jenkins服务器添加webhook,请转到Numero存储库页面,然后单击Settings。 从侧边菜单中选择Webhooks,然后单击Add webhook

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第21张图片

您需要的第一件事是Payload URL - Jenkins服务器的URL。 但是,除非您使用适当的外部URL设置Jenkins,否则返回Instance Configuration步骤,您将在使用本教程时使用localhost。 但GitHub需要一个真实的URL来发送通知 - 该怎么办?

ngrok可以帮助你! 这是一个免费的应用程序,它使用安全隧道将localhost暴露给互联网。GitHub’s webhooks tutorial使用它,所以一定是OK。 继续download ngrok for Mac OS X:

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第22张图片

在终端,cdngrok所在的位置,然后运行以下命令:

./ngrok http 8080

您的输出看起来类似于:

ngrok by @inconshreveable                                       (Ctrl+C to quit)
                                                                                
Session Status                online                                            
Session Expires               7 hours, 59 minutes                               
Version                       2.2.8                                             
Region                        United States (us)                                
Web Interface                 http://127.0.0.1:4040                             
Forwarding                    http://4c94cdf1.ngrok.io -> localhost:8080        
Forwarding                    https://4c94cdf1.ngrok.io -> localhost:8080       
                                                                                
Connections                   ttl     opn     rt1     rt5     p50     p90       
                              0       0       0.00    0.00    0.00    0.00 

复制你的转发网址(Forwarding URL) - 我的是http://4c94cdf1.ngrok.io,接下来将近8个小时。

返回GitHub Add webhook页面,将此URL粘贴到Payload URL字段中,并将/ github-webhook /添加到URL的末尾。 这是Jenkins服务器上的端点,它响应来自GitHub的推送:

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第23张图片

注意:默认事件设置是Just the push event。 您可以随时更改订阅的事件列表。 可用事件的完整列表位于Webhooks documentation中。

单击Add Webhook。 GitHub向URL发送测试POST请求,该请求以302 Found响应,这意味着URL已被重定向。 不要担心GitHub会将此标记为失败。

现在,在ConverterTests.swift中将这个新的单元测试添加到Numero,所以你可以推送到GitHub,它会通知你的Jenkins服务器:

func testConversionForTwo() {
  let result = converter.convert(2)
  XCTAssertEqual(result, "II", "Conversion for 2 is incorrect")
}

注意:我们回到了TDD的红色步骤,所以这个测试将失败 - convert(_:)返回“I”,而不是“II”

提交并推送到GitHub,然后检查你的Jenkins页面 - Numero的菜单现在有一个项目GitHub Hook Log

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第24张图片

选择GitHub Hook Log:来自您的ngrok URL的事件导致Jenkins轮询您的GitHub存储库以查找更改,它发现:

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第25张图片

你对GitHub的推动触发了构建#2 - 它的亮度为红色,因为单元测试失败了。 使用弹出菜单查看构建#2Console Output

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第26张图片

完全向下滚动以查看测试结果:

13:48:12 Test Suite 'All tests' started at 2019-02-19 13:48:12.227
13:48:12 Test Suite 'NumeroTests.xctest' started at 2019-02-19 13:48:12.228
13:48:12 Test Suite 'ConverterTests' started at 2019-02-19 13:48:12.228
13:48:12 Test Case '-[NumeroTests.ConverterTests testConversionForOne]' started.
13:48:12 Test Case '-[NumeroTests.ConverterTests testConversionForOne]' passed (0.002 seconds).
13:48:12 Test Case '-[NumeroTests.ConverterTests testConversionForTwo]' started.
13:48:12 /Users/Shared/Jenkins/Home/workspace/Numero/NumeroTests/ConverterTests.swift:32: error: -[NumeroTests.ConverterTests testConversionForTwo] : XCTAssertEqual failed: ("I") is not equal to ("II") - Conversion for 2 is incorrect
...
13:48:15 Failing tests:
13:48:15    ConverterTests.testConversionForTwo()
13:48:15 ** TEST FAILED **
13:48:15 
13:48:21 Testing started on 'iPhone 8'
13:48:21 Build step 'Execute shell' marked build as failure
13:48:21 Finished: FAILURE

祝贺你自己 - 你已经建立了从GitHubJenkins的沟通! Travis CI为您自动神奇地做了些什么。 好吧,Travis CI有一个固定的URL,因此更容易 - 不需要ngrok

Travis CI还有另一个有用的默认行为:它发送电子邮件通知您构建结果。 您可以设置Jenkins来执行此操作,但您必须做一些工作。

4. Emailing From Jenkins

首先,您需要一个SMTP(简单邮件传输协议)服务器(SMTP (Simple Mail Transfer Protocol) server)。 您可以使用Postfix配置一个,但本教程使用smtp.gmail.com - 您需要一个Google帐户才能跟进。

这一次,您必须配置项目和Jenkins系统。

Configuring Your Project

从项目开始:使用Numero菜单返回Configure,然后选择Post-build Actions选项卡。

Add post-build action菜单中,选择Editable Email Notification

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第27张图片

在显示的表单中,您不必编辑任何内容,但请注意项目收件人列表的值为$ DEFAULT_RECIPIENTS - 您需要确保在找到该字段时编辑该字段。

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第28张图片

在此表单下方,单击Advanced Settings…以查看更多选项:默认触发器是Failure – Any,因此您无需执行任何操作来阻止成功发送电子邮件。

要复制Travis CI的默认行为,请从Add Trigger菜单中选择Always

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第29张图片

单击Always部分中的Advanced…并将您的电子邮件地址添加到Recipient List

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第30张图片

注意:这只是保险,以确保收件人列表不为空。

单击Save返回项目页面。

Configuring Your Jenkins System

现在配置Jenkins系统:使用Jenkins菜单选择Manage Jenkins ▸ Configure System

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第31张图片

向下滚动到扩展电子邮件通知并安顿下来进行大量填写表格!

  • 1) 对于SMTP服务器,键入smtp.gmail.com,然后单击Advanced…
  • 2) 选中Use SMTP Authentication,然后键入您的Google用户名和密码。
  • 3) 选中使用SSL
  • 4) 对于SMTP端口,请键入465
  • 5) 对于默认收件人(Default Recipients)(aha!),请键入您的电子邮件地址。
  • 6) 单击Apply以保存您的条目,但请保留在此页面上。
App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第32张图片

完全向下滚动到(普通旧的)E-mail Notification,然后单击Advanced…:您的所有电子邮件设置应该已经在这里;如果没有,请再次输入。

在底部,选中Test configuration by sending test e-mail,然后填写您的电子邮件地址。

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第33张图片

在单击Test configuration之前,还需要做一件事。 由于Google已加强安全性,请转到Less secure app access并将开关弹至ON

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第34张图片

现在返回Jenkins并单击Test configuration。 稍等一下,您应该看到“Email was successfully sent”。 查看您的电子邮件,找到:

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第35张图片

注意:如果收到有关Username and Password not accepted的错误消息,请在两个位置检查SMTP验证用户名(SMTP Authentication User Name)和密码。 同时将安全应用程序访问权限关闭然后打开,可能不止一次。

Pushing to GitHub

现在编辑Converter.swift中的代码,使您的第二个单元测试通过。 编辑convert(_ :)方法,使其返回一个String,其中包含正确数量的“I”字符:

func convert(_ number: Int) -> String {
  return String(repeating: "I", count: number)
} 

提交并推送到GitHub,然后观察您的构建的控制台日志 - 它应以“2 tests, with 0 failures”结束,并将电子邮件发送到您的电子邮件地址:

20:54:28 Test Suite 'ConverterTests' passed at 2019-02-19 20:54:28.700.
20:54:28     Executed 2 tests, with 0 failures (0 unexpected) in 0.002 (0.003) seconds
20:54:28 Test Suite 'NumeroTests.xctest' passed at 2019-02-19 20:54:28.701.
20:54:28     Executed 2 tests, with 0 failures (0 unexpected) in 0.002 (0.003) seconds
20:54:28 Test Suite 'All tests' passed at 2019-02-19 20:54:28.701.
20:54:28     Executed 2 tests, with 0 failures (0 unexpected) in 0.002 (0.004) seconds
20:54:29 
20:54:29 
20:54:29 Test session results and logs:
20:54:29    /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/Numero-bhnpnysdndqcwobwddhndhxectdi/Logs/Test/Run-Numero-2019.02.19_20-54-23-+1100.xcresult
20:54:29 
20:54:29 2019-02-19 20:54:29.034 xcodebuild[49013:36278327] [MT] IDETestOperationsObserverDebug: 1.783 elapsed -- Testing started completed.
20:54:29 2019-02-19 20:54:29.034 xcodebuild[49013:36278327] [MT] IDETestOperationsObserverDebug: 0.000 sec, +0.000 sec -- start
20:54:29 2019-02-19 20:54:29.034 xcodebuild[49013:36278327] [MT] IDETestOperationsObserverDebug: 1.783 sec, +1.783 sec -- end
20:54:29 ** TEST SUCCEEDED **
20:54:29 
20:54:29 Testing started on 'iPhone 8'
20:54:29 Email was triggered for: Always
20:54:29 Sending email for trigger: Always
20:54:29 Sending email to: audrey.tam@xxxxxxx
20:54:33 Finished: SUCCESS

还有电子邮件:

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第36张图片

呼! 这比Travis CI花费的时间要长一些,但你已经完成了基本的CI工作流程,推动了GitHub触发Jenkins构建,触发了电子邮件通知。 休息一下吧!

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第37张图片

注意:请务必关闭Gmail帐户中安全性较低的应用访问权限(Less secure app access)

5. Using fastlane With Jenkins

要使用带有Jenkinsfastlane,你需要在你的Mac上安装它。输入ruby -v检查你有Ruby 2.0xcode-select --install以确保你有Xcode命令行 工具(CLT)(Xcode Command Line Tools (CLT)),然后输入此命令在/ usr / local / bin中安装fastlane

sudo gem install -n /usr/local/bin fastlane --verbose

安装fastlane时,在Jenkins项目的Build▸Command字段中,将xcodebuild命令替换为:

fastlane scan

安装fastlane后,cdNumero的根目录,然后输入以下命令:

fastlane init

fastlane询问“What would you like to use fastlane for?”时,请选择4. Manual setup。 这只是将Gemfilefastlane文件夹添加到您的项目中。 提交并推送到GitHub,开始下一个构建。

注意:如果Jenkins说它不知道fastlane的位置,请在Command字段中指定完整路径。 您可以在终端Terminal找到完整路径,使用哪个快速通道(which fastlane)

6. Cleaning Up

Jenkins作为启动守护程序运行,因此它可以在您退出甚至终止进程后重新启动。 要停止Jenkins,请在终端中运行此命令:

sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

重启Mac时,启动守护程序会重新启动,只有当您尝试在localhost:8080上公开其他服务并发现它已在使用时才会发现! 要完全卸载Jenkins,请运行以下命令:

/Library/Application Support/Jenkins/Uninstall.command

检查这是否已删除Applications / Jenkins/ Users / Shared / Jenkins,以及System Preferences ▸ Users & Groups中的未命名标准用户 - 当您重新启动Mac时,您不应该看到以Jenkins身份登录的选项。

在本教程中,您开始使用Travis CIJenkinsTravis CI是开始使用CI的超级简单途径,所以不再有任何借口! Jenkins需要更多的努力来建立,但私人存储库没有额外的成本,而且它比Travis CI更灵活。

以下是Travis CI,Jenkinsfastlane的一些有用的参考资料:

  • Travis CI documentation
  • Travis CI Core Concepts for Beginners
  • Jenkins User Documentation
  • fastlane documentation

还有许多其他CI服务或产品。 fastlane文档包括与fastlane集成的简短列表short list。

除了CI就是CDContinuous Delivery,您可以自动执行发布流程,以便随时准备将更改部署到用户,以及持续部署(Continuous Delivery),您可以自动部署每个更改。您可以使用Jenkins管道和fastlane的组合转移到CD。或者您可能会发现Travis CI的部署(deploy)命令已足够 - 例如,自动部署到Heroku( deploy to Heroku)。

后记

本篇主要讲述了GitHub, Fastlane & Jenkins集成,感兴趣的给个赞或者关注~~~

App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二)_第38张图片

你可能感兴趣的:(App的分发测试(六) —— GitHub, Fastlane & Jenkins集成(二))