iOS 使用 jenkins 自动化打包过程
前言:
以前每次给测试人员安装app的时候都是在Xcode上直接安装,效率很低,浪费时间,为了提高效率,也是配合公司整个自动化的流程,研究了一下自动化打包的过程,记录如下;
步骤
安装 Jenkins
官网下载地址 :
我的电脑是Mac
系统,选择了 Mac OS X
安装完成后需要输入密码进入
密码可以点击连接在服务器上获取,也可以从本地日志中获取密码;
后面就是下一步…,都有提示的
安装相关插件
安装推荐的插件,可以先安装推荐的插件,然后再搜索插件自定义安装;
搜索插件并安装: Jenkins首页
– 系统管理
– 插件管理
需要的有:
-
Keychains and Provisioning Profiles Management
: 证书管理 -
Xcode integration
: 持续集成,build
和archive
的一些配置信息
配置Jenkins
和相关的插件信息
我这边使用的是gitlab
管理源代码,所以需要配置ssh
。(注意:不能使用http
配置否则会报错)
配置 Jenkins
的 GitLab
相关信息
配置访问token
配置ssh
ssh
生成和获取可以点击链接查看怎么获取,或者百度一下
在Jekins
配置GitLab
账号
在Jenkins
– 系统设置
– 系统设置
– 配置
– GitLab
中进行配置
host URL
只需要写gitlab
的域名就好了,不需要具体的项目地址
配置访问GitLab
的证书: 选择 GitLab API Token
,把前面获取到的填入即可
配置相关插件
配置证书插件
需要的是:
-
Keychains
: 路径/Users/{用户名}/Library/Keychains
-
MobileDevice
: 路径/Users/{用户名}/Library/MobileDevice
如下图
把这两个文件夹的内容复制
到Jenkins
用户下:(Jenkins
是新建了一个用户)
下面开始配置钥匙串访问和签名证书
这里需要把
Xcode
证书改为手动管理,如下
新建工程
点击 Jenkins
– 新建任务
开始构建任务
配置工程
我这边用的是GitLab
,下面以GitLab
作为讲解
General
对应需要多个配置变量的,可以使用
参数化构建过程
源码管理
配置项目地址
配置项目的访问凭证
构建触发器
这里可以定时,也可以自定义
构建环境
构建
更新 pod
现在项目都是使用了 pod
进行第三方库的管理,需要需要更新pod
,否则项目运行不起来
这里选择 shell
执行,代码参考如下
#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/项目名称
/usr/local/bin/pod update --verbose --no-repo-update
说明:
-
cd $WORKSPACE/项目名称
: 这句代码和我们从终端更新pod
的操作时一样,这里需要注意路径的问题,项目名称.xcworkspace
或者项目名称.xcodeproj
的上一级目录 -
/usr/local/bin/pod update --verbose --no-repo-update
: 更新pod
,这里前面是pod
的绝对路径,直接使用pod update
可能会报错pod: command not found
,所以这里使用pod
的绝对路径来执行,见下面pod
路径
pod
的路径
Jenkins
用户的项目路径为/Users/Shared/Jenkins/Home/workspace
配置 build
和 archive
配置
添加构建步骤 - Xcode
注意:在
Xcode 9
之后,使用Jenkins
的插件Xcode integration
在导出ipa
文件的时候会报错,因为需要pp
文件和一些其他的配置plist
文件;索引这里我只archive
使用了插件Xcode integration
,但是导出ipa
包使用脚本文件shell
执行,具体如下
General build settings
一、
二、
注意,这里执行
build
archive
命令,得到的是.xcarchive
文件,需要我们签名才能变成.ipa
文件
Code signing & OS X keychain options
这里需要解锁钥匙串,否则会报错
Command /usr/bin/codesign failed with exit code 1
Advanced Xcode build options
签名、获取 ipa
文件
因为Xcode 9
之后签名需要pp
文件,自带的插件不支持,所以使用了脚本执行shell
命令如下:
xcodebuild -exportArchive -archivePath "{.xcarchive文件路径}" -exportPath "{输入目录,一般是build目录}" -exportOptionsPlist '{导致配置参数的plist文件路径}' -allowProvisioningUpdates
参考脚本shell
如下:(PROJECT_NAME
是自己添加的参数化构建)
echo exportArchive parameters begin ----
echo $JOB_BASE_NAME
echo $JOB_NAME
build_dir="$WORKSPACE/build"
project_name="${PROJECT_NAME}"
archivePath="$build_dir/$project_name.xcarchive"
exportPath=$build_dir
exportOptionsPlist="$WORKSPACE/ExportOptions_Debug.plist"
echo $archivePath
echo $exportPath
echo $exportOptionsPlist
echo exportArchive parameters end ----
xcodebuild -exportArchive -archivePath "$archivePath" -exportPath "$exportPath" -exportOptionsPlist "$exportOptionsPlist" -allowProvisioningUpdates
一些其他处理
更改文件名称
打包出来的文件名称格式不符合要求,所以自己加了一段脚本更改ipa
文件名称
echo "ipa文件改名开始 ----- "
project_name="${PROJECT_NAME}"
echo $project_name
plistPath="$WORKSPACE/$project_name/$project_name/Info.plist"
echo $plistPath
versionString=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" $plistPath)
echo $versionString
formattedDate=$(date "+%Y%m%d%H%M%S")
echo $formattedDate
oldName="$project_name.ipa"
newName="app_parent-$versionString-$formattedDate-debug.ipa"
cd "$WORKSPACE/build"
$(mv $oldName $newName)
echo "ipa文件改名结束 -----"
注意:这里更改文件名称使用的是
mv
命令,rename
命令在mac
系统下面默认是没有的
构建后操作
构建完成后,可以上传ipa
文件到相应的平台,(蒲公英之类的)
过程中遇到的错误以及处理
git
拉去代码出错
ERROR: Timeout after 10 minutes
ERROR: Error cloning remote repo 'origin'
原因:一开始在源码管理
这一块使用的是http
连接、设置了账号和密码,就一直报错;
解决:使用ssh
连接源码管理,具体步骤参照上面的步骤
pod
命令
pod: command not found
找不到pod
命令;
原因:Jenkins
是新开了一个用户的;pod
命令的位置找不到;
解决:使用pod
的绝对路径进行命令操作;
#bin/bsah - l
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
cd $WORKSPACE/项目名称
/usr/local/bin/pod update --verbose --no-repo-update
证书签名问题
== Certificates available for the Codesign
[HaiZiGuoParents] $ /usr/bin/security find-identity -p codesigning -v
0 valid identities found
No global development team or local team ID was configured, back to default automatic signing
---------
check dependencies
Code Signing Error: There are no accounts registered with Xcode. Add your developer account to Xcode
Code Signing Error: No profiles for '.......' were found: Xcode couldn't find any iOS App Development provisioning profiles matching '........'.
原因:证书配置出错了;
解决:参考上面的步骤,重新配置证书;
注意:把相应的证书文件复制到
Jenkins
用户目录下的Library
文件下面
Command /usr/bin/codesign failed with exit code 1
The following build commands failed:
CodeSign /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData/......-alyncnqklycsyacghgezqybbpyae/Build/Intermediates.noindex/ArchiveIntermediates/......./InstallationBuildProductsLocation/Applications/HaiZiGuoParents.app
试试在 Code signing & OS X keychain options
添加 Unlock Keychain?
这个选项,就是解锁钥匙串访问的权限;
Check dependencies
Code Signing Error: "Test" requires a provisioning profile with the Push Notifications feature. Select a provisioning profile for the "Release" build configuration in the project editor.
warning: no rule to process file
原因: Xcode
中没有配置证书;
解决:不要
使用自动管理证书,使用手动
管理证书,并配置相关证书文件,参考上面响应的步骤;
签名ipa
问题
error: exportArchive: "Test.app" requires a provisioning profile with the Push Notifications feature.
Error Domain=IDEProvisioningErrorDomain Code=9 ""Test.app" requires a provisioning profile with the Push Notifications feature." UserInfo={NSLocalizedDescription="Test.app" requires a provisioning profile with the Push Notifications feature., NSLocalizedRecoverySuggestion=Add a profile to the "provisioningProfiles" dictionary in your Export Options property list.}
** EXPORT FAILED **
导出失败;
原因:Xcode 9
之后导出ipa
文件需要一些配置信息,(可以手动导出一遍,看看系统的配置信息ExportOptions.plist
)
解决:使用脚本shell
签名ipa
,参考上面响应的步骤;
参考文章
https://www.jianshu.com/p/7a2efc7c69fe
https://www.jianshu.com/p/ce36997919b4
上一篇: 详述ROWID的原理及其使用
下一篇: 解析中常见错误