[TOC]
前言:
以前每次给测试人员安装app的时候都是在Xcode上直接安装,效率很低,浪费时间,为了提高效率,也是配合公司整个自动化的流程,研究了一下自动化打包的过程,记录如下;
步骤
安装 Jenkins
官网下载地址 :
我的电脑是Mac
系统,选择了 Mac OS X
Jenkins下载.png
安装完成后需要输入密码进入
安装输入密码.png
密码可以点击连接在服务器上获取,也可以从本地日志中获取密码;
日志文件中获取密码.png
后面就是下一步…,都有提示的
安装相关插件
安装推荐的插件,可以先安装推荐的插件,然后再搜索插件自定义安装;
安装插件.png
搜索插件并安装: Jenkins首页
— 系统管理
— 插件管理
Jenkins插件管理位置.png
搜索插件安装.png
需要的有:
-
Keychains and Provisioning Profiles Management
: 证书管理 -
Xcode integration
: 持续集成,build
和archive
的一些配置信息
配置Jenkins
和相关的插件信息
我这边使用的是gitlab
管理源代码,所以需要配置ssh
。(注意:不能使用http
配置否则会报错)
配置 Jenkins
的 GitLab
相关信息
配置访问token
GitLab_Private_Token.png
配置ssh
ssh
生成和获取可以点击链接查看怎么获取,或者百度一下
GitLab_SSH.png
在Jekins
配置GitLab
账号
在Jenkins
— 系统设置
— 系统设置
— 配置
— GitLab
中进行配置
Jenkins配置GitLab.png
host URL
只需要写gitlab
的域名就好了,不需要具体的项目地址
配置访问GitLab
的证书: 选择 GitLab API Token
,把前面获取到的填入即可
Jenkins配置GitLab_Credentials.png
配置相关插件
配置证书插件
需要的是:
-
Keychains
: 路径/Users/{用户名}/Library/Keychains
-
MobileDevice
: 路径/Users/{用户名}/Library/MobileDevice
如下图
证书路径.png
把这两个文件夹的内容复制
到Jenkins
用户下:(Jenkins
是新建了一个用户)
Jenkins证书路径.png
下面开始配置钥匙串访问和签名证书
配置钥匙串访问和签名证书.png
这里需要把
Xcode
证书改为手动管理,如下
Xcode签名手动处理.png
新建工程
点击 Jenkins
— 新建任务
开始构建任务
Jenkins新建任务.png
配置工程
我这边用的是GitLab
,下面以GitLab
作为讲解
General
general.png
对应需要多个配置变量的,可以使用
参数化构建过程
源码管理
配置项目地址
源码管理1.png
配置项目的访问凭证
源码管理2.png
构建触发器
这里可以定时,也可以自定义
构建触发器.png
构建环境
构建环境.png
构建
更新 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
的路径
pod绝对路径.png
Jenkins
用户的项目路径为/Users/Shared/Jenkins/Home/workspace
Jenkins项目路径.png
配置 build
和 archive
配置
添加构建步骤 – Xcode
注意:在
Xcode 9
之后,使用Jenkins
的插件Xcode integration
在导出ipa
文件的时候会报错,因为需要pp
文件和一些其他的配置plist
文件;索引这里我只archive
使用了插件Xcode integration
,但是导出ipa
包使用脚本文件shell
执行,具体如下
General build settings
一、
General build settings1.png
二、
General build settings2.png
注意,这里执行
build
archive
命令,得到的是.xcarchive
文件,需要我们签名才能变成.ipa
文件
Code signing & OS X keychain options
Code signing & OS X keychain options.png
这里需要解锁钥匙串,否则会报错
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
连接源码管理,具体步骤参照上面的步骤;
2018-12-11更新:
后面又尝试了 URL
使用http
和git
开始,密码使用账号和密码
和使用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