iOS Jenkins fastlane Bugly自动打包上传firm appstore

总体步骤

  • 1.安装整体环境(cocoapods、fastlane、jenkins)

  • 2.配置jenkins

  • 3.配置证书

  • 4.编写fastfile

安装cocoapos 和fastlane

1.安装cocoapods
2.安装fastlane
3.在项目文件执行fastlane安装 然后一步一步选择
4 .安装bugly上传DYSM action
fastlane add_plugin upload_dsym_to_bugly
5.安装firm上传action
fastlane add_plugin fir_cli

cd [your_project_folder]

fastlane init

fastlane deliver init (firm 插件 https://github.com/FIRHQ/fastlane-plugin-fir_cli)

上传App Store时有二次验证会导致上传失败这时候需要执行以下步骤
1.  在appleid.apple.com/account/manage上生成一个application specific password。
2.配置环境变量  vim ~/.bash_profile 
export FASTLANE_APPLE_APPLICATION_SPECIFIC_PASSWORD=YOUR_PSD
3.执行 fastlane spaceauth -u abcd@qq.com 按提示获取session信息。
复制session信息(很长一大段) 配置环境变量vim ~/.bash_profile 
export FASTLANE_SESSION='YOUR SESSION'

Fastlane

查看版本

java -version

需要安装至少java1.8也不能太高

Error: Cask 'java8' is unavailable: No Cask with this name exists.

解决

$ brew tap caskroom/versions

不是需要的版本就安装需要的版本,一般错误下面都有命令
还有可能安装了java1.8但是本地有几个版本,删掉其它的或者改变.bashProfile配置就可以了
java文件/Library/Java/JavaVirtualMachines

安装jenkins稳定版

$ brew install jenkins-lts
$ java -jar /usr/local/Cellar/jenkins/2.49/libexec/jenkins.war --httpPort=8080

2.49是jenkins版本号,8080是未被占用的端口号(占用可以用其它的比如9090)
$ jenkins -v 查看版本

执行

 $ jenkins-lts

有时候会突然莫名奇妙的被拒绝访问,重新执行映射端口号命名就可以了
然后浏览器打开http://localhost:8080就会出现配置jenkins(最好不用safari打开)

http://localhost:8080/exit //退出Jenkins
http://localhost:8080/restart //重启
http://localhost:8080/reload //重新加载

jenkins配置

前面都是按照步骤走,等插件下载好设置好用户名密码就可以

1.设置管理员权限

Manage Jenkins -> Configure Global Security -> 选中安全矩阵 -> 点击 add user or group按钮 -> 输入自己用户名 -> 勾选Administer -> 保存

2.安装插件
1、Xcode integration

2、GIT plugin

3、GitLab Plugin

4、Gitlab Hook Plugin

5、Keychains and Provisioning Profiles Management

6、Git Parameter(选择Git版本和分支)

3.配置Keychains and Provisioning Profiles Management
1.获取login.keychain(位置:/Users/用户名/Library/Keychains,login.keychain-db拷贝改名为login.keychain)
2.上传login.keychain
截屏2021-01-13 下午5.45.39.png

截屏2021-01-13 下午5.46.43.png
添加code signing identity(就是开发和发布证书的常用名称)
截屏2021-01-13 下午5.54.29.png
截屏2021-01-13 下午5.50.47.png
4.新建项目(可以根据自己需要选择)
截屏2021-01-13 下午5.59.48.png
5.配置项目
截屏2021-01-13 下午6.04.11.png
截屏2021-01-13 下午6.04.24.png
上面这些环境是在项目中定义的
Test             测试
PreRelease       预发布
Release          发布
Debug            开发
截屏2021-01-13 下午6.04.42.png
截屏2021-01-13 下午6.05.00.png
截屏2021-01-13 下午6.05.11.png
截屏2021-01-13 下午6.14.26.png
#!/bin/bash -l 
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
export LC_ALL=en_US.UTF-8

cd xny-app-ios 

pod install --verbose --no-repo-update 

changelog="${mbranch}-${export_method}-${configuration}"

if [ ${export_method} == "app-store" ];
then
    echo "***********====== appstore =====***************"
    fastlane upToAppStore
else
    echo "***********====== other =====***************"
    fastlane upfirm configuration:$configuration export_method:$export_method changelog:$changelog
fi    

6.管理证书fastlane match

https://docs.fastlane.tools/actions/match/#match
总体来说就是需要在自己的gitlab上面创建一个存储证书和描述文件的仓库,cd到项目中中执行 fastlane match init接着输入仓库地址,fastlane会在项目的fastlane文件夹下创建Matchfile文件
配置如下

#仓库地址
git_url("")

storage_mode("git")

type("development") # The default type, can be: appstore, adhoc, enterprise or development

 app_identifier([""])
 username("") # Your Apple Developer Portal username

# For all available options run `fastlane match --help`
# Remove the # in the beginning of the line to enable the other options

# The docs are available on https://docs.fastlane.tools/actions/match

然后执行 
fastlane match development
fastlane match adhoc
fastlane match appstore
match 会分别配置不同环境的证书和描述文件并上传到我们指定的仓库
在其它电脑上只需要 执行fastlane match development --readonly 就可以配置相应环境的证书和描述文件,不需要新建证书和描述文件,但是xcode就不要使用automatically manage signing 使用手动配置,选择相应的描述文件就可以了
在实际配置中发现有个问题:需要清空电脑的钥匙串中安装的证书和~/资源库/MobileDevice/Provisioning Profiles下的描述文件然后再执行fastlane match development --readonly
fastfile文件
#使用方法 cd到项目.xcworkspace目录 终端输入 fastlane automaticPackagingUpload

# 定义fastlane版本号
fastlane_version "2.171.0"

# 定义打包平台
default_platform :ios

#指定项目的scheme名称
scheme = ""
bundle_id = ""
#firm api_key和user_key
firm_token  = ""

#bugly
buglyAppkey = ""
buglyAppId = ""

#打包输出路径
output_directory = "/Users/{customerName}/Desktop/fastlaneBuild/xny/"

output_name = "#{scheme}_#{get_build_number()}"
#apple账号id
username = ""
#apple开发组名(如Xiaomianju Network Technology(Shanghai) Co., Ltd.)
team_name = ""


def updateProjectBuildNumber

build = Time.new.strftime("%Y%m%d.%H%M")
# => 更改项目 build 号
increment_build_number(
build_number: "#{build}"
)
end


#"上传Firm"
platform :ios do

lane :upfirm do|options|

branch = options[:branch]
configuration = options[:configuration]
puts “*************| configuration:#{configuration} |*************”
export_method = options[:export_method]
puts “*************| export_method:#{export_method} |*************”

changelog = options[:changelog]

#cocoapods

updateProjectBuildNumber #更改项目build号

match(type: "development",force_for_new_devices:true,readonly:true)

gym(
#输出的ipa名称
output_name:"#{output_name}",
#指定项目的scheme
scheme:"#{scheme}",
# 是否清空以前的编译信息 true:是
clean:true,
# 指定打包方式,Release 或者 Debug
configuration:configuration,
# 指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development
export_method: "#{export_method}",
# 指定输出文件夹
output_directory:"#{output_directory}#{configuration}",
)

puts “*************| 开始上传firm |*************”

fir_cli api_token:firm_token,changelog:changelog

puts “*************| 上传firm成功 |*************”

end

#"上传APPStore"

lane :upToAppStore do|options|

branch = options[:branch]

#cocoapods

updateProjectBuildNumber #更改项目build号

match(type: "appstore",readonly:true)

gym(
#输出的ipa名称
output_name:"#{output_name}",
#指定项目的scheme
scheme:"#{scheme}",
# 是否清空以前的编译信息 true:是
clean:true,
# 指定打包方式,Release 或者 Debug
configuration:"Release",
# 指定打包所使用的输出方式,目前支持app-store, package, ad-hoc, enterprise, development
export_method:"app-store",
# 指定输出文件夹
output_directory:"#{output_directory}appstore",
)

puts “*************| 上传DYSM到Bugly |*************”

output_dysm_name = "#{output_name}.app.dSYM.zip"

upload_dsym_to_bugly(
      file_path: "#{output_directory}appstore/#{output_dysm_name}",
      file_name: "#{output_dysm_name}",
      app_key: "#{buglyAppkey}",
      app_id: "#{buglyAppId}",
      api_version: 1,
      symbol_type: 2, # iOS => 2, Android => 1
      bundle_id: "#{bundle_id}",
      product_version: get_version_number
    )
puts “*************| 上传DYSM到Bugly成功 |*************”

puts “*************| 开始上传APPStore |*************”
deliver(
    username:"#{username}",
    team_name:"#{team_name}",
    skip_metadata: true,
    skip_screenshots: true,
    force: true,
)

puts “*************| 上传APPStore成功 |*************”

end

end

参考资料

pipleLine
http://mmorejon.github.io/en/blog/build-pipeline-jenkins2-as-code-with-ios10-xcode8/
中文文档

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