文章目录
Jenkins介绍
Jenkins是一个开源软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作(比如代码打包、提测),旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。
Jenkins功能包括:
1、持续的软件版本发布/测试项目
2、监控外部调用执行的工作
自动化流程
-
版本迭代完毕,已提交git服务器
-
执行jenkins构建操作,执行脚本完成签名、打包、上传分发平台等操作
-
上传三方平台后,向钉钉工作群发送测试通知消息
-
测试下载安装测试包完成测试工作
Jenkins服务器环境配置
step1 安装 jdk 环境
-
到 Oracle 官网下载 jdk.dmg 安装包(xxx.dmg为mac环境下的包)
-
打开 jdk.dmg,一键完成 jdk 的安装及环境变量的配置
-
在终端输入java、javac命令,显示相关命令说明即表示 jdk 安装配置成功
step2 安装 jenkins 环境
-
到 jenkins 官网下载 jenkins.pkg 安装包
-
打开 jenkins.pkg 一键完成服务器的搭建
-
进入配置页面,根据提示,输入管理员密码,进入 jenkins 管理平台
打开相应的日志文件,找到管理员密码:
- 选择安装推荐的插件
- 创建第一个管理员用户
6. 实例配置
- 完成 Jenkins 安装
补充:安装可选插件
可以在系统管理 - 管理插件 - 可选插件 中搜索相应的插件并安装。
插件可以帮助我们完成一些额外工作,例如 Xcode integration 帮我们执行 Xcode命令 打包 ipa 包,Email Extension Plugin 帮我们发送邮件 等等,更多内容可以查阅可选插件中列表信息。
Jenkins使用
首页功能模块
系统管理功能模块
创建第一个任务
-
新建项目
-
代码源管理
这里可以填写该项目等描述信息、设置构建版本的管理策略等。
- 设置源码
本文是以一个 Git 项目来掩饰自动化打包的,因此这里选择代码源为 Git ,填写好相应的仓库地址,设置相应的账号信息等。
添加 Credentials , Kind 有多种选择,这里选用了 ssh 的验证方式。
ssh私钥的创建方式,可以查阅:如何生成SSH key。
- 触发器
触发器用来触发项目的版本构建任务。
Jenkins 有多种的触发方式,这里采用远程触发构建任务,身份验证令牌即 TOKEN_NAME 字段,你可以访问 JENKINS_URL/job/TestProject/build?token=TOKEN_NAME
或者 /buildWithParameters?token=TOKEN_NAME
来触发构建任务。
你也可以不使用触发器,点击 立即构建 进行手动构建版本。
- 构建版本(shell脚本)
首先说明的是,Jenkins 的工作目录在共享系统的共享文件下。
另外我们需要知道的是,在构建版本的时候,Jenkins会在其 Library 目录中寻找相应的发布证书、配置文件,因此我们需要将系统开发环境下的 Keychains 和 MobileDevice 两个文件夹复制到 Jenkins 的 Library 下,另外,请确保要打包项目对应的发布证书和配置文件都在其中,如若不在,请下载安装后,更新到 Jenkins 的 Library 下,又或者你在编写 shell 脚本时,尝试将文件路径指向系统对应的文件夹。
⚠️:我不小心将权限搞坏掉了,导致我的账户下的应用软件绝大部分都无权限打开,所以请谨慎尝试,最好还是将两个文件夹复制后放在 Jenkins 环境下。
Keychains路径:/Users/'当前用户名'/Library/Keychains
配置证书路径:/Users/'当前用户名'/Library/MobileDevice
编写构建的 shell 脚本
echo "=================1.创建环境及一些文件路径================="
# 创建一个 output 路径文件夹,用户存储所有任务下的项目文件
# $HOME表示 Jenkins 的主目录
OUTPUT_PATH="$HOME/Home/output"
if [ ! -d $OUTPUT_PATH ]; then
mkdir $OUTPUT_PATH
fi
# 创建当前任务下的 项目文件 环境
# ${JOB_NAME} 表示当前任务名称
JOB_NAME_PATH="$OUTPUT_PATH/${JOB_NAME}"
if [ ! -d $JOB_NAME_PATH ]; then
mkdir $JOB_NAME_PATH
fi
# 项目工程名
APP_NAME="TestProject" #替换成你的项目工程名
# 项目中 info.plist 路径(注意和你项目中对应的世纪路径)
# Jenkins 会拉取项目代码,到 workspace 目录下
project_infoplist_path="$HOME/Home/workspace/${JOB_NAME}/${JOB_NAME}/${APP_NAME}/Info.plist"
# 获取项目的版本号,用于创建版本文件夹,以此区分不同版本下的打包文件
bundleShortVersion=$(/usr/libexec/PlistBuddy -c "print CFBundleShortVersionString" "${project_infoplist_path}")
# 要上传的 ipa 文件路径,区分了版本
IPA_PATH="${JOB_NAME_PATH}/${bundleShortVersion}(${BUILD_ID})"
# 创建 ipa 路径文件夹
mkdir $IPA_PATH
# archive 文件路径,在步骤5中使用
ARCHIVE_PATH="${IPA_PATH}/${APP_NAME}_${BUILD_ID}.xcarchive"
echo "=================2.进入工程目录================="
cd $HOME/Home/workspace/${JOB_NAME}/${JOB_NAME}
# xcodebuild -list 命令可以查看工程的:Targets、Configurations、Schemes
echo "=================3.清理工程================="
# xcodebuild 是 Xcode 打包命令
xcodebuild clean -target "${APP_NAME}" -configuration 'Debug'
echo "=================4.解锁钥匙串================="
#解决:codesign"seckey api returned: -25308,(null)"
# *** 是一般为电脑登录密码,这里读取了 Jenkins 下的 Library 中的 Keychains
security unlock-keychain -p "***" "${HOME}/Library/Keychains/login.keychain-db"
echo "=================5.开始打包生成 xcarchive 文件================="
# 在xcode中设置scheme为shared,否则可能出现工程无scheme的错误
# 还可以添加其他参数,不设置的都是默认使用项目Build Settings里面的配置,包括 CODE_SIGN_IDENTITY 和 PROVISIONING_PROFILE
# 如果是使用了cocopods的workspace,可将 -project 替换为 -workspace , .xcodeproj 替换为 .xcworkspace
xcodebuild archive -project "${APP_NAME}.xcodeproj" -scheme "${APP_NAME}" -sdk iphoneos -configuration "Debug" -archivePath "${ARCHIVE_PATH}"
echo "=================6.从xcarchive文件中导出 ipa ================="
# 项目中的plist文件,主要是描述了导入的 ipa 使用的发布证书和配置文件
ADHOC_PLIST_PATH="$HOME/Home/workspace/${JOB_NAME}/${JOB_NAME}/adhoc.plist"
xcodebuild -exportArchive -archivePath "${ARCHIVE_PATH}" -exportPath "${IPA_PATH}" -exportOptionsPlist "${ADHOC_PLIST_PATH}" -allowProvisioningUpdates
echo "=================7-1.发布 ipa 到蒲公英================="
# 本地 ipa 包的路径
FILE_PATH="${IPA_PATH}/${APP_NAME}"
# 将 ipa 包上传到蒲公英,uKey 和 _api_key 是蒲公英账号信息中的
curl -F "file=@${FILE_PATH}.ipa" -F "uKey=b6633cc***********4ea09ba" -F "_api_key=995e*************a4d2751" https://qiniu-storage.pgyer.com/apiv1/app/upload
#echo "=================7-2.发布ipa到fir================="
#fir publish "${FILE_PATH}.ipa" -T "14cc94e************6b6ab67688"
echo "=================8.将下载链接发送到钉钉=============="
# access_token 为钉钉机器人的 access_token
# 钉钉机器人发消息的格式请参考钉钉官网开发文档
curl "https://oapi.dingtalk.com/robot/send?access_token=2e1a4d557e357e81ef********576612c6c" -H "Content-Type: application/json" -d "{\"msgtype\": \"text\", \"text\": {\"content\": \"更新地址:https://www.pgyer.com/****\"}}"
脚本解读:
- 在执行完 step1 后,Jenkins 的 Home 目录下会产生一个 output 文件夹,该文件夹用来存放 step5 中的 xcarchive 文件和 step6 导出 ipa 包等附带文件。
-
实质上,真正实现自动打包的命令就是两步:step5 和 step6,一个是打包项目的命令,一个是读取plist文件中的发布证书和配置证书从打包的文件中导入 ipa 包。你也可以不借助 Jenkins,自建脚本完成自动打包工作, Jenkins 提供的更多的是便捷的项目管理功能,丰富的插件。
-
step6 中的
ADHOC_PLIST_PATH
的 adhoc.plist 文件你可以通过第一次手动完成项目配置,打包后得到,又或者你可以直接自己编写/改写该文件,将其放到对应的目录下即可,笔者是将其放到了和每个项目的工作目录下。
-
step7 和 step8 都是辅助命令,一个是接入三方平台,将包进行分发,一个是将提测信息告知到相关测试人员,从而进行测试。除了接入钉钉,你也可以发送邮件等方式告知相关测试人员。
事实上,发布到分发平台,通知到测试人员都是可以通过相关的插件完成的,但是,我觉得采用脚本的方式更灵活。如果你有兴趣,可以自己尝试一下。
- 构建项目
回到 任务主页 选择-> 立即构建,或者通过之前配置的触发器进行构建。
构建过程中或多或少都会发生错误,对照着错误提示进行修改,基本都可以完成自动打包。
导出多种类型的 ipa 包
通过上述 step5 和 step6 之后,你可能发现了,导出不同类型的包依靠 adhoc.plist 文件,因此我们通过修改该文件的字段信息即可导入不同类型的包。
修改文件的方式也多种多样,你可以通过脚本完成相应的修改操作,你甚至可以做一个简单的应用,可进行简单的配置选择后,修改 adhoc.plist 文件,再进行版本构建,这样你就可以完成一系列的自动打包工作。
总结
Jenkins 是一种重复任务管理平台,我们可以用来进行项目的持续打包测试任务。在完成 Jenkins 环境配置之后,我们就可以开始为自己的项目进行相关的配置。Jenkins 不限制源码的来源,在进行触发器触发任务后,Jenkins 会将你的源码下载到本地进行管理。在本文中,我们构建版本是通过 shell 脚本完成的,包括项目的打包、导入ipa、上传到三方平台、发送测试消息等,理解 shell 是本文的重点之一。