Jenkins介绍

Jenkins是一个开源软件项目,是基于java开发的一种持续集成工具,用于监控持续重复的工作(比如代码打包、提测),旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。

Jenkins功能包括:

1、持续的软件版本发布/测试项目

2、监控外部调用执行的工作

自动化流程

  1. 版本迭代完毕,已提交git服务器

  2. 执行jenkins构建操作,执行脚本完成签名、打包、上传分发平台等操作

  3. 上传三方平台后,向钉钉工作群发送测试通知消息

  4. 测试下载安装测试包完成测试工作

Jenkins服务器环境配置

step1 安装 jdk 环境

  1. 到 Oracle 官网下载 jdk.dmg 安装包(xxx.dmg为mac环境下的包)

  2. 打开 jdk.dmg,一键完成 jdk 的安装及环境变量的配置

  3. 在终端输入java、javac命令,显示相关命令说明即表示 jdk 安装配置成功

step2 安装 jenkins 环境

  1. jenkins 官网下载 jenkins.pkg 安装包

  2. 打开 jenkins.pkg 一键完成服务器的搭建

  3. 进入配置页面,根据提示,输入管理员密码,进入 jenkins 管理平台

解锁jenkins

打开相应的日志文件,找到管理员密码:
获取管理员密码

  1. 选择安装推荐的插件

安装插件

  1. 创建第一个管理员用户

创建管理员用户
6. 实例配置

实例配置

  1. 完成 Jenkins 安装

完成安装

补充:安装可选插件

可以在系统管理 - 管理插件 - 可选插件 中搜索相应的插件并安装。

插件可以帮助我们完成一些额外工作,例如 Xcode integration 帮我们执行 Xcode命令 打包 ipa 包,Email Extension Plugin 帮我们发送邮件 等等,更多内容可以查阅可选插件中列表信息。

Jenkins使用

Jenkins欢迎页面

首页功能模块

首页

系统管理功能模块

系统管理

创建第一个任务

  1. 新建项目
    创建任务

  2. 代码源管理

这里可以填写该项目等描述信息、设置构建版本的管理策略等。
代码源管理

  1. 设置源码

本文是以一个 Git 项目来掩饰自动化打包的,因此这里选择代码源为 Git ,填写好相应的仓库地址,设置相应的账号信息等。
设置源码
添加 Credentials , Kind 有多种选择,这里选用了 ssh 的验证方式。
添加Credentials
ssh私钥的创建方式,可以查阅:如何生成SSH key

  1. 触发器

触发器用来触发项目的版本构建任务。

Jenkins 有多种的触发方式,这里采用远程触发构建任务,身份验证令牌即 TOKEN_NAME 字段,你可以访问 JENKINS_URL/job/TestProject/build?token=TOKEN_NAME 或者 /buildWithParameters?token=TOKEN_NAME 来触发构建任务。

触发器

你也可以不使用触发器,点击 立即构建 进行手动构建版本。

手动构建

  1. 构建版本(shell脚本)

首先说明的是,Jenkins 的工作目录在共享系统的共享文件下。

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 包等附带文件。

output文件夹

  • 实质上,真正实现自动打包的命令就是两步:step5 和 step6,一个是打包项目的命令,一个是读取plist文件中的发布证书和配置证书从打包的文件中导入 ipa 包。你也可以不借助 Jenkins,自建脚本完成自动打包工作, Jenkins 提供的更多的是便捷的项目管理功能,丰富的插件。

  • step6 中的 ADHOC_PLIST_PATH 的 adhoc.plist 文件你可以通过第一次手动完成项目配置,打包后得到,又或者你可以直接自己编写/改写该文件,将其放到对应的目录下即可,笔者是将其放到了和每个项目的工作目录下。
    adhoc.plist

  • step7 和 step8 都是辅助命令,一个是接入三方平台,将包进行分发,一个是将提测信息告知到相关测试人员,从而进行测试。除了接入钉钉,你也可以发送邮件等方式告知相关测试人员。

事实上,发布到分发平台,通知到测试人员都是可以通过相关的插件完成的,但是,我觉得采用脚本的方式更灵活。如果你有兴趣,可以自己尝试一下。

  1. 构建项目

回到 任务主页 选择-> 立即构建,或者通过之前配置的触发器进行构建。

构建过程中或多或少都会发生错误,对照着错误提示进行修改,基本都可以完成自动打包。

导出多种类型的 ipa 包

通过上述 step5 和 step6 之后,你可能发现了,导出不同类型的包依靠 adhoc.plist 文件,因此我们通过修改该文件的字段信息即可导入不同类型的包。
adhoc.plist
修改文件的方式也多种多样,你可以通过脚本完成相应的修改操作,你甚至可以做一个简单的应用,可进行简单的配置选择后,修改 adhoc.plist 文件,再进行版本构建,这样你就可以完成一系列的自动打包工作。

总结

Jenkins 是一种重复任务管理平台,我们可以用来进行项目的持续打包测试任务。在完成 Jenkins 环境配置之后,我们就可以开始为自己的项目进行相关的配置。Jenkins 不限制源码的来源,在进行触发器触发任务后,Jenkins 会将你的源码下载到本地进行管理。在本文中,我们构建版本是通过 shell 脚本完成的,包括项目的打包、导入ipa、上传到三方平台、发送测试消息等,理解 shell 是本文的重点之一。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐