iOS 使用 Jenkins 自动化打包

[TOC]

前言:

以前每次给测试人员安装app的时候都是在Xcode上直接安装,效率很低,浪费时间,为了提高效率,也是配合公司整个自动化的流程,研究了一下自动化打包的过程,记录如下;

步骤

安装 Jenkins

官网下载地址 :

https://jenkins.io/download/

我的电脑是Mac系统,选择了 Mac OS X

Jenkins下载.png

安装完成后需要输入密码进入

安装输入密码.png

密码可以点击连接在服务器上获取,也可以从本地日志中获取密码;

日志文件中获取密码.png

后面就是下一步...,都有提示的

安装相关插件

安装推荐的插件,可以先安装推荐的插件,然后再搜索插件自定义安装;

安装插件.png

搜索插件并安装: Jenkins首页 -- 系统管理 -- 插件管理

Jenkins插件管理位置.png
搜索插件安装.png

需要的有:

  • Keychains and Provisioning Profiles Management : 证书管理
  • Xcode integration : 持续集成,buildarchive 的一些配置信息

配置Jenkins和相关的插件信息

我这边使用的是gitlab管理源代码,所以需要配置ssh。(注意:不能使用http配置否则会报错)

配置 JenkinsGitLab 相关信息

配置访问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

配置 buildarchive 配置

添加构建步骤 - 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 使用httpgit开始,密码使用账号和密码和使用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

https://blog.csdn.net/u013602835/article/details/54632843

https://www.jianshu.com/p/faf879b3d182

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

推荐阅读更多精彩内容