iOS自动化构建(Jenkins + XcodeBuild + Fir)

  最近在搞项目的自动化构建,一路过来,可谓是踩坑无数,故特地将某些细节记载下来,方便有需要的人。
  之前看过一些文章,所以一开始准备用Jenkins上的xcode插件来构建,后来才发现那些文章写得虽好,但里边的很多配置都过时了,所以建议大家使用脚本来构建。插件会失效,但脚本不会过期。
  在开始之前,建议大家先建立一个能够正常archiveexport的空工程,因为真实的工程代码量很大,后面多次测试构建会很花时间。

1、下载安装Jenkins

image.png

  Jenkins是基于Java环境的,所以电脑上必须先安装Java,然后去Jenkins官网(https://jenkins.io/)下载安装Jenkins。
安装完成后会自动打开http://localhost:8080这个网址,如果没有自动打开可以手动打开。打开后如出现找不到服务器的情况,可以尝试打开http://127.0.0.1:8080,两者是一样的。有些教程还有添加Xcode integration 、Keychains and Provisioning Profiles Plugin之类插件的步骤,我们不需要。因为我们是用xcode脚本构建,所以不需要安装任何插件。

2、新建任务

1)点击新建任务
image.png
2)选择“构建一个自由风格的软件项目”,点击确定
image.png
3)填写工程相关介绍
image.png
4)源码管理

  我选择SVN


image.png
5)构建触发器

  这部分后面再讲。我们先把手动构建的环境搭建成功,再来搞自动构建。

6)构建环境

  通过xcodebuild脚本的方式构建,这里不用做任何设置。

7)构建

  重点来了。
  点击“添加构建步骤”,选择Execute shell

image.png

项目中使用了CocoPods,添加这段代码:

#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/Test  #进入工程目录
/usr/local/bin/pod install  #这里根据自己实际情况,决定要不要pod install

继续添加构建步骤:


image.png
xcodebuild clean -workspace Test.xcworkspace \
                 -scheme Test \

xcodebuild archive -workspace Test.xcworkspace \
                   -scheme Test \
                   -archivePath "$WORKSPACE/Test.xcarchive" \
                   -configuration Debug \

xcodebuild -exportArchive -archivePath "$WORKSPACE/Test.xcarchive" \
                          -exportPath "$WORKSPACE/Export/Test" \
                          -exportOptionsPlist "$WORKSPACE/ExportOptions.plist" \
                          -configuration Debug \
            
fir publish "$WORKSPACE/Export/Test/Test.ipa" -T "d83355ce621b98d3b*****2ae9fa2"

说明:
-archivePath:.xcarchive文件的存放路径。
-exportPath:导出文件的路径。Export文件夹是自己建的。
-ExportOptions.plist:这个文件的内容其实是ipa的打包信息。手动archiveexport时,这个文件就包含在最终输出的文件夹内,可以copy一份出来使用。
-configuration :默认DebugRelease

这里有个坑要说明一下。archive和ipa文件的导出目录最好位于Jenkins用户下的那个工程中,我之前选择的是导出到当前用户的桌面,结果一直报读写权限的问题。

3、上传到fir

fir publish "$WORKSPACE/Export/Test/Test.ipa" -T "d83355ce621b98d3b*****2ae9fa2"

要实现自动上传到fir,要先安装fir-cli。
Github: fir-cli
fir token查看方法:

image.png

若过程出现:command not found:
1、控制台执行 echo $PATH,复制输出内容。
2、jenkins->系统管理->系统设置。
3、勾选Environment variables,添加键值。键:PATH,值:刚才复制的内容。

image.png

4、配置自动触发器

  Jenkins在自动化构建的过程中,更多的是充当监察者的作用。一旦监察到仓库中的内容有任何变化,就自动触发构建打包。
自动触发构建可参考这篇文章:Jenkins之定时构建

至此,Jenkins+xcodebuild+fir环境搭建完成。
共勉。

附:错误记录

1、Code Signing Error: No profile for team 'XXX' matching 'XXX' found:

bug1.png

原因:
缺少描述文件。

解决方法:
硬盘/Users/Shared/Jenkins/Library/MobileDevice/Provisioning Profiles路径下添加所需的描述文件。推荐使用Xcode自动管理描述文件的方式,避免出现此类问题。

2、XXX.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler

bug2.png

原因:
编辑该.o文件时出错。

解决方法:
我的情况是,在A电脑写代码,在B机器Jenkins打包,A、B两机器的pod版本不一致,导致pod下来的第三方代码也不一致,编译时自然会出错。AB两电脑pod update一下,保持版本一致,重新提交代码即可。

3、error: exportArchive: No certificate for team 'XXX' matching 'XXX' found. Specify a different signing certificate for "signingCertificate" in your Export Options property list

bug3.png

原因:
exportArchive时证书和描述文件对应不上。
解决方法:
我使用的ExportOptions.plist是Release模式生成的,但是Jenkins exprortArchive时选择的是Debug模式。模式不一致,证书和描述文件自然对应不上。

4、Jenkins打包时提示Multiple commands produce...,但真机测试没问题

原因:
Jenkins打包时默认使用的是New build system,而不管你Xcode里是如何设置的。
解决方法:
archive时添加xcodebuild指令-UseModernBuildSystem=NO,指定不使用当前的编译系统。

5、git clone 报错 Permission denied (publickey,password).git配置ssh key

原因:
Jenkins配置ssh登录时,需要拷贝私钥,而不是公钥

6、 jenkins env: ruby_executable_hooks: No such file or directory

原因:需要安装executable-hooks
解决方法:
sudo gem install --user-install executable-hooks
安装过程中,要留意异常。有可能报path相关的错误,导致某些程序不能执行。此时参照提示,使用vim打开bash_profile文件,把需要的path写进去,然后重新执行命令。安装完成之后,再删掉刚才的path。一定要记得删除,否则后面使用Jenkins构建时会报很多诸如command not found之类的错误。

7、Jenkins requires Java versions [8, 11] but you are running with Java 13 from...

原因:
本地Java版本不适合,需要安装jdk8或jdk11

8、Failed to connect to raw.githubusercontent.com port 443: Connection refused...

原因:
出现这个错误一般是被墙的原因。可以尝试设置DNS为114.114.114.114或者8.8.8.8

9、xcodebuild: error: The workspace named "XXX" does not contain a scheme named "XXX". The "-list" option can be used to find the names of the schemes in the workspace.

解决方法:
1、工程的scheme和构建脚本的scheme对应不上。例如本次构建,脚本的scheme是AAA,但实际上工程的scheme是BBB。
2、或者:Choose Scheme > Manage Schemes (from the Product Menu).
Ensure the ‘Shared’ box is checked for that scheme。打开Shared选项。这个是别人遇到的情况并提供的答案。

10、Failed to build gem native extension

解决方法:
Mac OS某些版本,有个pkg需要手动安装。
open /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg

11、double check问题

Jenkins detected that you appear to be running more than one instance of Jenkins that share the same home directory '/data/jenkins/home’. This greatly confuses Jenkins and you will likely experience strange behaviors, so please correct the situation.
This Jenkins:    723777919 contextPath="" at 25@MYLINUX
Other Jenkins:    47707180 contextPath="/jenkins" at 25@MYLINUX

原因:
Jenkins启动之后,会在home目录下生成.owner文件。里面标识了本次Jenkins实例的唯一标识。

47707180 contextPath="/jenkins" at 25@MYLINUX

解决方法:
1、直接选择忽略
2、然后删除.owner文件,再退出登录
3、重新登录。它会重新生成.owner文件

12、可以通过localhost:8080访问,但是无法通过ip访问,例如:172.21.18.83:8080

解决方法:
Jenkins默认只会监听127.0.0.1的请求,我们需要修改httpListenAddress为0.0.0.0,监听所有ip的请求。
1、打开对应路径,修改httpListenAddress的值

~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist
/usr/local/Cellar/jenkins/版本号/homebrew.mxcl.jenkins.plist

2、关闭并重新开启Jenkins

brew services stop jenkins
brew services start jenkins

注意: 不能使用brew services restart jenkins。这个指令会重置配置,导致我们刚才的自定义配置失效。

参考

手把手教你利用Jenkins持续集成iOS项目
How can I use the legacy build system with Xcode 10's xcodebuild?
Jenkins之定时构建

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

推荐阅读更多精彩内容