本文采用是fastlane的脚本构建方式。
关于Xcode integration插件的构建方式。
Jenkins基础环境搭建
注意事项:开发软件的环境搭建应尽量按照官方的步骤。有的开发者,学习一样新东西,直接网上一搜,找一个第三方教程来走,结果遇见更多问题。
Jenkins的官方Guided Tour。
- 安装Java8,使用终端安装
- 检查java版本
~java -version
No Java runtime present, requesting install.
表示未安装Java。
- 安装java8
~brew cask install java8
java8,必须带8,不然就会安装java最新版本java9。
如果未安装brew,请先安装brew。
Error: Cask 'java8' is unavailable: No Cask with this name exists.
出现此错误,使用下面命令解决。
~brew tap caskroom/versions
安装期间会要求输入管理员密码。
再查询版本
- 安装Jenkins,从官网下载安装。
有长期支持的稳定版,每周发布的开发版,以下是以稳定版2.89.2为例。
安装完毕后,浏览器自动打开解锁界面。
拷贝上面的地址
~ vim /Users/lazy-ios2/.jenkins/secrets/initialAdminPassword
使用vim打开。
上面红框里的就是password,拷贝粘贴后,Continue。
选左边安装推荐插件,耐心等待。
首次进入Jenkins,先进去系统管理,设置好管理员权限。
Jenkins不会默认设置当前管理员用户的管理员权限。
导致登录失效后,就无法登录此账户了,真麻烦~
-
进入全局安全配置。
-
修改授权策略为安全矩阵,添加用户iostest(刚刚注册现在登录的用户)。
-
设置管理员用户为管理员权限,保存。
- 添加用户
-
系统管理->管理用户->新建用户
例如为测试人员创建只读和运行权限的用户。
-
系统管理->全局安全配置->授权策略
Overall选择Read,其他权限选项按需选择。
还有其他授权策略,如项目矩阵授权策略,基于项目的授权方式,相对安全矩阵配置更灵活,当然配置也相对复杂,没有很多的实践经验,在这里不赘述。
Jenkins创建任务(job)
细心的童鞋会发现,Jenkins的Use-cases没有iOS。
只能自己找第三方教程和摸索,真麻烦~
使用构建一个自由风格软件项目为例。
-
项目的基础设置,按需设置吧,不明白点击后面的问好,有相关说明。
- 源码管理
正常来说,公司都有自己的代码仓库,这里以git为例。
输入git地址,发现没有权限。
点击图中的add进行添加私钥。
进入.ssh目录
vim打开对应的rsa私钥文件,选中全部,拷贝。
回到Jenkins,点击add添加私钥,选则Jenkins。
选择ssh类型。有账户密码的话,要在Username和Passphrase输入账户密码。本例中未设置,故无需输入。
选择创建的Credentials,成功后红色错误提示消失。
最后别忘了选择构建的branch。
首次拉去代码时间较长,建议设置30分钟超时时间。 -
构建触发器
可以设置触发构建的事件,当前没有这种需求,当测试人员有需要的时候,再由测试人员去手动构建。 触发事件本身还是很有用的,尤其是Poll SCM,可以设置固定时间点构建。
-
构建环境
由于使用fastlane打包,不用设置,直接跳过。
- 构建 (Execute shell,添加Shell脚本构建)
Jenkins是在Jenkins用户环境下构建的,必须将构建需要的东西同步到Jenkins用户环境。
所以这里有两个脚本,一个同步Keychain和Provisioning Profiles。
一个fastlane构建。
第一个同步脚本如下:
#!/usr/bin/expect
set timeout 10
spawn su - test -c "sudo rm -rf /Users/Shared/Jenkins/Library/MobileDevice/'Provisioning Profiles'"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn su - test -c "sudo mkdir -p /Users/Shared/Jenkins/Library/MobileDevice/'Provisioning Profiles'"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn su - test -c "sudo cp -r /Users/test/Library/MobileDevice/'Provisioning Profiles' /Users/Shared/Jenkins/Library/MobileDevice"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn su - test -c "sudo rm -rf /Users/Shared/Jenkins/Library/Keychains"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn su - test -c "sudo mkdir -p /Users/Shared/Jenkins/Library/Keychains"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn su - test -c "sudo cp -r /Users/test/Library/Keychains /Users/Shared/Jenkins/Library"
expect "Password:"
send "123456\r"
expect "Password:"
send "123456\r"
expect eof
wait
set timeout 10
spawn sudo security set-key-partition-list -S apple-tool:,apple: -s -k 123456 /Users/Shared/Jenkins/Library/Keychains/login.keychain-db
expect "Password:"
send "123456\r"
expect eof
wait
由于Jenkins用户权限问题,需要使用管理员账户来执行同步命令。
使用管理员账户自然会询问密码,所以要使用expect。
最后一个解锁keychain,让Jenkins用户能够读取并使用keychain中的证书来进行签名CodeSign,所有使用Jenkins用户来执行改命令。
第二个打包脚本
#!/usr/bin/env bash
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=120
rm -rf /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData
******隐藏代码******
fastlane gym -w ${buildProjectDir}lazyaudio.xcworkspace --clean -o ${buildDir} -s lazyaudio -n "${buildIpaName}.ipa" -q ${buildConfigStr} --export_method ${exportMethod} -a
******隐藏代码******
lftp << EOF
open ftp://xxxxxx:xxxxx@xxx.xxx.x.xxx
mkdir ${ftpPath}
cd ${ftpPath}
lcd ${ftpIpaPath}
mput *
close
bye
EOF
打包脚本和项目本身的配置联系紧密。
为了避免干扰,打包脚本只截取部分通用代码。
前3个export是必须的,好像是有中文的原因,否则Jenkins不认脚本。
第4个是设置超时时间,fastlane的默认配置,容易超时导致构建失败,强烈建议加上。
然后就是配置fastlane,以及fastlane打包部分。
编写脚本前,必须了解环境变量,这里就不赘述了。
最后ftp上传构建的ipa等,使用的是lftp。新macOS把ftp默认从系统中移除,如需要自己安装。
测试构建
- 构建前,必须确保在管理员账户(这里是test账户)下,可以正常使用fastlane打包。
- 构建失败,fastlane not found。
Jenkins找不到fastlane命令,要为Jenkins设置PATH,让它用上fastlane。
在终端输入
echo $PATH
,打印PATH,拷贝。系统管理->系统设置->全局属性->环境变量,输入键PATH,值就是刚刚拷贝的字符串。
-
构建失败, codesign failure。
签名失败,通常是keychain解锁失败导致。因为创建Jenkins用户,默认并没有为它设置密码,导致它无法请求管理员权限来解锁keychain。
使用sudo passwd jenkins来设置Jenkins用户密码。
-
构建失败,cannot find xxx scheme
xcode command line找不到scheme,需要在Xcode设置scheme为shared,commit相关变更,push代码。
scheme的生成是依赖Xcode GUI,仅靠xcode command line不能生成scheme来构建。
-
两个构建并行执行,构建速度慢
系统管理->系统设置->执行者数量 设置为1,就不会同时进行多个构建。
-
让其他用户访问Jenkins
锁死本机的IP地址,其他用户可以通多访问192.168.x.xxx:8080来使用Jenkins。
系统管理->系统设置->Jenkins Location
配置好地址,管理员邮件地址。在下面的邮件通知用得上。
邮件通知
-
系统管理->系统设置->邮件通知
配置发邮件的邮箱,建议新建一个Jenkins专用的邮箱,图中是腾讯的企业邮箱为例。配置好通过发送邮件测试邮件测试配置。
-
系统管理->系统设置->Extended E-mail Notification(这个是建议插件中的一个,比Jenkins自带的邮件通知要强大)。
将Jenkins自带邮件通知测试通过的配置,填入上面。
然后设置默认收件人,多个用空格隔开。
构建后操作
回到任务配置中,最后一个构建后的操作。
-
收件人列表设置
除了默认收件人,可以添加其他需要被通知到的收件人,多个用空格隔开。
-
回复人设置
回复列表,是指,如果有人回复了Jenkins发的邮件,直接回给哪些人(邮件),而不是Jenkins本身邮箱,Jenkins邮箱只有发邮件的功能。
当然也可以在系统设置中设置默认回复列表。
-
内容设置
Default Subject和Default Content也是类似的,按需要设置。
可以查看Content Token Reference来具体设置。 -
Advance setting邮件发送触发配置。
默认只有失败才发送。
各自按需设置,根据触发条件不同,又能单独配置收件人列表,回复人列表以及内容。很强大有木有?
卸载Jenkins
在自己电脑实践Jenkins够了,想删除了。
使用Jenkins自带Uninstall.command来删除。
路径/Library/Application Support/Jenkins/Uninstall.command