fastlane安装
可以参考我的的文章
iOS使用fastlane实现自动化打包
Jenkins的安装
因为Jenkins是用Java语言编写的,所以需要java的支持,建议使用1.8版本的JDK
查看当前安装的Java版本
java -version
如果机器没有安装1.8版本的建议下载安装http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
下载完成后直接安装就行
配置Java环境
open -t ~/.bash_profile
添加Java配置文件
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home
export PATH=$JAVA_HOME/bin:$PATH
这个/Library/Java/JavaVirtualMachines/jdk1.8.0_191.jdk/Contents/Home
是我的电脑本地的Java位置,根据的你的情况配置好自己的本地Java位置的路径
我采用的是Jenkins的war的方式进行安装
下载Jenkins的war包
https://jenkins.io/zh/download/
可能下载速度会特别的慢,下载完成后,解压打开文件放到个人目录
/Users/yourname/Jenkins
同时配置Jenkins的环境
open -t ~/.bash_profile
添加一行
export JENKINS_HOME=/Users/hf/Jenkins
这个/Users/hf/Jenkins
是我电脑本地的路径
然后在终端输入
source ~/.bash_profile
使得设置生效
cd 到Jenkins存放的目录
终端之执行命令
java -jar jenkins.war --httpPort=8080
看到 以下信息说明安装完成
Jenkins is fully up and running
初始化jenkins
浏览器默认访问http://localhost:8080/, 可进入jenkins配置页面。 不要关闭终端否则jenkins会停掉
第一次运行的时候会出现以下界面
然后在终端输入
open /Users/你的本地的路径名/.jenkins/secrets/initialAdminPassword
复制里面的秘钥然后输入进入下一步
选择左边推荐的安装插件
然后耐心等待插件安装完成
安装成功后,进入创建管理员账号界面,填入信息后,后续就可以用此账号进行登录了。
创建成功后,进入实例配置页面,我们先保持默认配置,后续可以进行更换。
点击保持后,即可完成安装导向,如下图。
点击开始使用Jenkins,即可进入Jenkins首页(仪表盘)
开始使用Jenkins
-
点击 新建任务
-
输入项目名,然后选择第一项,点击确定按钮
-
设置源码获取方式git方式
添加Git仓库地址,可以是HTTPS也可以是SSH,输入地址后,发现没有权限
需要配置Git权限,点击下面的Credentials添加证书
(1)如果是HTTPS方式
(2)如果是SSH方式
配置好之后
(3)设置获取代码更新的轮询方式 每隔5分钟一次,有更新时自动获取。点击?号可以查看相关帮助信息
然后点击保存回到Jenkins的首页开始构建项目,目的是先获取代码
构建完成后在工作空间就可以看到拉取到的代码了
Jenkins进一步配置配合fastlane自动化打包
首先需要在项目中创建fastlane的基本配置,根据我上面给的fastlane的自动化打包,在配置好后
这边我已经配置好的一套fastlane代码如下
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
# https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
# https://docs.fastlane.tools/plugins/available-plugins
#
# Uncomment the line if you want fastlane to automatically update itself
################## READ FIRST ##################
######## 使用方法1 自定义version和build #########
###### fastlane iosDebug_pgy version:1.0.1 build:1 ######
######## 使用方法2 不写version和build 这时build会根据之前的build+1 #########
###### fastlane iosDebug_pgy ######
###如果需要上传到蒲公英,请运行前先安装插件安装蒲公英的fastlane add_plugin pgyer ###
default_platform(:ios) # 设置默认的平台为iOS
############# 需要根据项目自定义设置 ############
APP_NAME = "APP_NAME" #输出包时app的名字
APP_SCHEME = "APP_SCHEME" #这个app打开manage schemes下选中的名称
APP_IPA_OUTPUT_DIRECTORY = "build/packages" # 打包所保存的文件目录,可以不设置
# 配置蒲公英的apiKey 和 userKey 需要设置
APP_PGYER_API_KEY = ""
APP_PGYER_USER_KEY = ""
# 配置fir的token
APP_FIR_API_TOKEN = ""
######## 不用设置的 #####################
APP_XCODEPROJ = "#{APP_NAME}.xcodeproj" # app的xcodeproj
APP_WORKSPACE = "#{APP_NAME}.xcworkspace" # app的xcworkspace
APP_IPA_TIME = Time.now.strftime("%Y-%m-%d_%H:%M") # 打包的时间
# APP_INFO_PLIST_PATH = './HFMyTest/HFMyTest-Info.plist'
APP_ENV_PREFIX = "" # 打包完成后的包文件名字的前缀 区别release和debug
# 版本 build number++
def prepare_version(options)
#增加version版本号
if options[:version]
increment_version_number(
version_number: options[:version],
xcodeproj: "#{APP_XCODEPROJ}",
)
else
# 可以不设置
end
#增加build号 只能是整数和浮点数
if options[:build]
increment_build_number(
build_number: options[:build],
xcodeproj: "#{APP_XCODEPROJ}",
)
else
last_build = get_build_number(xcodeproj: "#{APP_XCODEPROJ}")
now_build = last_build.to_i + 1
increment_build_number(
build_number: now_build,
xcodeproj: "#{APP_XCODEPROJ}",
)
end
end
#统一的打包方法
def generate_ipa(exportMethod,configuration,options)
# 设置version和build
prepare_version(options)
app_version = get_version_number(target: "#{APP_SCHEME}") # 得到最新的version
app_build = get_build_number(xcodeproj: "#{APP_XCODEPROJ}") # 最新的build
# app包名
app_ipa_name = "#{APP_NAME}_" "#{APP_ENV_PREFIX}_" + "#{APP_IPA_TIME}_" + "#{app_version}_" + "#{app_build}"
#打包
gym(
clean: true, # 打包前clean项目
silent: true, # 隐藏没有必要的信息
scheme: "#{APP_SCHEME}",
workspace: "#{APP_WORKSPACE}",
configuration: "#{configuration}", # 环境
export_method: "#{exportMethod}", # app-store、ad-hoc、development、enterprise
output_directory: "#{APP_IPA_OUTPUT_DIRECTORY}", #ipa的存放目录
output_name: "#{app_ipa_name}", # 输出ipa的文件名
# 生成的ipa文件是否包含symbols,这个文件是内存标记文件,用来定位错误信息的,有了这个安装包大小会变大
include_symbols: true,
# 生成的ipa文件是否包含bitcode,在本身项目中也可以配置
include_bitcode: false,
# keychain授权 Xcode9不允许访问钥匙串密码,所以我们需要手动开权限
export_xcargs: "-allowProvisioningUpdates"
)
end
platform :iOS do
# before_all就是先于所有lane执行的任务
before_all do
# 根据安装路径指定要使用的Xcode
xcode_select "/Applications/Xcode.app"
# 超时失败,默认的timeout是10秒
ENV["FASTLANE_XCODEBUILD_SETTINGS_TIMEOUT"] = "120"
end
# lane 自定义的任务
#debug包 上传到蒲公英平台
#option类似一个字典 option[:version] 取其中value值version
lane :iosDebug_pgy do |options|
APP_ENV_PREFIX = "debug_"
generate_ipa("development","Debug",options)
#上传至蒲公英 在这之前请安装插件 fastlane add_plugin pgyer
if APP_PGYER_API_KEY.length > 0 && APP_PGYER_USER_KEY.length > 0
pgyer(
api_key: "#{APP_PGYER_API_KEY}",
user_key: "#{APP_PGYER_USER_KEY}",
)
notification(title: "发布成功!", message: "已成功上传到蒲公英平台, 赶快联系测试人员开始测试吧!", open: "https://www.pgyer.com/")
end
end
#debug包 上传到fir
lane :iosDebug_fir do |options|
APP_ENV_PREFIX = "debug_"
generate_ipa("development","Debug",options)
#上传至fir 在这之前请安装插件 fastlane add_plugin firim
if APP_FIR_API_TOKEN.length > 0
firim(
firim_api_token: "#{APP_FIR_API_TOKEN}",
)
notification(title: "发布成功!", message: "已成功上传到fir平台, 赶快联系测试人员开始测试吧!", open: "https://fir.im/apps")
end
end
# release发布包
lane :iosRelease do |options|
APP_ENV_PREFIX = "appstore_"
generate_ipa("app-store","Release",options)
# 上传至app-store
deliver(
force: true, #是否跳过HTML验证报告,默认false
skip_metadata: true, #是否跳过上传metadata,默认false
skip_screenshots: true #是否跳过上传屏幕截图,默认false
)
end
# testFlight包
lane :iosTestFlight do |options|
APP_ENV_PREFIX = "adhoc_"
generate_ipa("ad-hoc","Release",options)
# 管理TestFlight的测试用户,上传二进制文件
pilot
end
# 当lane执行完成之后进行哪些操作
after_all do |lane|
#发送一个桌面通知
#notification(title: "execute success", subtitle: "执行成功!", message: "lane已经执行成功了")
end
error do |lane, exception|
puts("#{exception.message}")
notification(title: "执行#{lane}发生异常!", message: "发生异常, 详情请查看控制台!")
end
end
因为代码要上传到蒲公英和fir平台,所以需要在相应的平台申请获取到相应的key
接下来在Jenkins中配置shell脚本来自动执行fastlane
然后输入shell脚本语言
其中cd到项目的目录这个项目是Jenkins所在的工作空间的位置
配置好之后回到Jenkins的首页然后Build Now
来立即构建项目,接下来就等待项目构建完成,然后自动上传到蒲公英平台。
Jenkins根据分支来拉取代码,并且自动化选择构建debug还是release等
首先需要安装相应的插件
然后搜索Git Parameter
去安装插件
安装完成后,在项目的配置中可以发现一个Git Parameter
选项
保存后回到Jenkins的首页构建项目时会发现出现可以选中分支进行打包
动态选择打包上传到蒲公英或者fir平台
添加参数中选中Choice Parameter
然后配置如下
然后在打包的shell的脚本就可以改写为
接下来在Jenkins首页立即构建项目中发现可以选中不同的平台了
上传成功后可以通过Jenkins直接跳转到蒲公英或者fir平台
首先去安装插件description setter
,然后在项目配置中可以选择如下
然后去蒲公英或者fir平台找到发布成功后的二维码地址,然后填写如下
同时需要配置Jenkins支持html,设置如下
这样在构建项目成功后就会出现可以直接点击下载的地址
设置发布成功后邮件通知用户
首先安装插件Email Extension Plugin
安装完成后去配置
SMTP服务器:
下面的
smtp.126.com
是我选择了126邮箱,如果你选择qq邮箱的话就是
smtp.qq.com
,注意qq的SMTP服务器的默认是没有开启,需要的话自行查阅资料怎么开启,126是默认开启的
Default user E-mail suffix:
根据自己情况填写
勾选
Use SMTP Authentication
,用户名和密码填写自己的
SMTP port:
默认25
Default Content Type:
邮件文档类型
Default Recipients:
默认接收人列表,已逗号进行分割
点击高级后出现进一步的配置,勾选
Use SMTP Authentication
,然后填写你发送邮件的邮箱账号和密码,这个
SMTP port
是126邮箱是25,每个邮箱不一样,qq就是其他的了。
选择邮件发送触发为Always
保存后,接下来在项目的配置中构建后操作中选中增加构建后操作步骤
中选中如下
然后填写好自己发送的邮箱
Disable Extended Email Publisher:
勾选后,邮件就不发送,看自己的情况喽,如果你想调试某些东西,又不想发邮件出去就可以勾选这个。
Project Recipient List
:收件人地址;多个收件人邮件地址用逗号进行分割;想使用全局默认配置的话,可以使用DEFAULT_REPLYTO;
Content Type:
邮件文档的类型,可以设置HTML等格式;
Default Subject:
默认主题,也就是邮件标题;同理可以使用$DEFAULT_SUBJECT
Default Content:
默认邮件内容
Attach Build Log:
发送的邮件是否包含日志;
进一步配置
然后配置发送邮件的条件
选择
Always
这样保存后,然后构建项目,在项目构建成功后就会自动发送邮件通知用户。