版本记录
版本号 | 时间 |
---|---|
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
才能安装Jenkins
。 Mojave
没有预安装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
- 它需要一个密码:
查找初始管理员密码(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
页面:
注意:如果您获得的页面指示您的代理服务器配置不正确,而不是自定义
Jenkins
页面,您就会遇到Jenkins
组织的Web
证书问题。 要解决此问题,请在终端中输入以下命令:sudo nano /Users/Shared/Jenkins/Home/hudson.model.UpdateCenter.xml
这将在简单的文本编辑器中打开违规配置文件。 找到
https
并将其更改为http
。 要退出编辑器并保存文件,请按Control-C
,然后按Y
,最后按Enter
键。 现在,在浏览器中刷新页面,您应该看到正确的页面。
选择Install suggested plugins
,然后去散步 - 这需要几分钟。
啊,你回来了! 现在创建您的管理员帐户 - 为用户名和密码输入admin
:
在Instance Configuration
页面上,只需单击Not now
:
在下一页上,单击使用Jenkins
开始:
2. Your First Jenkins Build
接下来,您将看到一个欢迎页面,提示您create new jobs
:
点击该链接,您需要登录:
只需使用您的admin/admin
帐户,然后选中Keep me signed in
。
在下一页上,输入Numero
作为项目名称(item name)
,然后选择Freestyle project
:
这是你的新项目页面! 从侧面菜单中选择Configure
以真正开始! 当然,如果Jenkins
没有自动带你进入配置页面!
项目配置页面有几个选项卡。 从第一个开始 - General
- 您需要做的就是检查GitHub project
,然后将您的存储库URL粘贴到出现的Project url
字段中。 为简单起见,请确保使用HTTPS
而不是对GitHub
的SSH
访问。
接下来,向下滚动或单击Source Code Management
:选择Git
并再次粘贴您的Repository URL
。
注意:您不需要为本教程输入
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)
。
最后,构建部分就是进行工作的一切! 在Add build step
步骤菜单中,选择Execute shell
:
在出现的Command
字段中,粘贴此shell
命令:
xcodebuild -scheme Numero -configuration Debug build test \
-destination 'platform=iOS Simulator,name=iPhone 8'
单击Save
按钮返回项目页面,然后从侧边菜单中选择Build Now
:
在Build History
部分开始发生一些事情 - 你的第一个版本出现了! 将光标悬停在#1
上以显示菜单按钮,然后从菜单中选择Console Output
:
以下是我的控制台日志中的一些亮点:
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
确实成功!
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
:
选择Build Triggers
选项卡并选中GitHub hook trigger for GITScm polling
:
滚动到底部,然后按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
:
您需要的第一件事是Payload URL
- Jenkins
服务器的URL。 但是,除非您使用适当的外部URL设置Jenkins
,否则返回Instance Configuration
步骤,您将在使用本教程时使用localhost
。 但GitHub
需要一个真实的URL来发送通知 - 该怎么办?
ngrok可以帮助你! 这是一个免费的应用程序,它使用安全隧道将localhost
暴露给互联网。GitHub’s webhooks tutorial使用它,所以一定是OK。 继续download ngrok for Mac OS X:
在终端,cd
到ngrok
所在的位置,然后运行以下命令:
./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的推送:
注意:默认事件设置是
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
!
选择GitHub Hook Log
:来自您的ngrok URL
的事件导致Jenkins
轮询您的GitHub存储库以查找更改,它发现:
你对GitHub
的推动触发了构建#2
- 它的亮度为红色,因为单元测试失败了。 使用弹出菜单查看构建#2
的Console Output
:
完全向下滚动以查看测试结果:
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
祝贺你自己 - 你已经建立了从GitHub
到Jenkins
的沟通! 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
:
在显示的表单中,您不必编辑任何内容,但请注意项目收件人列表的值为$ DEFAULT_RECIPIENTS
- 您需要确保在找到该字段时编辑该字段。
在此表单下方,单击Advanced Settings…
以查看更多选项:默认触发器是Failure – Any
,因此您无需执行任何操作来阻止成功发送电子邮件。
要复制Travis CI
的默认行为,请从Add Trigger
菜单中选择Always
:
单击Always
部分中的Advanced…
并将您的电子邮件地址添加到Recipient List
:
注意:这只是保险,以确保收件人列表不为空。
单击Save
返回项目页面。
Configuring Your Jenkins System
现在配置Jenkins
系统:使用Jenkins
菜单选择Manage Jenkins ▸ Configure System
:
向下滚动到扩展电子邮件通知并安顿下来进行大量填写表格!
- 1) 对于
SMTP
服务器,键入smtp.gmail.com
,然后单击Advanced…
。 - 2) 选中
Use SMTP Authentication
,然后键入您的Google
用户名和密码。 - 3) 选中使用
SSL
。 - 4) 对于
SMTP
端口,请键入465
。 - 5) 对于默认收件人
(Default Recipients)
(aha!),请键入您的电子邮件地址。 - 6) 单击
Apply
以保存您的条目,但请保留在此页面上。
完全向下滚动到(普通旧的)E-mail Notification
,然后单击Advanced…
:您的所有电子邮件设置应该已经在这里;如果没有,请再次输入。
在底部,选中Test configuration by sending test e-mail
,然后填写您的电子邮件地址。
在单击Test configuration
之前,还需要做一件事。 由于Google
已加强安全性,请转到Less secure app access并将开关弹至ON
:
现在返回Jenkins
并单击Test configuration
。 稍等一下,您应该看到“Email was successfully sent”
。 查看您的电子邮件,找到:
注意:如果收到有关
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
还有电子邮件:
呼! 这比Travis CI
花费的时间要长一些,但你已经完成了基本的CI
工作流程,推动了GitHub
触发Jenkins
构建,触发了电子邮件通知。 休息一下吧!
注意:请务必关闭
Gmail
帐户中安全性较低的应用访问权限(Less secure app access)
。
5. Using fastlane With Jenkins
要使用带有Jenkins
的fastlane
,你需要在你的Mac上安装它。输入ruby -v
检查你有Ruby 2.0
和xcode-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
后,cd
到Numero
的根目录,然后输入以下命令:
fastlane init
当fastlane
询问“What would you like to use fastlane for?”
时,请选择4. Manual setup
。 这只是将Gemfile
和fastlane
文件夹添加到您的项目中。 提交并推送到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 CI
和Jenkins
。 Travis CI
是开始使用CI
的超级简单途径,所以不再有任何借口! Jenkins
需要更多的努力来建立,但私人存储库没有额外的成本,而且它比Travis CI
更灵活。
以下是Travis CI,Jenkins
和fastlane
的一些有用的参考资料:
- Travis CI documentation
- Travis CI Core Concepts for Beginners
- Jenkins User Documentation
- fastlane documentation
还有许多其他CI
服务或产品。 fastlane
文档包括与fastlane
集成的简短列表short list。
除了CI
就是CD
:Continuous Delivery
,您可以自动执行发布流程,以便随时准备将更改部署到用户,以及持续部署(Continuous Delivery
),您可以自动部署每个更改。您可以使用Jenkins
管道和fastlane
的组合转移到CD
。或者您可能会发现Travis CI
的部署(deploy)
命令已足够 - 例如,自动部署到Heroku( deploy to Heroku)。
后记
本篇主要讲述了GitHub, Fastlane & Jenkins集成,感兴趣的给个赞或者关注~~~