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:[email protected]
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

你可能感兴趣的:(iOS jenkins持续集成)