iOS 自動打包shell腳本
功能
- git 拉取代碼
- CocoaPods 更新
- 根據配置,選擇證書、修改版本號、構建版本號、修改項目環境配置
- 自動打包
- 導出
ipa
文件,并重新命名ipa
包 - 利用
FTP
上傳ipa
文件到服務器上
所需要了解的知識點
- shell腳本語言
- Git
- CocoaPod
- xcodebuild
- PlistBuddy
- FTP
shell 腳本語言
需要掌握的知識點:
變量
傳遞參數
流程控制
文件包含
-
Linux 命令
- 當前路徑獲取
- 文件是否存在
- 新建文件夾
- 修改文件名稱
- sed 命令
- 刪除文件/文件夾
Git
-
拉取代碼(這里采取的是 http)
git clone -b 分支名 項目代碼地址
CocoaPods
這里不做描述
xcodebuild
可以查看 自動打包 xcodebuild
PlistBuddy
可以查看 PlistBuddy
FTP
FTP
是一個用于計算機網絡上在客戶端和服務器之間進行文件傳輸的應用層協議。
在這里需要利用 FTP
命令在服務器創建文件夾和上傳文件
創建目錄文件
# 創建目錄
ftp -n<<!
open $host
user $user_name $pass_word
binary
hash
# 創建文件夾
mkdir $path
close
bye
!
- host : 服務器地址
- user_name : 賬號
- pass_word : 密碼
- path : 所需要創建的文件路徑,需要注意的是,這里不能多級創建目錄,只能在已有的目錄下進行創建,不能多級創建
上傳
curl -u $user_name:$pass_word -T $ipa_path $ftp_path/
- user_name : 賬號
- paas_word : 密碼
- ipa_path : ipa 文件路徑
- ftp_path : 需要上傳到的服務器路徑
Mac 安裝 ftp 命令
若提示 ftp
命令找不到,則需要安裝 ftp
命令,因為在新的 Mac
系統中已經去掉了自帶的 telnet
命令和 ftp
命令,所以需要安裝 ftp
命令。
在終端中依次執行以下命令:
brew install telnet
brew install inetutils
brew link --overwrite inetutils
如果沒有安裝 Homebrew
,則安裝 Homebrew
Homebrew官網
將以下命令粘貼到終端安裝 Homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
思路
- 在腳本文件所在的目錄下,創建一個
IPADir
目錄,然后再根據項目名稱創建一個文件夾,再根據打包的時間作為文件夾名創建一個文件夾出來 - 利用
Git
將最新的代碼clone
下來,更新CocoaPods
- 根據配置的環境變量、版本號、構建版本號依次修改項目環境(開發環境/測試環境/上架)、修改
info.plist
文件的版本號和構建版本號、修改證書和描述文件 - 打包
- 導出
ipa
文件 - 按照規格修改
ipa
文件名 - 利用
ftp
上傳ipa
文件到服務器上
實現shell腳本自動打包
-
創建一個
autoArchiveConfiguration.sh
用于每次打包參數變量配置-
project_name
: 工程名字 (若有多個項目,可以根據工程名字創建對應的文件夾,存放ipa
文件和clone
代碼) -
version
: 版本號 -
build_version
: 構建版本號 -
archive_model
: 打包環境(主要區分打包測試,還是上傳到App Store) -
loginLine
: 打包環境(主要是域名的切換)
以上就是需要配置的變量,然后腳本文件會根據這些變量,自動打包成對應項目的
ipa
文件 -
-
創建
codeSignProvisiongProfile.sh
文件,顧名思義是用來配置項目證書和描述文件的,如果只有一個項目,則可以不創建這個文件,這里主要是因為多個項目,區分開來-
test_code_sign_identity
: 打包測試證書 -
test_provisioning_profile
: 打包測試描述文件UUID
-
test_development_team
: 打包測試developmentTeam
-
test_provisioning_profile_specifier
: 打包測試描述文件名稱 -
dis_code_sign_identity
: 生產證書 -
dis_provisioning_profile
: 生產環境描述文件UUID
-
dis_development_team
: 生產環境development Team
-
dis_provisioning_profile_specifier
: 生產環境描述文件名稱 -
branch_name
: 項目所處的分支名稱
在這測試證書,使用的是
Ad Hoc
證書,接下主要說下code_sign_identity
、provisioning_profile_specifier
如何配置-
code_sign_identity
的配置鑰匙串 → 我的證書 → 打開項目對應的證書
image直接復制所圈出的那塊區域
provisioning_profile_specifier
則是在下載描述文件時,給描述文件所名稱,比如**_AdHoc.mobileprovision
,所需要的是**_AdHoc
至于 描述文件
UUID
的獲取,在 xcodebuild 中有講解,如何去獲取到一個描述文件的UUID
,這里就不做詳細的描述了 -
創建
uploadFile.sh
文件,通過這個腳本文件,實現將ipa
文件上傳到服務器上去創建
autoArchive.sh
文件,通過這個腳本文件,包含以上三個文件,進行腳本運行,然后實現自動打包和上傳
在這里著重描述一下,如何去修改 info.plist
、project.pbxproj
第一種方式: sed -i -r 修改 info.plist
、 project.pbxproj
文件
我們可以通過 sed -i -r
的命令方式對內容進行修改,-i
代表著修改文件內容,-r
代表著可以通過正則表達式去配置到我們需要修改的內容,格式為:
sed -i -r "s/需要配置的正則表達式/需要替換的內容/g" 文件路徑
舉個例子,在這里,需要修改 Appdelegate.m
中的環境配置變量
# [ 需要轉義,$ 在正則表達式里面是代表尾部,而在 shell 中表示取值,所以也需要轉義
sed -i -r "s/\[GYHSLoginManager shareInstance\].loginLine.*\$/[GYHSLoginManager shareInstance].loginLine = $loginLine;/g" $appdelegate_path;
我們可以通過這個方式,對我們所需要修改的變量進行修改,但是每次執行完成后,都會在所在的文件夾中會自動生成對應的 -r
文件,這個文件我們不需要,所以要進行刪除操作
# 刪除 AppDelegate-r 文件
rm -rf $appdelegate_path-r
第二種方式:PlistBuddy 修改 info.plist
、 project.pbxproj
文件
其實 project.pbxproj
文件,也是一種plist
文件,所以我們完全可以使用 PlistBuddy
來修改
比如我們需要修改版本號
# 修改版本號
/usr/libexec/PlistBuddy -c "set CFBundleShortVersionString 版本號" info.plist的路徑
修改打包證書,也就是修改 project.pbxproj
文件的內容.
我們先打開 project.pbxproj
文件,然后搜索 CODE_SIGN_IDENTITY
,如果搜索不到,在工程配置中將證書配置取消自動配置,并且進行一次手動配置證書和描述文件操作,然后再重新搜索 CODE_SIGN_IDENTITY
。就會發現 CODE_SIGN_IDENTITY
是 buildSettings
的元素,而 buildSettings
又是另外一個很長的字符串的元素,在這里我的是 8A91212723A33A290030DB0E
, 而8A91212723A33A290030DB0E
又是objects
的一個元素,這是 Debug
模式下的后去,還有Release
,也是同樣的方式去獲取.
接下來,修改這個元素
/usr/libexec/PlistBuddy -c "set :objects:8A91212723A33A290030DB0E:buildSettings:CODE_SIGN_IDENTITY iPhone Distribution" project.pbxproj的路徑
這樣就修改完成了,我們需要修改工程中的 CODE_SIGN_IDENTITY
、CODE_SIGN_IDENTITY[sdk=iphoneos*]
、DEVELOPMENT_TEAM
、PROVISIONING_PROFILE_SPECIFIER
,別忘了 Debug
和 Release
環境下都需要修改
通過以上兩種方式,都可以對內容進行修改,只不過 PlistBuddy
只能修改 plist
類型的文件。
以上就是關于自動打包的一些介紹
最后附上代碼:
自動打包代碼