对于一个开发来讲,Xcode手动打包是比较耗时的,而且是没有很大技术含量的工作。自动化打包根本目的是为了节约时间,把重复且无技术含量的事情交给系统去做,而且防止手动打包出现问题。下面我介绍Jenkins实现自动打包方案:
什么是Jenkins
Jenkins 是一个开源项目,提供了一种易于使用的持续集成系统,使开发者从繁杂的集成中解脱出来,专注于更为重要的业务逻辑实现上。同时 Jenkins 能实施监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象地展示项目构建的趋势和稳定性。
Jenkins的安装
Jenkins配置
安装完成之后,首选需要启动Jenkins,假如通过docker安装,直接在docker桌面程序里面启动,如果通过brew安装,通过下面的命令启动
- 启动jenkins: brew services start jenkins
- 停止jenkins:brew services stop jenkins
- 重启Jenkins:brew services restart jenkins
然后浏览器中输入http://localhost:8080 就会进入Jenkins初始化页面
找到Jenkins安装的目录,在Jenkins目录下/Home/secrets/initialAdminPassword这个目录,打开initialAdminPassword然后把密码复制出来粘贴到这里输入框
点击继续进入这个页面,点击建议安装的插件(默认左边这个选项)
然后就耐心的等待插件的安装
再然后就是创建第一个管理账户,就按着提示一步步走下来,这样就初始化配置完成了。
Jenkins配置插件
接下来就可以配置Jenkins常用到的插件了,选择系统管理->插件管理->可选插件。 安装GitLab插件["GitLab Plugin"、"Gitlab Hook Plugin"]和Xcode插件["Xcode integration"]
注意:有个重要的插件需要安装,安装[Keychains and Provisioning Profiles Management],但是这个最新版本的Jenkins安装完这个插件后,选择了文件点击upload一直没有反应是个Bug,需要在安装Jenkins版本的时候选择旧版的安装,具体可以参看这篇文章:Mac Jenkins环境搭建。但是假如你安装了新版本的Jenkins,又上传不了证书和描述问题,建议使用我提供的构建方案里面的第二种,直接通过Jenkins运行脚本打包,下面会有具体的脚本。
当Jenkins插件都安装完毕后,需要重启Jenkins,然后才能使用刚安装的插件。
重启完成之后,点击系统管理,滚动到页面最下方,发现了【Keychains and Provisioning Profiles Management】这个插件
Keychains and Provisioning Profiles Management插件配置
- Keychains文件目录在~/Library/Keychains,注意找到后需要把文件复制一份改成后缀名**.keychain** ,因为插件不允许上传后缀是keychain-db 文件。Description这个可以自定义,然后打开钥匙串,找到开发者证书,把名字复制出来粘贴在Code Signing Identity选项里。
- Provisioning Profiles文件目录是:~/Library/MobileDevice/Provisioning Profiles,找到对应项目的描述文件上传。
这样就配置好了证书和描述文件
安装完了这个,我们就可以配置一个构建项目了。
配置 Java 环境
因为这个Jenkins还是需要依赖 Java 环境的,根据安装的Jenkins 依赖的Java版本进行安装。首先检查电脑是否配置了Java环境
java -version
如果没有,可以去这个地址 www.oracle.com/technetwork… 下载JDK。安装完之后通过 java -version 查看安装的版本。
配置 Java 环境,在终端输入 which java ,输出安装路径(配置环境变量会用到)。打开 open ~/.bash_profile,然后输入
//jdk的安装路径
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-16.0.2.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH:.
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:.
最后输入 source ~/.bash_profile 配置的环境变量就生效了。
Jenkins的使用
创建任务
创建一个自由风格的软件项目
配置一下General参数
配置源码管理
打开自己的项目,复制项目链接填入Repository URL,然后点击Credentials右边的添加,主要是为了拉取项目使用,会展示出下图所示。有两种选择,使用账户密码或者使用SSH。
添加完之后会自动检查你添加的凭证是否正确,错误是会有报错信息的
提示:关于怎么配置SSH,首先检查是否配置过SSH,在终端执行命令 ls -al ~/.ssh,会存在以下两种情况:
- 如果配置过会输出id_rsa 和 id_rsa.pub,则证明配置过;
- 如果没有配置过,则执行命令ssh-keygen -t rsa -C "your_email@example.com",就会生成id_rsa 和 id_rsa.pub文件; 直接在终端输入vim ~/.ssh/id_rsa.pub,把输出的内容复制到gitLab配置SSH,在上面配置凭证那里也添加一下。
构建触发器这个配置项假如有需求的,可以根据自己的需求进行配置
设置构建环境
iOS打包需要签名文件和证书,所以我们勾选“Keychains and Code Signing Identities”和“Mobile Provisioning Profiles”。上面已经配置过这个插件的内容了,会自动填充相应的内容
设置构建,有三种选择:
使用脚本构建,增加Shell脚本
#!/bin/sh -l
#项目名
TARGET_NAME="TestDemo"
#证书
CODE_SIGN_DISTRIBUTION="XXXXX"
#info.plist路径
project_infoplist_path="./${TARGET_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="${TARGET_NAME}_V${bundleShortVersion}_${DATE}.ipa"
#要上传的ipa文件路径,这里我将ipa包放在用户目录下的archive文件夹中
IPA_PATH="$HOME/archive/${IPANAME}"
echo ${IPA_PATH}
echo "${IPA_PATH}">> text.txt
#获取权限,这个是电脑密码›
security unlock-keychain -p "XXXXX" $HOME/Library/Keychains/login.keychain
# //下面2行是没有Cocopods的用法
# echo "=================clean================="
# xcodebuild -target "${TARGET_NAME}" -configuration ‘Debug’ clean
# echo "+++++++++++++++++build+++++++++++++++++"
# xcodebuild -target "${TARGET_NAME}" -sdk iphoneos -configuration 'Debug' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'
#//下面2行是集成有Cocopods的用法
echo "=================clean================="
xcodebuild -workspace ${project_scheme}.xcworkspace -scheme "${TARGET_NAME}" -configuration 'Debug' clean
echo "+++++++++++++++++build+++++++++++++++++"
xcodebuild -workspace ${project_scheme}.xcworkspace -scheme "${TARGET_NAME}" -sdk iphoneos -configuration 'Debug' CODE_SIGN_IDENTITY="${CODE_SIGN_DISTRIBUTION}" SYMROOT='$(PWD)'
#//打包输出ipa
xcrun -sdk iphoneos PackageApplication "./Debug-iphoneos/${TARGET_NAME}.app" -o ${IPA_PATH}
#上传到蒲公英
uKey="XXXXXX"
#蒲公英上的API Key
apiKey="XXXXXX"
#蒲公英版本更新描述,这里取git最后一条提交记录作为描述
pgyer_desc=`git log -1 --pretty=%B`
#要上传的ipa文件路径
echo $IPA_PATH
#执行上传至蒲公英的命令
echo "++++++++++++++upload+++++++++++++"
curl -F "file=@${IPA_PATH}" -F "uKey=${uKey}" -F "_api_key=${apiKey}" -F "buildUpdateDescription=${pgyer_desc}" http://www.pgyer.com/apiv2/app/upload
#通知钉钉@对应的同学,同样通知到企业微信也是可以的
qrUrl="上传蒲公英包的URL"
#对应钉钉的链接
curl 'https://oapi.dingtalk.com/robot/send?access_token='
-H 'Content-Type: application/json'
-d '{
"msgtype": "markdown",
"markdown": {
"title":"新包",
"text": "#### iOS新包 \n > \n > "
},
"at": {
"atMobiles": [
"艾特谁填写谁的手机号码"
]
}
}'
echo -e "\n UPLOAD TO PGYER SUCCEED \n"
使用脚本构建,不用配置证书和描述文件
具体怎么配置可以看这篇文章:juejin.cn/post/704358… ,配置完成后直接通过配置参数完成构建
使用Xcode进行构建
项目使用了cocoapods管理第三方库,所以先需要增加了构建脚本shell。记得一定要加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/TestDemo
/usr/local/bin/pod update --verbose --no-repo-update
接下来添加xcode构建工具,首先配置General build settings
配置Code signing & OS X keychain options
配置Advanced Xcode build options
关于插件上传蒲公英的文档:www.pgyer.com/doc/view/je…
然后保存,点击构建
构建过程中出现的问题可以参考:www.jianshu.com/p/8b2fc2da0…
至此完成了一整套的构建流程
一般这样配置完就可以成功打包了,在整个配置过程中,都不能粗心大意的随意设置。这样就有个限制安装旧版本的Jenkins,还要上传证书和描述文件,最近我整理了可以直接使用脚本实现自动打包,每次通过Jenkins完成构建,通过参数配置:juejin.cn/post/704358… 。 这就是整个的打包过程,欢迎大家提出更好的改进意见和建议。