iOS jenkins持续集成

仅需一键或配置时间 就可以自动打包通知测试童鞋,短信通知,公众号通知,邮件通知等等~

一、jenkins安装&配置

需要java环境,自行安装
JDK

java -version
1、安装

jenkins官网
找个稳定版的下载安装,一路下一步就行

安装完之后会自动打开
http://localhost:8080

之后

打开/Users/Shared/Jenkins/Home/secrets/initialAdminPassword 拷贝密码,如果没有打开读权限设置就好了

设置完之后可以更改密码,或保存在浏览器吧,忘记了就去上面的路径去找密码

2、配置

之后进入到系统管理-> 管理插件,按需安装

Xcode integration 构建的时候可以用Xcode
Keychains and Provisioning Profiles Management 管理Keychainsd
GitLab Plugin 如果用GitLab需安装
Gitlan Hook Plugin 如果用GitLab需安装
Subversion Plug-inSVN插件
Email Extension Plugin 发送邮件插件
Upload to pgyer 上传蒲公英
fir.im Jenkins 插件使用方法

jenkins证书配置

打开钥匙串把用到证书的权限开放到全部程序(在钥匙串访问去改)

~/Library/Keychains 里面的login.keychainlogin.keychain-db拷贝到

/Users/Shared/Jenkins/Library/Keychains下(没有文件夹就创建一个)

把~/Library/MobileDevice里的内容拷贝到
/Users/Shared/Jenkins/Library/MobileDevice下(没有文件夹就创建一个)

需安装插件Keychains and Provisioning Profiles Management
进入系统管理,进入Keychains and Provisioning Profiles Management,

Keychains
3、SSH

去Jenkins->Credentials->System-> Global credentials配置SSH
一看就懂了,生成公钥方式自行百度

4、构建项目配置

新建一个任务名称随便起

之后配置
1、General
随便起就行


2、源码管理

gitssh.png

3、构建触发器
这里的效果是,何时去打包,自行配置就行了

Poll SCM 轮询的方法,输入H/5 * * * *表示5分钟check一次SVN/Git的路径,如果源码有变化就构建

4、构建

这了按需选择了,Xcode需要安装Xcode integration插件 Upload to pgyer需要Upload to pgyer插件

如果用Xcode 9 之后的版本会有个问题,下面QA会讲到
选择Xcode的话感觉配置比较麻烦错误较多,不在叙述

也可以选择用fastlane gym --export_method ad-hoc --output_name ${IPANAME}
需要安装fastlane,这里我遇到一个小问题does not contain an Xcode project or workspace,解决方案“构建 ”--“ xcode” -- “Advanced Xcode build options” -- “Xcode Project Directory”,这里填写你的项目工程所在目录就可以了

参考脚本

#!/usr/bin/env bash

export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8
export FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT=120

rm -rf /Users/Shared/Jenkins/Library/Developer/Xcode/DerivedData
******隐藏代码******
fastlane gym -w ${buildProjectDir}lazyaudio.xcworkspace --clean -o ${buildDir} -s lazyaudio -n "${buildIpaName}.ipa" -q ${buildConfigStr} --export_method ${exportMethod} -a
******隐藏代码******

lftp << EOF
open ftp://xxxxxx:xxxxx@xxx.xxx.x.xxx
mkdir ${ftpPath}
cd ${ftpPath}
lcd ${ftpIpaPath}
mput *
close
bye
EOF


我这里用 xcodebuild方式打包
xcodebuild官方文档

选择Execute shell
添加脚本

记得把路径改了

按需要更改configuration Release/Debug

之前的时候也可以去清理项目

xcodebuild \
-workspace "${project_name}.xcworkspace" \
-scheme "${scheme_name}"  \
-configuration "${development_mode}" \
clean

如果工程用到pod了的话需要 - workspace
否则 - project

生成archive包

xcodebuild \
archive -workspace "/Users/Shared/Jenkins/Home/workspace/工程名/xxx/xxx.xcworkspace" \
-scheme "xxx" \
-configuration "Debug" \
-archivePath "/Users/Shared/Jenkins/Home/workspace/工程名/build/xxx.xcarchive" \

ExportOptions.plist如果不会配置的话,手动打包之后导出,放到一个不会变的地方

生成ipa包

xcodebuild -exportArchive -archivePath "/Users/Shared/Jenkins/Home/workspace/工程名/build/xxx.xcarchive" \
-exportPath "/Users/Shared/Jenkins/Home/workspace/工程名/build" \
-configuration "Debug" \
-exportOptionsPlist "/Users/Shared/Jenkins/Home/workspace/工程名/ExportOptions.plist" \
-allowProvisioningUpdates \

之后需要上传蒲公英或者fir,添加响应的插件,或脚本就行,去相应的官网去查
pgyer脚本官方文档

curl -F "file=@路径.ipa" \
-F "uKey=XXX" \
-F "_api_key=XXX" \
-F "updateDescription=升级描述可以不写" \
https://www.pgyer.com/apiv1/app/upload

或者pgyer插件


aaa.png

fir脚本官方文档

这里就配置完事了,返回点击立即构建,等着吧,可能会遇到各种各样的问题参见QA

二、Other

2、Fastlane安装

Fastlane是一套使用Ruby写的自动化工具集,用于iOS和Android自动化打包发布等工作,节约大量的时间
下面是安装过程
1、检查Ruby版本,需要2.0及以上版本

ruby -v

2、需要注意的是需要将gem的source改为https://gems.ruby-china.org/

gem sources

3、检查Xcode命令行工具是否安装

xcode-select --install

4、安装Fastlane

sudo gem install fastlane --verbose

5、检查Fastlane是否安装正确

fastlane --version
3、Mac 下执行脚本

直接拖然后回车就行

如果报Permission denied,就是没有权限

chmod 777 XX.sh

然后再次执行就行

4、

获取UDID

三、遇到的问题

这里有一些其他人总结的QA
https://www.jianshu.com/p/8b2fc2da0466

Q1、
error: exportArchive: "APPNAME.app" requires a provisioning profile with the Push Notifications feature.

Error Domain=IDEProvisioningErrorDomain Code=9 ""APPNAME.app" requires a provisioning profile with the Push Notifications feature." UserInfo={NSLocalizedDescription="APPNAME.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 **
A1、

因为 Xcode 9 默认不允许访问钥匙串的内容,必须要设置 allowProvisioningUpdates 才会允许,但是由于 Xcode integration 插件封闭,并不能对其进行修改加上这个属性,所以决定使用 Shell 脚本代替插件。

Q2、
User defaults from command line:
    IDEArchivePathOverride = /Users/Shared/Jenkins/Home/workspace/Test/build/RepaymentCreditCard.xcarchive

Build settings from command line:
    SDKROOT = iphoneos11.2
A2、

脚本中去掉-project APPNAME.xcodeproj -sdk iphoneos

Q3、fastlane: command not found
A3、

这个情况一般是由于 jenkins 没有设置正确的 $PATH 环境变量导致的。正确设置的方法为:

在命令行下执行 echo $PATH,记录下输出的结果
在 jenkins中系统管理-系统设置中,找到 环境变量(Environment variables)
在 key 中填写 PATH,在 value 中填写第一步中输出的结果
保存即可。

附录

xcodebuild + xcrun
# 工程名
APP_NAME="YourProjectName"
# 证书
CODE_SIGN_DISTRIBUTION="iPhone Distribution: Shanghai ******* Co., Ltd."
# info.plist路径
project_infoplist_path="./${APP_NAME}/Info.plist"

#取版本号
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")

#取build值
bundleVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleVersion" "${project_infoplist_path}")

DATE="$(date +%Y%m%d)"
IPANAME="${APP_NAME}_V${bundleShortVersion}_${DATE}.ipa"

#要上传的ipa文件路径
IPA_PATH="$HOME/${IPANAME}"
echo ${IPA_PATH}
echo "${IPA_PATH}">> text.txt

//下面2行是没有Cocopods的用法
echo "=================clean================="
xcodebuild -target "${APP_NAME}"  -configuration 'Release' clean

echo "+++++++++++++++++build+++++++++++++++++"
xcodebuild -target "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'

//下面2行是集成有Cocopods的用法
echo "=================clean================="
xcodebuild -workspace "${APP_NAME}.xcworkspace" -scheme "${APP_NAME}"  -configuration 'Release' clean

echo "+++++++++++++++++build+++++++++++++++++"
xcodebuild -workspace "${APP_NAME}.xcworkspace" -scheme "${APP_NAME}" -sdk iphoneos -configuration 'Release' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'

xcrun -sdk iphoneos PackageApplication "./Release-iphoneos/${APP_NAME}.app" -o ~/"${IPANAME}"

使用gym自动化打包
#计时

SECONDS=0

#假设脚本放置在与项目相同的路径下

project_path=$(pwd)

#取当前时间字符串添加到文件结尾

now=$(date +"%Y_%m_%d_%H_%M_%S")

#指定项目的scheme名称

scheme="DemoScheme"

#指定要打包的配置名

configuration="Adhoc"

#指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development, 和developer-id,即xcodebuild的method参数

export_method='ad-hoc'

#指定项目地址

workspace_path="$project_path/Demo.xcworkspace"

#指定输出路径

output_path="/Users/your_username/Documents/"

#指定输出归档文件地址

archive_path="$output_path/Demo_${now}.xcarchive"

#指定输出ipa地址

ipa_path="$output_path/Demo_${now}.ipa"

#指定输出ipa名称

ipa_name="Demo_${now}.ipa"

#获取执行命令时的commit message

commit_msg="$1"

#输出设定的变量值

echo "===workspace path: ${workspace_path}==="

echo "===archive path: ${archive_path}==="

echo "===ipa path: ${ipa_path}==="

echo "===export method: ${export_method}==="

echo "===commit msg: $1==="

#先清空前一次build

gym --workspace ${workspace_path} --scheme ${scheme} --clean --configuration ${configuration} --archive_path ${archive_path} --export_method ${export_method} --output_directory ${output_path} --output_name ${ipa_name}

#输出总用时

echo "===Finished. Total time: ${SECONDS}s==="


部分参考

https://www.jianshu.com/p/41ecb06ae95f
https://www.jianshu.com/p/c7b951b9b4f2
https://www.jianshu.com/p/9cb3d8c8c78d
https://www.jianshu.com/p/1268118d490f
https://www.jianshu.com/p/836579dd4837

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

推荐阅读更多精彩内容