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 [email protected] 按提示获取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/
中文文档

你可能感兴趣的:(iOS Jenkins fastlane Bugly自动打包上传firm appstore)