iOS 使用 jenkins 自动化打包过程

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhhelnice/article/details/82387716

前言:

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

步骤

安装 Jenkins

官网下载地址 :

https://jenkins.io/download/

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

Jenkins下载

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

安装输入密码

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

日志文件中获取密码

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

安装相关插件

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

安装插件

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

Jenkins插件管理位置

搜索插件安装

需要的有:

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

配置Jenkins和相关的插件信息

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

配置 JenkinsGitLab 相关信息

配置访问token

GitLab_Private_Token

配置ssh

ssh生成和获取可以点击链接查看怎么获取,或者百度一下

GitLab_SSH

Jekins配置GitLab账号

Jenkins系统设置系统设置配置GitLab 中进行配置

Jenkins配置GitLab

host URL只需要写gitlab的域名就好了,不需要具体的项目地址

配置访问GitLab的证书: 选择 GitLab API Token,把前面获取到的填入即可

Jenkins配置GitLab_Credentials

配置相关插件

配置证书插件

需要的是:

  • Keychains : 路径 /Users/{用户名}/Library/Keychains
  • MobileDevice : 路径 /Users/{用户名}/Library/MobileDevice

如下图

证书路径

把这两个文件夹的内容复制Jenkins用户下:(Jenkins是新建了一个用户)

Jenkins证书路径

下面开始配置钥匙串访问和签名证书

配置钥匙串访问和签名证书

这里需要把Xcode证书改为手动管理,如下

Xcode签名手动处理

新建工程

点击 Jenkins新建任务 开始构建任务

Jenkins新建任务

配置工程

我这边用的是GitLab,下面以GitLab作为讲解

General

general

对应需要多个配置变量的,可以使用参数化构建过程

源码管理

配置项目地址

源码管理1

配置项目的访问凭证

源码管理2

构建触发器

这里可以定时,也可以自定义

构建触发器

构建环境

构建环境

构建

更新 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绝对路径

Jenkins用户的项目路径为 /Users/Shared/Jenkins/Home/workspace

Jenkins项目路径

配置 buildarchive 配置

添加构建步骤 - Xcode

注意:在Xcode 9之后,使用Jenkins的插件Xcode integration 在导出ipa文件的时候会报错,因为需要pp文件和一些其他的配置plist文件;索引这里我只archive使用了插件Xcode integration,但是导出ipa包使用脚本文件shell执行,具体如下

General build settings

一、

General build settings1

二、

General build settings2

注意,这里执行build archive命令,得到的是.xcarchive 文件,需要我们签名才能变成.ipa文件

Code signing & OS X keychain options

Code signing - OS X keychain options

这里需要解锁钥匙串,否则会报错

Command /usr/bin/codesign failed with exit code 1
Advanced Xcode build options

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

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

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

猜你喜欢

转载自blog.csdn.net/zhhelnice/article/details/82387716