总体步骤
-
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
添加code signing identity(就是开发和发布证书的常用名称)
4.新建项目(可以根据自己需要选择)
5.配置项目
上面这些环境是在项目中定义的
Test 测试
PreRelease 预发布
Release 发布
Debug 开发
#!/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/
中文文档