iOS 中Jenkins+fastlane自动化打包上传到蒲公英或者fir,成功后邮件通知

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

Java8的JDK下载

下载完成后直接安装就行

配置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/

Jenkins下载

可能下载速度会特别的慢,下载完成后,解压打开文件放到个人目录/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会停掉

第一次运行的时候会出现以下界面


Jenkins初始化

然后在终端输入

open /Users/你的本地的路径名/.jenkins/secrets/initialAdminPassword

复制里面的秘钥然后输入进入下一步

Jenkins选择插件

选择左边推荐的安装插件


Jenkins插件安装

然后耐心等待插件安装完成

安装成功后,进入创建管理员账号界面,填入信息后,后续就可以用此账号进行登录了。


创建账号

创建成功后,进入实例配置页面,我们先保持默认配置,后续可以进行更换。

Jenkins配置

点击保持后,即可完成安装导向,如下图。


Jenkins配置

点击开始使用Jenkins,即可进入Jenkins首页(仪表盘)


Jenkins配置

开始使用Jenkins

  1. 点击 新建任务

    Jenkins使用

  2. 输入项目名,然后选择第一项,点击确定按钮


    Jenkins使用
  3. 设置源码获取方式git方式


    Jenkins使用

添加Git仓库地址,可以是HTTPS也可以是SSH,输入地址后,发现没有权限


git配置

需要配置Git权限,点击下面的Credentials添加证书
(1)如果是HTTPS方式


HTTPS

(2)如果是SSH方式


SSH

配置好之后

项目配置

(3)设置获取代码更新的轮询方式 每隔5分钟一次,有更新时自动获取。点击?号可以查看相关帮助信息


Jenkins项目配置

然后点击保存回到Jenkins的首页开始构建项目,目的是先获取代码

构建项目

构建完成后在工作空间就可以看到拉取到的代码了
项目构建

Jenkins进一步配置配合fastlane自动化打包

首先需要在项目中创建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


配置shell1

然后输入shell脚本语言


配置shell2

其中cd到项目的目录这个项目是Jenkins所在的工作空间的位置


项目的工作空间

配置好之后回到Jenkins的首页然后Build Now来立即构建项目,接下来就等待项目构建完成,然后自动上传到蒲公英平台。

Jenkins根据分支来拉取代码,并且自动化选择构建debug还是release等

首先需要安装相应的插件


Jenkins插件

然后搜索Git Parameter去安装插件

Jenkins插件

安装完成后,在项目的配置中可以发现一个Git Parameter选项

项目分支

分支设置
然后设置动态的分支

保存后回到Jenkins的首页构建项目时会发现出现可以选中分支进行打包


分支设置

动态选择打包上传到蒲公英或者fir平台

添加参数中选中Choice Parameter

动态选择发布平台1

然后配置如下


动态选择发布平台2

然后在打包的shell的脚本就可以改写为


动态选择发布平台3

接下来在Jenkins首页立即构建项目中发现可以选中不同的平台了


动态选择发布平台4

上传成功后可以通过Jenkins直接跳转到蒲公英或者fir平台

首先去安装插件description setter,然后在项目配置中可以选择如下

直接跳转发布平台1

然后去蒲公英或者fir平台找到发布成功后的二维码地址,然后填写如下
直接跳转发布平台2

同时需要配置Jenkins支持html,设置如下


支持html

支持html

这样在构建项目成功后就会出现可以直接点击下载的地址


直接跳转发布平台

设置发布成功后邮件通知用户

首先安装插件Email Extension Plugin
安装完成后去配置

邮件通知1

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:默认接收人列表,已逗号进行分割

邮件通知2

点击高级后出现进一步的配置,勾选Use SMTP Authentication,然后填写你发送邮件的邮箱账号和密码,这个SMTP port是126邮箱是25,每个邮箱不一样,qq就是其他的了。
邮件通知3

选择邮件发送触发为Always

邮件通知4

保存后,接下来在项目的配置中构建后操作中选中增加构建后操作步骤中选中如下

邮件通知5

然后填写好自己发送的邮箱
邮件通知6

Disable Extended Email Publisher:勾选后,邮件就不发送,看自己的情况喽,如果你想调试某些东西,又不想发邮件出去就可以勾选这个。
Project Recipient List:收件人地址;多个收件人邮件地址用逗号进行分割;想使用全局默认配置的话,可以使用DEFAULT_RECIPIENTS。 `Project Reply-To List:`允许回复人的地址;想使用系统设置中的默认值的话,可以使用DEFAULT_REPLYTO;
Content Type:邮件文档的类型,可以设置HTML等格式;
Default Subject:默认主题,也就是邮件标题;同理可以使用$DEFAULT_SUBJECT
Default Content:默认邮件内容
Attach Build Log:发送的邮件是否包含日志;

进一步配置


邮件通知7

然后配置发送邮件的条件

邮件通知8

选择Always
邮件通知9

这样保存后,然后构建项目,在项目构建成功后就会自动发送邮件通知用户。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354

推荐阅读更多精彩内容