iOS使用Jenkins自动打包+上传到 fir+钉钉通知
摘要
本文介绍的 iOS 自动打包功能使用
Jenkins
的操作页面,配置 Shell 脚本,调用
Fastlane
提供的打包命令,将打包生成的 .ipa 文件上传到
fir
平台,生成安装包的二维码,然后将打包的自定义信息和二维码链接发送到钉钉群组中(
钉钉开放文档
)。用户接到通知后即可扫码安装 App。
整个流程需要安装 Java 软件、jenkins.war、fastlane、fir 插件,然后配置 Jenkins。在文中将逐一介绍。
安装 Java 软件
使用 Jenkins 首先需要使用 java 安装 jenkins.war 文件,Java 的安装包版本需要在 jdk11.0~jdk17.0之间。
在终端中输入
java -version
可查看当前的 java 版本。若版本在jdk11.0~jdk17.0之间,则无需再安装 Java 软件。否则,需要先卸载旧 Java 版本。卸载旧 Java 版本方法,可在终端中粘贴以下命令:
sudo rm -fr ~/Library/Internet\ Plug-Ins/JavaAppletPlugin.plugin
sudo rm -fr ~/Library/PreferencesPanes/JavaControlPanel.prefPane
sudo rm -fr ~/Library/Application\ Support/Oracle/Java
sudo rm -rf ~/Library/Java/JavaVirtualMachines/*
Mac 安装 Java 软件分为 x86 版本和 arm 版本。在 Mac-关于本机-概览-处理器
中,若处理器为 Intel 版本,则安装 x86 版本,否则安装 arm 版本。可在 Oracle 官网下载:jdk17-mac 。
也可以从百度云盘中下载:
x86 版本 jdk17-mac
arm 版本 jdk17-mac
双击安装包,按提示安装即可。
安装 Jenkins
Jenkins 可以使用 jenkins.war 安装,也可以使用 homebrew 安装:
使用 jenkins.war 安装
在官网下载: jenkins.war 。 也可以在 Github 仓库 JenkinsAutoArchive 里下载 jenkins.war。
使用 homebrew 安装
Mac 若未安装 HomeBrew ,需先 安装 HomeBrew, 然后执行命令:
brew install jenkins‐lts
启动 jenkins 服务
使用 Jenkins 打包,首先要启动 Jenkins 服务。启动服务有两种方式:
使用 jenkins.war 的方式
使用终端定位在 jenkins.war 所在的目录下,然后执行命令: java -jar jenkins.war
// 使用默认端口 8080。或者执行命令: java -jar jenkins.war --httpPort=8888
//指定端口 8888
通过上面的命令,即可启动 Jenkins 服务,Jenkins 使用期间,不要终止此服务。终止了的话,可以重新使用该命令启动服务。
使用 homebrew 的方式
使用终端执行命令:brew services start jenkins-lts
即可。
brew services 还有其他支持的命令:
重启jenkins: brew services restart jenkins-lts
更新jenkins版本: brew upgrade jenkins-lts
停止jenkins: brew services stop jenkins-lts
安装 Fastlane
首先确保已经安装了 Xcode 或者 Xcode命令行工具:xcode-select --install
安装 fastlane 可使用两种方式:
使用 ruby 安装
ruby 的版本最好 >= 3.0.0 。使用 ruby -v
可以查看 ruby 的版本。在终端中输入命令:sudo gem install fastlane
即可安装 fastlane。
使用 homebrew 安装
可在终端中输入命令:brew install fastlane
。
安装完成后,使用终端定位到 iOS 项目的目录下, 例如: cd ~/projectName/
。然后输入命令:fastlane init
。此命令会在项目目录下生成一个 fastlane 文件夹,文件夹内的 Fastfile 文件用于打包配置。
安装 fir 插件
安装完 fastlane 后,就可以安装 fir 插件了。在终端中输入命令: fastlane add_plugin fir_cli
即可。
初始化 Jenkins
Jenkins 服务启动后,在浏览器页面输入以下地址:
http://localhost:8080
//端口指定的多少写多少
第一次运行会出现如下界面,提示需要填写指定路径文件里面的内容(该内容也可以在终端上面看到)。
类型选择:SSH Usename with private key
范围:全局(Jenkin, nodes, items, all child items, etc)
userName:git中的名字
PrivateKey:ssh中的私钥,使用 open ~/.ssh/id_rsa
命令打开文件,全选并复制粘贴到此处。
Passphrase:git密码。
添加获取提交日志的插件
打包日志中为了获取代码提交记录,可以通过第三方插件来获取,先下载 changelog-environment.hpi 文件。然后在 系统管理-插件管理-高级 页面:
点击“选择文件”,选择刚下载的 changelog-environment.hpi 文件,然后点击 “Deploy” 上传插件。
在👇🏻下面的 构建环境 处即可勾选上插件使用了。
在 Jenkins 首页,点击创建任务,页面如下:
勾选上“Add timestamps to the Console Output”
勾选上“Add Changelog Information to Environment”,这是 changelog-environment.hpi 插件提供的获取提交日志的功能。然后在 Entry Format 中输入 - %3$s (%4$s %1$s)\n
,在 Date Format 中输入yyyy-MM-dd HH:mm:ss
。
配置 Build steps
输入自定义的打包脚本
# 当前仓库的分支名
currentBranch="$(git rev-parse --abbrev-ref HEAD)"
echo "currentBranch=$currentBranch, lastName=$lastName"
# 如果要打包的分支和当前分支不一致,则暂存当前分支的改动内容,然后切换分支到要打包的分支
if [ "$currentBranch" != "$lastName" ]; then
time=$(date "+%Y-%m-%d %H:%M:%S")
git stash -u -m "$BRANCH_NAME $time"
git checkout $lastName
git pull
pod install
# 更新插件。fir_cli 插件不及时更新的话,可能会导致无法上传应用文件。
# sudo 是以管理员身份执行命令,在<< EOF与EOF之间输入你的开机密码
sudo -S bundle exec fastlane update_plugins << EOF
# 安装 fir 插件。sudo 是以管理员身份执行命令,在<< EOF与EOF之间输入你的开机密码
sudo -S fastlane add_plugin fir_cli << EOF
echo "fastlane Project_Debug: BRANCH_NAME = $GIT_BRANCH, jobName = $JOB_NAME"
# SCM_CHANGELOG 是插件 changelog-environment.hpi 提供的获取提交日志的环境变量
bundle exec fastlane project_Release branchName:$GIT_BRANCH jobName:$JOB_NAME changeLog:"$SCM_CHANGELOG"
执行脚本中的 pod install
命令,需要先配置一下 Jenkins 的环境变量,否则会报错。配置环境变量步骤:
在 系统管理-系统配置-全局属性 中勾选上环境变量。
在终端中输入 echo $PATH
,终端会打印出一串字符串,几个路径,复制该路径,返回到Jenkins中。
键默认填写 PATH
,值填写从终端复制的那个字符串,点击保存,完成,构建该项目。
配置 fastlane 打包脚本
脚本中的 bundle exec fastlane Project_Debug branchName:$GIT_BRANCH jobName:$JOB_NAME changeLog:"$SCM_CHANGELOG"
命令,其中 Project_Debug 是在工程项目目录下的 fastlane/Fastfile 文件中自定义的打包方法。
GIT_BRANCH 、JOB_NAME 是 Jenkins 提供的环境变量,分别代表分支名和 Jenkins 任务名。SCM_CHANGELOG 是插件changelog-environment.hpi 提供的获取提交日志的环境变量。
配置 邮件通知
邮件通知可不配置,如需配置,可参考 Jenkins 踩坑(三)| Email 配置与任务邮件发送
fastlane 打包脚本介绍
fastlane actions
fastlane 支持许多 action,在终端输入命令:fastlane actions
或者在 官网 actions 查看。
简单介绍几个 action:
get_version_number : 获取工程的版本号
get_build_number : 获取工程的 build 号
increment_build_number : 自动增加 build 号
gym : iOS app打包签名自动化工具
fir_cli : fir 插件的 action,可以使用 fir 的功能,上传 ipa 文件,支持扫码安装
fastlane action gym
iOS 打包使用 fastlane action 中的 gym 命令,在终端输入命令:fastlane action gym
或者在 官网 gym 查看。如下:
根据 钉钉开放文档 的介绍,自定义机器人支持文本 (text)、链接 (link)、markdown(markdown)、ActionCard、FeedCard消息类型。
以 Fastfile 中的 Project_Debug 为例,lane 配置如下:
default_platform(:ios)
platform :ios do
desc "iOS 自动打包"
lane :Project_Debug do |options|
scheme_name = "Project"
# 输出文件放在工程目录下的 debug 文件夹下,没有 debug 文件夹的话,需要手动创建一下。
output_directory = "./debug/"
#increment_build_number
#version = get_version_number(xcodeproj: "Project.xcodeproj", target: "#{scheme_name}")
buildNumber = get_build_number
output_name = "#{scheme_name}_#{buildNumber}_#{Time.now.strftime('%Y%m%d%H%M%S')}.ipa"
gym(scheme: scheme_name,
workspace: "Project.xcworkspace",
include_bitcode: false,
configuration: "Debug",
include_symbols: true,
export_method: "development",
output_directory: output_directory,
build_path: output_directory,
archive_path: output_directory,
output_name: output_name)
branchName = options[:branchName]
jobName = options[:jobName]
changeLog = options[:changeLog]
answer = fir_cli api_token:"xxxxxxxxxxx", need_release_id: true
puts "上传后的结果:#{answer}"
# fir 安装包链接需要手动拼接一下。hey.appc01.com 可能会改变,如果无法使用,则需要根据 fir 的实际链接修改。
download_url = "https://hey.appc01.com/#{answer[:short]}?release_id=#{answer[:release_id]}"
dingdingMsg = "打包结果通知:Jenkins 打包成功。Debug 开发包。\n branchName:#{branchName}\n jobName:#{jobName}\n 下载二维码链接:#{download_url} \n 修改日志:#{changeLog} \n"
puts "打包结束时,输出文案:#{dingdingMsg}"
#fir_cli api_token:"xxxxxx", dingtalk_at_all: true, #dingtalk_access_token:"xxxxxxx", #dingtalk_custom_message: dingdingMsg
dingTalk_url = "https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx"
# 构造消息格式
text = {
"at": {
"isAtAll": true
"text": {
"content": "#{dingdingMsg}"
"msgtype": "text"
puts "发送的钉钉消息:#{text} "
uri = URI.parse(dingTalk_url)
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri)
request.add_field('Content-Type', 'application/json')
request.body = text.to_json
response = https.request(request)
puts "------------------------------"
puts "Response #{response.code} #{response.message}: #{response.body}"
jenkens构建前执行 pod install
傻瓜式-iOS自动化分发部署-持续化集成方案【Fastlane+蒲公英+Jenkins】
iOS 持续集成与持续分发(jenkins+fastlane+pgyer)
Jenkins+fastlane打包出现找不到对应scheme的问题(fastlane 配置的 scheme 没有生效的解决方案)
iOS fastlane 配合蒲公英打包, 并进行钉钉群组通知
jenkins使用Changelog获取commit记录
jenkins检查更新站点时出错:SSLHandshakeException:sun.security.validator.ValidatorException:PKIX路径构建失败:sun.secu
Jenkins 踩坑(三)| Email 配置与任务邮件发送
如何在 Mac 上卸载 Java?
mac 安装HomeBrew
shell脚本中填写密码