Jenkins+fastlane在iOS开发中的基础使用

Jenkins是一个基于Java的开源持续集成工具。

本文采用是fastlane的脚本构建方式。

关于Xcode integration插件的构建方式。

Jenkins基础环境搭建

注意事项:开发软件的环境搭建应尽量按照官方的步骤。有的开发者,学习一样新东西,直接网上一搜,找一个第三方教程来走,结果遇见更多问题。

Jenkins的官方Guided Tour

Guided Tour
  • 安装Java8,使用终端安装
  1. 检查java版本

~java -version
No Java runtime present, requesting install.
表示未安装Java。

  1. 安装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

Java 安装

安装期间会要求输入管理员密码。


输入密码

安装完成

再查询版本


查询版本
  • 安装Jenkins,从官网下载安装。
    有长期支持的稳定版,每周发布的开发版,以下是以稳定版2.89.2为例。
    下载pkg安装

安装完毕后,浏览器自动打开解锁界面。


Unlock Jenkins

拷贝上面的地址

~ vim /Users/lazy-ios2/.jenkins/secrets/initialAdminPassword
使用vim打开。

password

上面红框里的就是password,拷贝粘贴后,Continue。

安装推荐插件

选左边安装推荐插件,耐心等待。

设置管理员账户

首次进入Jenkins,先进去系统管理,设置好管理员权限。

Jenkins不会默认设置当前管理员用户的管理员权限。
导致登录失效后,就无法登录此账户了,真麻烦~

  1. 进入全局安全配置。


    系统管理
  2. 修改授权策略为安全矩阵,添加用户iostest(刚刚注册现在登录的用户)。


    授权策略
  3. 设置管理员用户为管理员权限,保存。


    完成权限修改
  • 添加用户
  1. 系统管理->管理用户->新建用户


    创建用户

    例如为测试人员创建只读和运行权限的用户。

  2. 系统管理->全局安全配置->授权策略


    配置权限

    Overall选择Read,其他权限选项按需选择。

还有其他授权策略,如项目矩阵授权策略,基于项目的授权方式,相对安全矩阵配置更灵活,当然配置也相对复杂,没有很多的实践经验,在这里不赘述。

Jenkins创建任务(job)

细心的童鞋会发现,Jenkins的Use-cases没有iOS。
只能自己找第三方教程和摸索,真麻烦~


Use-cases

使用构建一个自由风格软件项目为例。


自由风格的软件项目
  1. 项目的基础设置,按需设置吧,不明白点击后面的问好,有相关说明。


    image.png
  2. 源码管理
    正常来说,公司都有自己的代码仓库,这里以git为例。
    输入git地址,发现没有权限。
    点击图中的add进行添加私钥。
    git管理

    进入.ssh目录
    rsa私钥

    vim打开对应的rsa私钥文件,选中全部,拷贝。
    rsa

    回到Jenkins,点击add添加私钥,选则Jenkins。
    添加私钥

    选择ssh类型。有账户密码的话,要在Username和Passphrase输入账户密码。本例中未设置,故无需输入。
    ssh

    选择创建的Credentials,成功后红色错误提示消失。
    选择Credentials

    最后别忘了选择构建的branch。
    超时时间

    首次拉去代码时间较长,建议设置30分钟超时时间。
  3. 构建触发器


    构建触发器

    可以设置触发构建的事件,当前没有这种需求,当测试人员有需要的时候,再由测试人员去手动构建。 触发事件本身还是很有用的,尤其是Poll SCM,可以设置固定时间点构建。

  4. 构建环境


    构建环境

    由于使用fastlane打包,不用设置,直接跳过。

  5. 构建 (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。

PATH

在终端输入echo $PATH,打印PATH,拷贝。
全局属性

系统管理->系统设置->全局属性->环境变量,输入键PATH,值就是刚刚拷贝的字符串。

  • 构建失败, codesign failure。
    签名失败,通常是keychain解锁失败导致。因为创建Jenkins用户,默认并没有为它设置密码,导致它无法请求管理员权限来解锁keychain。


    设置Jenkins用户密码

    使用sudo passwd jenkins来设置Jenkins用户密码。

  • 构建失败,cannot find xxx scheme
    xcode command line找不到scheme,需要在Xcode设置scheme为shared,commit相关变更,push代码。


    shared scheme

    scheme的生成是依赖Xcode GUI,仅靠xcode command line不能生成scheme来构建。

  • 两个构建并行执行,构建速度慢
    系统管理->系统设置->执行者数量 设置为1,就不会同时进行多个构建。


    执行者数量
  • 让其他用户访问Jenkins


    IP地址

    锁死本机的IP地址,其他用户可以通多访问192.168.x.xxx:8080来使用Jenkins。


    配置IP

    系统管理->系统设置->Jenkins Location
    配置好地址,管理员邮件地址。在下面的邮件通知用得上。

邮件通知

  • 系统管理->系统设置->邮件通知


    Jenkins自带邮件通知

    配置发邮件的邮箱,建议新建一个Jenkins专用的邮箱,图中是腾讯的企业邮箱为例。配置好通过发送邮件测试邮件测试配置。

  • 系统管理->系统设置->Extended E-mail Notification(这个是建议插件中的一个,比Jenkins自带的邮件通知要强大)。


    Extended E-mail Notification

    将Jenkins自带邮件通知测试通过的配置,填入上面。
    然后设置默认收件人,多个用空格隔开。

构建后操作

回到任务配置中,最后一个构建后的操作。

  • 收件人列表设置


    Editable Email Notification

    默认收件人

    除了默认收件人,可以添加其他需要被通知到的收件人,多个用空格隔开。

  • 回复人设置


    回复列表

    回复列表,是指,如果有人回复了Jenkins发的邮件,直接回给哪些人(邮件),而不是Jenkins本身邮箱,Jenkins邮箱只有发邮件的功能。
    当然也可以在系统设置中设置默认回复列表。


    回复列表的作用
  • 内容设置


    构建后邮件设置

    Default Subject和Default Content也是类似的,按需要设置。
    可以查看Content Token Reference来具体设置。

  • Advance setting邮件发送触发配置。


    失败设置

    默认只有失败才发送。


    触发设置

    各自按需设置,根据触发条件不同,又能单独配置收件人列表,回复人列表以及内容。很强大有木有?

卸载Jenkins

在自己电脑实践Jenkins够了,想删除了。
使用Jenkins自带Uninstall.command来删除。
路径/Library/Application Support/Jenkins/Uninstall.command

卸载Jenkins

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342