iOS 使用 Jenkins 自动化打包

[TOC]

前言:

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

步骤

安装 Jenkins

官网下载地址 :

https://jenkins.io/download/

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

《iOS 使用 Jenkins 自动化打包》 Jenkins下载.png

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

《iOS 使用 Jenkins 自动化打包》 安装输入密码.png

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

《iOS 使用 Jenkins 自动化打包》 日志文件中获取密码.png

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

安装相关插件

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

《iOS 使用 Jenkins 自动化打包》 安装插件.png

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

《iOS 使用 Jenkins 自动化打包》 Jenkins插件管理位置.png
《iOS 使用 Jenkins 自动化打包》 搜索插件安装.png

需要的有:

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

配置Jenkins和相关的插件信息

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

配置 JenkinsGitLab 相关信息

配置访问token

《iOS 使用 Jenkins 自动化打包》 GitLab_Private_Token.png

配置ssh

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

《iOS 使用 Jenkins 自动化打包》 GitLab_SSH.png

Jekins配置GitLab账号

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

《iOS 使用 Jenkins 自动化打包》 Jenkins配置GitLab.png

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

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

《iOS 使用 Jenkins 自动化打包》 Jenkins配置GitLab_Credentials.png

配置相关插件

配置证书插件

需要的是:

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

如下图

《iOS 使用 Jenkins 自动化打包》 证书路径.png

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

《iOS 使用 Jenkins 自动化打包》 Jenkins证书路径.png

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

《iOS 使用 Jenkins 自动化打包》 配置钥匙串访问和签名证书.png

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

《iOS 使用 Jenkins 自动化打包》 Xcode签名手动处理.png

新建工程

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

《iOS 使用 Jenkins 自动化打包》 Jenkins新建任务.png

配置工程

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

General

《iOS 使用 Jenkins 自动化打包》 general.png

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

源码管理

配置项目地址

《iOS 使用 Jenkins 自动化打包》 源码管理1.png

配置项目的访问凭证

《iOS 使用 Jenkins 自动化打包》 源码管理2.png

构建触发器

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

《iOS 使用 Jenkins 自动化打包》 构建触发器.png

构建环境

《iOS 使用 Jenkins 自动化打包》 构建环境.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的路径

《iOS 使用 Jenkins 自动化打包》 pod绝对路径.png

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

《iOS 使用 Jenkins 自动化打包》 Jenkins项目路径.png

配置 buildarchive 配置

添加构建步骤 – Xcode

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

General build settings

一、

《iOS 使用 Jenkins 自动化打包》 General build settings1.png

二、

《iOS 使用 Jenkins 自动化打包》 General build settings2.png

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

Code signing & OS X keychain options

《iOS 使用 Jenkins 自动化打包》 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

    原文作者:oceanfive
    原文地址: https://www.jianshu.com/p/8ba3c73e3f1c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞