The easiest way to build and release mobile apps.
Fastlane是一套使用Ruby寫的自動化工具集,用於iOS和Android的自動化打包、發佈等工做,能夠節省大量的時間。 android
Github開源地址 fastlane官網)ios
iOS一鍵腳本完成如下步驟: 1 reset_git_repo 移除git中未提交的內容 2 git pull 只拉取最新tag 3 checkout 切換到最新的tag 4 submodule update 更新子模塊 5 Pod install 第三方庫管理工具 6 Archive、Sign 打包、簽名 7 upload fir 上傳Fir 8 notification 釘釘機器人git
Android 能夠實現一鍵多渠道打包: 1 reset_git_repo 移除git中未提交的內容 2 git pull 只拉取最新tag 3 checkout 切換到最新的tag 4 submodule update 更新子模塊 5 gradle 打包 6 add_channels_to_apk 拷貝apk,修改文件名爲渠道名,渠道名寫入META-INFO目錄 參考連接:Fastlane實戰(三):Fastlane在Android平臺的應用github
sudo gem install fastlane
fastlane init
fastlane lane_name
# 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
# update_fastlane
fastlane_version "2.96.1"
default_platform(:ios)
platform :ios do
desc "Push a new beta build to fir"
lane :tofir do
# Deletes the Xcode Derived Data
clear_derived_data
# discarding uncommitted changes
reset_git_repo(
force: true,
skip_clean: true,
disregard_gitignore: false
)
# git pull only the tags, no commits
git_pull(only_tags: true)
# get recent tag
recentTagName = last_git_tag
# (fastlane-plugin-git_switch_branch爲插件)check out tag
git_switch_branch(branch: recentTagName)
# submodule init and update
git_submodule_update(
init: true,
recursive: true
)
# pod install
cocoapods
scheme = "ProCloser"
ipa_dir = "./fastlane_build/"+Time.new.strftime('%Y-%m-%d')
ipa_name = recentTagName + "_" + Time.new.strftime('%Y%m%d%H%M')
# gym用來編譯 打包 簽名
gym(
output_directory: ipa_dir,
output_name: "#{ipa_name}.ipa",
clean: true,
workspace: scheme + ".xcworkspace",
scheme: scheme,
export_xcargs: "-allowProvisioningUpdates",
export_options: {
method: "ad-hoc", # 指定打包方式
teamID: "xxxxxxxxxxx",
thinning: "<none>",
}
)
# (fastlane-plugin-firim爲插件)上傳ipa到fir.im服務器,在fir.im獲取firim_api_token
firim(firim_api_token: "xxxxxxxxxxxxxxx")
desc "Notification 釘釘機器人"
# 釘釘機器人
app_patch = ipa_dir + "/#{ipa_name}.ipa"
app_version = get_ipa_info_plist_value(ipa: app_patch, key: "CFBundleShortVersionString")
app_build_version = get_ipa_info_plist_value(ipa: app_patch, key: "CFBundleVersion")
app_name = get_ipa_info_plist_value(ipa: app_patch, key: "CFBundleDisplayName")
app_url = "xxxxxxxx"
app_icon = "xxxxxxx"
dingTalk_url = "xxxxxxxxx"
dingMessage =
{
msgtype: "link",
link: {
text: "對應git tag爲: #{recentTagName}",
title: "iOS #{app_name} #{app_version} (#{app_build_version}) 測試版本",
picUrl: "#{app_icon}",
messageUrl: "#{app_url}"
}
}
uri = URI.parse(dingTalk_url)
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
request = Net::HTTP::Post.new(uri.request_uri)
request.add_field('Content-Type', 'application/json')
request.body = dingMessage.to_json
response = https.request(request)
puts "--------------- 釘釘機器人已經通知 ✅ ---------------"
puts "Response #{response.code} #{response.message}: #{response.body}"
end
end
複製代碼
客戶端:shell
# 遠程到打包機,運行打包機中的shell腳本。在打包機中配置了ssh信任因此不須要輸入密碼
ssh tiejin@tiejinios.local '/Users/tiejin/closerToFir.sh'
複製代碼
服務器:json
# 解鎖mac中的keychain,fastlane打包命令中的證書籤名須要用到keychain中記錄的帳戶和密碼。
security unlock-keychain -p 2018 $KEYCHAIN
# 進入指定目錄
cd closer
# 設置環境變量,不然fastlane中涉及到/usr/local/bin/命令部分找不到
export PATH=/usr/local/bin/:$PATH
# 執行fastlane
fastlane tofir
複製代碼
和 Jenkins 結合一塊兒使用api
自定義Actions 0 什麼是Action Action 是Fastlane中的最小執行單元,Action中封裝了一些shell命令。數組
1 建立自定義Action ,會自動生成xxx.rb文件 fastlane new_action
ruby
2 編輯 xxx.rb 文件,修改具體邏輯。bash
module Fastlane
module Actions
module SharedValues
REMOVE_TAG_CUSTOM_VALUE = :REMOVE_TAG_CUSTOM_VALUE
end
class RemoveTagAction < Action
def self.run(params)
# 最終要執行的東西,在這裏執行
# 一、獲取全部輸入的參數
# tag 的名稱 如 0.1.0
tageName = params[:tag]
# 是否須要刪除本地標籤
isRemoveLocationTag = params[:isRL]
# 是否須要刪除遠程標籤
isRemoveRemoteTag = params[:isRR]
# 二、定義一個數組,準備往數組裏面添加相應的命令
cmds = []
# 刪除本地的標籤
# git tag -d 標籤名稱
if isRemoveLocationTag
cmds << "git tag -d #{tageName}"
end
# 刪除遠程標籤
# git push origin :標籤名稱
if isRemoveRemoteTag
cmds << "git push origin :#{tageName}"
end
# 三、執行數組裏面的全部的命令
result = Actions.sh(cmds.join('&'))
UI.message("執行完畢 remove_tag的操做 🚀")
return result
end
#####################################################
# @!group Documentation
#####################################################
def self.description
"輸入標籤,刪除標籤"
end
def self.details
# Optional:
# this is your chance to provide a more detailed description of this action
"咱們可使用這個標籤來刪除git遠程的標籤\n 使用方式是:\n remove_tag(tag:tagName,isRL:true,isRR:true) \n或者 \nremove_tag(tag:tagName)"
end
# 接收相關的參數
def self.available_options
# Define all options your action supports.
# Below a few examples
[
# 傳入tag值的參數描述,不能夠忽略<必須輸入>,字符串類型,沒有默認值
FastlaneCore::ConfigItem.new(key: :tag,
description: "tag 號是多少",
optional:false,# 是否是能夠省略
is_string: true, # true: 是否是字符串
),
# 是否刪除本地標籤
FastlaneCore::ConfigItem.new(key: :isRL,
description: "是否刪除本地標籤",
optional:true,# 是否是能夠省略
is_string: false, # true: 是否是字符串
default_value: true), # 默認值是啥
# 是否刪除遠程標籤
FastlaneCore::ConfigItem.new(key: :isRR,
description: "是否刪除遠程標籤",
optional:true,# 是否是能夠省略
is_string: false, # true: 是否是字符串
default_value: true) # 默認值是啥
]
end
def self.output
# Define the shared values you are going to provide
# Example
end
def self.return_value
# If your method provides a return value, you can describe here what it does
nil
end
def self.authors
# So no one will ever forget your contribution to fastlane :) You are awesome btw!
["zhangyan"]
end
# 支持平臺
def self.is_supported?(platform)
# you can do things like
#
# true
#
# platform == :ios
#
# [:ios, :mac].include?(platform)
#
platform == :ios
end
end
end
end
複製代碼
Gemfile 和 Bundle 是什麼: Gemfile文件:gem包管理工具,如:管理fastlane、cocoapods Appfile文件:從 Apple Developer Portal 獲取和項目相關的信息 Fastlane文件:核心文件,主要用於 cli 調用和處理具體的流程 Deliverfile:從 iTunes Connect 獲取和項目相關的信息
Action:對於Fastlane來講Action的收錄是很是嚴格,而且有很強的通用性才能收錄其中,即便接收了,整個發佈週期也會比較長,並且之後不管是升級仍是Bug修復,都依賴Fastlane自己的發版,大大下降了靈活性。
Plugin: Plugin就是在Action的基礎上作了一層包裝,這個包裝巧妙的利用了RubyGems這個至關成熟的Ruby庫管理系統,因此其能夠獨立於Fastlane主倉庫進行查找,安裝,發佈和刪除。
咱們甚至能夠簡單的認爲:Plugin就是RubyGem封裝的Action,咱們能夠像管理RubyGems同樣來管理Fastlane的Plugin。
fastlane search_plugins [query]
或 查看全部Plugin安裝 fastlane add_plugin [plugin_xxx]
安裝完成後 會在fastlane文件夾下生成Pluginfile文件實際就是一個Gemfile文件,裏面包含了對於Plugin的引用,格式以下:
# Autogenerated by fastlane
#
# Ensure this file is checked in to source control!
# fastlane-plugin-version_from_last_tag 是插件名字
gem 'fastlane-plugin-version_from_last_tag'
複製代碼
使用 和Action使用同樣。
2 能夠到Github / GitLab上 或者 引用本地路徑。
gem "fastlane-plugin-version_from_last_tag", git: "https://github.com/jeeftor/fastlane-plugin-version_from_last_tag"
複製代碼
發佈以前,爲了本地調試方便,能夠將gem指向本地,在Pluginfile這樣聲明:
gem "fastlane-plugin-version_from_last_tag", path: "../fastlane-plugin-version_from_last_tag"
複製代碼
fastlane action appium
2 Android Monkey 下面咱們看看Android通常運行Monkey測試的步驟:
Git Pull拉最新的代碼 執行./gradlew clean命令清理環境 執行./gradlew assembleTest打包測試版本 執行命令安裝最新的測試版本: adb shell monkey -p com.wanmeizhensuo.zhensuo -c android.intent.category.LAUNCHER 1
每次調用命令: fastlane do_monkey_test times:3 project:GengmeiAndroid apk_path:./GengmeiAndroid_test.apk ...
Fastlane文件配置以下:
desc "Android monkey test"
lane :do_monkey_test do |options|
times = options[:times]
project = options[:project]
apk_path = options[:apk_path]
package_name = options[:package_name]
hipchat(message: "Start monkey test on #{project}")
git_pull
gradle(task: "clean")
gradle(task: "assembleGmtest")
(1..times.to_i).each do |i|
adb(command: "install -r #{apk_path}")
adb(command: "shell monkey -p #{package_name} -c android.intent.category.LAUNCHER 1")
# 等待30秒,確保閃屏頁被Finish後,進入到主頁.
sleep(30)
android_monkey(package_name: "#{package_name}", count: '1000', seed: "#{10+i}")
end
hipchat(message: "Execute monkey test on project #{project} successfully")
end
複製代碼
自定義的Action android_monkey 封裝了 Android Monkey adb
更多Actions和Plugins查閱官網 Actions - fastlane docs Plugins - fastlane docs
before_all do |lane, options|
#git_pull
#cocoapods
end
複製代碼
after_all do |lane,options|
slack(message: "fastlane was successful", success: true)
end
複製代碼
error do |lane, exception|
slack(message: exception.message, success: false)
end
複製代碼
引用機制 遠程引用 import_from_git
import_from_git - fastlane docs每次執行fastlane的命令時,首先會從git上將須要的文件clone這個項目到本地的臨時文件夾中,而後再執行相關命令。若是某個項目中,你不想使用遠端上的某個lane,可在項目中的Fastfile中複寫這個lane便可。
更多高級用法查看文檔 Advanced - fastlane docs
0. Fastlane - iOS 和 Android 自動化構建工具 Fastlane實戰(一):移動開發自動化之道 - 簡書 Fastlane實戰(二):Action和Plugin機制 - 簡書 Fastlane實戰(三):Android平臺上的應用 - 簡書
fastlane install
命令在bundle update 卡住,gem ruby 源有問題,這裏建議添加國內源。
ruby鏡像 https://gems.ruby-china.org
https://ruby.taobao.org/
替換命令:
$ gem sources --add https://gems.ruby-china.org/ --remove https://rubygems.org/
$ gem sources -l
*** CURRENT SOURCES ***
https://gems.ruby-china.org
# 請確保只有 gems.ruby-china.org
$ gem install rails
複製代碼