㈠ iOS一鍵自動編譯打包提交
在開始之前先嘮叨兩句自己對iOS自動化打包的接觸,覺得沒啥看頭滴老鐵可以略過直接從第二部分開始。項目自動打包提交的優勢不用說了,很高效便捷的東西,很早就接觸到了,但是一直沒有用到項目中,分析一下主要有以下幾個原因:
總結以上原因,一直沒有用到自動打包技術。而現在的情況是,
基於以上的情況,所以想自己寫一個自動打包的腳本,能夠實現 只運行一句命令就自動編譯打包發布 ,啥都不要做,掛著就行,打包完自動打開頁面提醒。
打包所需要的文件已經掛在 Github 上了。只需要把 BuildTool 文件夾 復制 到 項目主目錄 ,注意是復制!不是拖入項目主目錄,因為蘋果審核有屏蔽fir關鍵詞。然後打開終端, cd 到 BuildTool 文件夾,輸入 sh build.sh 命令,回車,開始執行此打包腳本。
具體的使用方法和參數配置 shell腳本 裡面已經有非常詳細的注釋。
有 AppStoreExportOptions.plist 和 AdHocExportOptions.plist 兩個plist文件,分別對應發布到AppStore和AdHoc(蒲公英、fir)。簡單說一下裡面的屬性:
寫完腳本後,發現已經有老鐵對打包腳本做了很詳細的分析了: 詳解Shell腳本實現iOS自動化編譯打包提交 。也有老鐵早就寫了iOS自動打包的腳本: xcode_shell 。
看了一下,功能也比較全,比如上傳包到自己的伺服器、上傳完成發郵件測試人員。但是現在已經有第三方平台也做到了比這更多的功能,比如蒲公英,還可以手機簡訊通知測試人員,有專門的頁面外鏈,支持持續集成等。
老鐵們如果還有什麼建議,歡迎在下面給我留言或私信。🤗 🤗 🤗
問題一(更新於2018年11月14日):
升級 Xcode 10 以上版本,蘋果採用新的構建系統,之前的 xcodebuild clean 命令已經無法使用,如果用這個命令的話會報錯,蘋果給的建議是刪除根目錄下的 build 目錄文件夾,刪除就可以完整打包了。但是每次打包都需要再刪除一遍,由於這個目錄的主要作用就是存儲 該項目的歷史構建包(Archive歸檔文件和iPA包) ,所以解決辦法是:
參考資料: build_system_release_notes_for_xcode_10
㈡ 使用mac進行ios幾種命令行打包方式
自動打包的方式有如下幾種:
一、使用xcodebuild進行打包
參考apple文檔:https://developer.apple.com/library/prerelease/mac/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html
xcodebuild -project "${TARGET}.xcodeproj" -target ${TARGET} CODE_SIGN_IDENTITY="${IDENTITY}" clean //將project clean下
xcodebuild -workspace MyWorkspace.xcworkspace -scheme MyScheme archive //進行archive,生成xcarchive文件
xcodebuild -exportArchive -exportFormat IPA -archivePath MyMobileApp.xcarchive -exportPath MyMobileApp.ipa -exportProvisioningProfile 'MyMobileApp Distribution Profile'
確實是可以生成.ipa,但是可能會導致不能安裝,https://developer.apple.com/library/prerelease/mac/documentation/Darwin/Reference/ManPages/man1/xcodebuild.1.html , 鏈接是apple的官方文檔,文檔大概的意思將 xcarchive文件作為.ipa方式進行導出, 為什麼不能在ios設備上安裝?
二、原生xcodebuild、xcrun進行打包,需要詳細了解,可以看下這個鏈接 http://www.jianshu.com/p/1229476fbce4
具體打包指令和第一種方法區別不大,不同代碼如下:
xcodebuild -scheme Zxh -configuration ${buildConfiguration} clean //對代碼進行clean
xcodebuild -project Zxh.xcodeproj -scheme Zxh -configuration ${buildConfiguration} -destination generic/platform=ios archive -archivePath ${buildPath} //進行build,相當於在xcode裡面進行command+b,生成.app文件
#xcrun -sdk iphoneos PackageApplication -v build/Release-iphoneos/Zxh.app -o ${ipaName}.ipa --sign "iPhone Distribution:(打包證書)" //根據.app文件生成的ipa文件導出到指定目錄
三、xctool進行自動打包
參考網頁地址:http://www.tuicool.com/articles/uIZRZjy
1、確保安裝了xctool
沒有安裝xctool,可以用brew安裝,沒有安裝brew的,可以通過搜索安裝brew,然後執行如下操作安裝xctool
安裝命令:sudo brew install xctool
介紹下xctool命令:
xctool 是FaceBook開源的一個命令行工具,用來替代蘋果的xcodebuild工具。
先附上打包用的參考代碼,如下:
#
cd AutoProject //進入項目目錄
#
buildDay=$(date +%Y%m%d) //獲取當前日期
buildTime=$(date +%Y%m%d%H%M) //獲取當前時間
profile=」xxxx」 //設置打包配置文件
#
buildConfiguration=」QA」 //build時用的證書
buildPath=」../ArchiveProction/QA/${buildDay}/Auto_QA_${buildTime}.xcarchive」 //build後歸檔的文件目錄
ipaName=」../ipa/QA/${buildDay}/Auto_QA_${buildTime}.ipa」 //打好包放置位置
#
xctool -scheme AutoProject -configuration ${buildConfiguration} clean //clean下工程
xctool -scheme AutoProject -configuration ${buildConfiguration} archive -archivePath ${buildPath} //對項目進行Archive, 將xcarchive文件導出到指定目錄
xcodebuild -exportArchive -exportFormat IPA -archivePath ${buildPath} -exportPath ${ipaName} - exportProvisioningProfile 「$profile」 //生成的ipa文件導出到指定目錄, 此處依然使用的是xcodebuild進行打包, 待優化
㈢ iOS 命令行打包
cd workspace_path
xcodebuild clean
(1).如果是沒有用到 Cocoapods的工程這樣在命令行操作(沒有.xcworkspace的工程)
xcodebuild
(2).用到 Cocoapods的工程這樣在命令行操作(有.xcworkspace的工程)
xcodebuild -workspace /Users/djnet/Desktop/text/text.xcworkspace -scheme text
echo "在項目工程文件內生成一個build子目錄,裡面有${project_name}.App程序"
xcrun -sdk iphoneos PackageApplication -v $app_name_path -o $ipa_name_path
㈣ iOS遠程自動打包問題
遇到的問題是這樣:有一台通用的構建伺服器,自動打包腳本已經寫好,本地測試通過,需要在這台構建伺服器上通過Jenkins調用這個自動打包腳本,完成持續化集成的工作。但是在構建過程中報了如下錯誤:
/usr/bin/codesign --force --sign --entitlements /Users/wsbg/Library/Developer/Xcode/DerivedData/WesaiPoker-doyqrrerzicjnzekyyrdbzcmjhju/Build/Intermediates/ArchiveIntermediates/WesaiPoker/IntermediateBuildFilesPath/WesaiPoker.build/Release-iphoneos/WesaiPoker.build/WesaiPoker.app.xcent --timestamp=none /Users/wsbg/Library/Developer/Xcode/DerivedData/WesaiPoker-doyqrrerzicjnzekyyrdbzcmjhju/Build/Intermediates/ArchiveIntermediates/WesaiPoker//Applications/WesaiPoker.app/Users/wsbg/Library/Developer/Xcode/DerivedData/WesaiPoker-doyqrrerzicjnzekyyrdbzcmjhju/Build/Intermediates/ArchiveIntermediates/WesaiPoker//Applications/WesaiPoker.app: unknown error -1=ffffffffffffffffCommand /usr/bin/codesign failed with exit code 1 ** ARCHIVE FAILED **
問題排查
排查1:直接登錄進入遠程的構建機,手動運行打包腳本是沒有問題的,這說明腳本本身是沒有問題的。看了上面的輸出錯誤日誌,應該是簽名問題
排查2:通過ssh的方式登錄遠程的構建機,運行打包腳本報同樣的錯誤,說明如果通過ssh方式解決了,那Jenkins應該也可以
排查3:在Google上搜索了Command /usr/bin/codesign failed with exit code 1 附帶ssh 關鍵詞,發現很多人也遇到了這個問題。同樣的持續集成工具fastlane有很多相似的[ Issue ]。大致的原理是因為codesign命令需要進行簽名的時候,會訪問keychain來獲取打包腳本中對應的證書。通過ssh這種方式訪問的時候,是沒有訪問許可權的。
排查4:按照網友們的做法,添加命令 security unlock-keychain -p password /Users/username/Library/Keychains/Login.keychain
. 其中password是你登錄當前機器賬戶的密碼,username是當前賬戶的名稱。在最新的Mac Sierra中在Keychains下面是沒有Login.keychain的,新的名字被改成了Login.keychain-db.所以需要做一個軟連接 ln -s ~/Library/Keychains/login.keychain-db ~/Library/Keychains/login.keychain
然後先執行上面的命令,然後執行打包腳本,就可以遠程打包了
補充: 由於這個解鎖並不是永久的,所以每次在執行打包腳本時,必須先執行解鎖命令後執行打包腳本。