iOS 元件化開發(四):fastlane實現pod自動化

LinXunFeng發表於2018-04-06

iOS 元件化開發(四):fastlane實現pod自動化

在第一次元件化的時候,需要執行很多操作,這些操作可以在【iOS 元件化開發(一):遠端私有庫的基本使用】,這裡就不再贅述,在元件化後的重複性操作就是升級,而升級這個過程是一模一樣的。那麼,我們有什麼辦法可以很方便的搞定這一過程來節約我們大量的時間呢?

一、升級必備操作

修改完核心程式碼後,一共還需要做以下幾步:
1、修改spec檔案(修改s.version,s.description等)
2、pod install (使Example與pod下來的庫產生關聯)
3、提交本地倉庫程式碼至遠端倉庫
4、打標籤,並提交至遠端
5、驗證spec,並提至私有索引庫

二、Fastlane

1、簡介

Fastlane文件說明 Fastlane是一個ruby指令碼集合,它可以按照我們指定的路線,在指定位置執行我們所要執行的操作。這裡我們稱這樣的路線為「航道(lane)」,這樣的操作稱為「Action」

Action是Fastlane自動化流程中的最小執行單元,用來執行Fastlane指令碼中的命令,關於更多的描述可以到Actions - fastlane docs檢視,裡面也介紹了常用的action有哪些,順帶附上action的原始碼地址,這個原始碼在後面自定義起參考作用

2、 安裝

  • 確保ruby為最新版本
brew update
brew install ruby
複製程式碼
  • 安裝fastlane
sudo gem install -n /usr/local/bin fastlane
複製程式碼
  • 檢視當前fastlane版本
fastlane --version
複製程式碼
  • 檢視所有action
fastlane actions
複製程式碼

三、fastlane初始化

cd到你的本地元件倉庫的根目錄

  • 初始化fastlane fastlane init 不過這個步驟對我們來說可以跳過,在init後提示你輸入一些東西,包括上傳需要用到的APPLE ID什麼的一堆東西,由於我們並不涉及這些,所以我們使用更方便的方式
# 建立一個fastlane資料夾
# 進入fastlane目錄
# 建立一個Fastfile檔案
mkdir fastlane
cd fastlane
touch Fastfile
複製程式碼

目錄結構

1、修改Fastfile

desc '描述航道作用'
lane :航道名稱 do |options|

// options 可以用來傳遞引數
// 示例:varName = options[:name]

// 航道上需要執行的操作

end
複製程式碼

航道上要掃描的操作可以到Actions上查詢,可以通過關鍵字搜尋,如下圖

cocoapods
點進去可以看到具體的使用及引數說明

使用說明

這裡附上本人的Fastfile內容:

desc 'LXFUpdatePodTool 航道用來自動化升級維護私有庫'
lane : LXFUpdatePodTool do |options|

tagNum = options[:tag]
podspecName = options[:specName]

# 航道上需要執行的操作
# 具體action到 https://docs.fastlane.tools/actions 上面查詢
# 這裡的路徑以倉庫根目錄為準

# 1、修改spec檔案(修改s.version,s.description等)
# 2、pod install (使Example與pod下來的庫產生關聯)
cocoapods(
  clean: true,
  podfile: "./Example/Podfile"
)


# 3、提交本地倉庫程式碼至遠端倉庫
git_add(path: ".")
git_commit(path: ".", message: "upgrade repo")
push_to_git_remote


# 4、打標籤,並提交至遠端
add_git_tag(
  tag: tagNum
)
push_git_tags


# 5、驗證spec,並提至私有索引庫
pod_lib_lint(allow_warnings: true)
# 因為本地索引庫repo的名字是基本上不會去改變的,所以這裡直接寫死 LXFSpecs
# podspec的名字需要由外界傳入
pod_push(path: "#{podspecName}.podspec", repo: "LXFSpecs")


end
複製程式碼

2、驗證Fastfile

fastlane lanes
複製程式碼

Fastfile驗證成功

3、執行fastlane

需要在元件倉庫的根目錄下執行

根目錄

fastlane LXFUpdatePodTool tag:0.1.1 specName:LXFMain
複製程式碼

開始執行

上傳完成

整個執行過程不超過30秒~

四、自定義Action

以上的過程已經可以完成一整個自動化更新了,但是有一點需要注意的是,這個輸入的tag可能會面臨一個問題,那就是本地和遠端都可能已經存在,即發生衝突,這個時候我們可以選擇自動刪除本地和遠端衝突的那個tag,再重新上傳當前tag

1、建立一個新的action

fastlane new_action
複製程式碼

按要求輸入Action名稱

輸入action名稱

完成後fastlane目錄下就會多出一個名為actions的資料夾,裡面存放的就是你自定義action

iOS 元件化開發(四):fastlane實現pod自動化

2、編輯自定義action

開啟remove_git_tag.rb,開始自定義我們的action吧,什麼?不會語法怎麼辦?可以參考別人的嘛,上面給出的action的原始碼地址就有用武之地了,比如pod_push。這裡我直接貼出我已經完成的主要程式碼

# 可以使用 fastlane action remove_git_tag 來參看詳細描述

def self.run(params)
  # 這裡寫要執行的操作 
  # params[:引數名稱] 引數名稱與下面self.available_options中的保持一致
  tagNum = params[:tagNum]
  rmLocalTag = params[:rmLocalTag]
  rmRemoteTag = params[:rmRemoteTag]

  command = []
  if rmLocalTag
    # 刪除本地標籤
    # git tag -d 標籤名稱
    command << "git tag -d #{tagNum}"
  end
  if rmRemoteTag
    # 刪除遠端標籤
    # git push origin :標籤名稱
    command << "git push origin :#{tagNum}"
  end

  result = Actions.sh(command.join('&'))
  UI.success("Successfully remove tag ? ")
  return result

end

def self.description
  # 對當前指令碼的簡單描述
  "刪除tag"
end

def self.details
  # 對當前指令碼的具體描述
  "使用當前action來刪除本地和遠端衝突的tag"
end

def self.available_options
  # 用來傳遞引數
  [ 
    FastlaneCore::ConfigItem.new(key: :tagNum,
                                  description: "輸入即將刪除的tag",
                                  is_string: true),
    FastlaneCore::ConfigItem.new(key: :rmLocalTag,
                                  description: "是否刪除本地tag",
                                  optional:true,
                                  is_string: false,
                                  default_value: true),
    FastlaneCore::ConfigItem.new(key: :rmRemoteTag,
                                  description: "是否刪除遠端tag",
                                  optional:true,
                                  is_string: false,
                                  default_value: true)
  ]
end

def self.authors
  # 作者姓名
  ["LinXunFeng"]
end
複製程式碼

3、檢視action描述

同樣,這裡先cd到元件庫的根目錄下執行,原因是這個自定義action只存在當前根目錄下的fastlane中,其它fastlane的非自定義的action就不用在當前根目錄下操作~

fastlane action remove_git_tag
複製程式碼

檢視具體描述

4、測試執行

先來看看當前元件庫已存在的tag

git tag
複製程式碼

已存在的tag

可以看到,我是已經有一個0.1.1版本的了。這時我們再來執行一次LXFUpdatePodTool航道

fastlane LXFUpdatePodTool tag:0.1.1 specName:LXFMain
複製程式碼

自動清除

五、工具拿走

LXFUpdatePodTool 已經傳到我的GitHub上,需要的同學就拿走吧,順手給個Star咯 Orz

相關文章