【網易嚴選】iOS持續整合打包(Jenkins+fastlane+nginx)
本文來自網易雲社群
作者:孫嬌
嚴選iOS客戶端的現有打包方式是通過遠端連線打包機執行指令碼去打包,打完包會輸出相應的ipa的二維碼,掃一掃二維碼可以安裝,但是隨著測試隊伍的壯大,外包同學越來越多,在打包機輸入命令的方式可用度越來越低,手動輸入命令的缺陷有:
1、必須手動輸入分支名,和buildversion(手動計算自增)
2、遠端連線打包機不穩定,經常斷線,影響效率
3、切換分支不方便(還經常切換失敗)
基於以上的各個問題,我決定改造一下現有的打包方式,讓任何一個新來的測試同學都可以直接動手自己打包,最終定下的方案是:底層使用fastlane來執行打包(不要問我選它的原因,畢竟github上有2w的star,好處自然是多到不用說),然後使用Jenkins來執行打包指令碼,最終依然生成二維碼以供方便的掃碼安裝。
因此主要步驟分為:
1、安裝fastlane,編寫打包指令碼(網上的教程多到數不過來,請自行搜尋),主要的目錄結構如下:
主要的就是Appfile和Fastfile檔案,Appfile裡主要存寫的是app包的bundleID,teamID等內容(內容涉及app機密就不貼出來了),Fastfile裡主要是儲存打包的指令碼,我的指令碼參考:
default_platform:ios PROJECT_FILE_PATH = "./NeteaseYanxuan.xcodeproj"PLIST_FILE_PATH = "NeteaseYanxuan/NeteaseYanxuan.plist"OUTPUT_DIRECTORY = "/usr/local/var/www/Yanxuan"platform :ios do before_all do |lane, options| git_switch_branch(branch: options[:branch]) git_pull end#debug Build lane :debug do |options| update_info_plist( plist_path: "#{PLIST_FILE_PATH}", display_name: "網易嚴選push" ) update_app_identifier( xcodeproj: PROJECT_FILE_PATH, plist_path: "#{PLIST_FILE_PATH}", app_identifier: "com.ntes.yanxuan" ) branch_dir = options[:branch] version_number = options[:version] increment_version_number( version_number: "#{version_number}" ) gym( clean: "true", scheme: "NeteaseYanxuan", export_method:"enterprise",export_options: { provisioningProfiles: { "com.ntes.yanxuan" => "YanXuan_enterprise","com.ntes.yanxuan.ServiceExtension" => "yanxuan_pushextension","com.ntes.yanxuan.todayExtension"=> "yanxuantodayExtension" } }, output_directory: "#{OUTPUT_DIRECTORY}/#{branch_dir}", output_name: "NeteaseYanxuan.ipa" ) end end
還有一個非常好用的小工具可以推薦, 關於切換分支的一個fastlane的外掛,奉上github地址: ofollow,noindex">fastlane切換分支外掛 ,安裝方法和使用方法上面有很詳細的介紹,但是我在安裝中遇到一個坑,就fastlane install_plugins安裝之後,顯示安裝成功,但是使用的過程中一直報錯,說找不到git_switch_branch,找了好久的原因最後只能將這個外掛加到gemFile裡去,然後手動執行安裝,具體步驟:
-
將“gem 'fastlane-plugin-git_switch_branch”加到Gemfile裡
-
然後執行bundle install
然後再去執行fastlane laneName去打包,就可以正常的使用這個外掛了!
2、fastlane的打包指令碼只能輸出ipa的iOS包,這個包是沒有辦法直接安裝的,需要對生成對ipa包裝一下,生成可以掃描的二維碼,這樣的二維碼每個人都可以直接掃描二維碼然後下載安裝,具體的方法是本地寫好一個靜態頁面,每次將新生成的ipa去替換這個靜態頁面裡的各個引數,安裝客戶端所需要的plist檔案我們是存放在七牛上去管理,放在哪個平臺是無所謂的,全憑你的資金決定!
這部分使用shell去做的,在腳本里呼叫fastlane去打包,然後再去替換各個引數,具體程式碼參考如下:
#!/bin/bashfunction help() {echo "Example: sh deploy.sh--branch=master --version=1.0.0\n" echo "引數說明:" echo "--branch分支,可選,不填預設為master" echo "--version大版本號,可選,不填使用程式碼裡指定的版本" exit 1}if [ $# -eq 0 ]then helpfi#default configbranch="master"version=""#check argumentsfor var in "$@"do if [[ $var == --branch=* ]]; then branch=${var#--branch=} elif [[ $var == --version=* ]]; then version=${var#--version=} fidone#__filePath即為當前指令碼存放路徑__filePath=$(dirname "$0") qiniupy=$__filePath/qbox.py html_folder=$__filePath/html workspace_name="NeteaseYanxuan"onlineBaseUrl="https://dn-ios-deploy.qbox.me/"testBaseUrl="https://*******" #這個地方主要是你存放資料的路徑
function build_app() { fastlane debug version:$version branch:$branch dist_dir="/usr/local/var/www/Yanxuan/$branch"} function sync_template() { mkdir $dist_dir/html cp $html_folder/app.html $dist_dir/html/$workspace_name.html cp $html_folder/app.plist $dist_dir/html/$workspace_name.plist cp $html_folder/appios8.plist $dist_dir/html/$workspace_name-ios8.plist cp $html_folder/version.json $dist_dir/html/version.json sed -i '' s/@@version@@/$buildVersion/g $dist_dir/html/* sed -i '' s/@@name@@/$name/g $dist_dir/html/* sed -i '' s/@@bundleId@@/$bundleId/g $dist_dir/html/* local html=$onlineBaseUrl/$workspace_name/$branch/app.html local plist=$onlineBaseUrl/$workspace_name/$branch/app.plist local ios8fixplist=$onlineBaseUrl/$workspace_name/$branch/app-ios8.plist local ipa=$testBaseUrl/$branch/$workspace_name.ipa sed -i '' s#@@html@@#$html#g $dist_dir/html/* sed -i '' s#@@plist@@#$plist#g $dist_dir/html/* sed -i '' s#@@ios8fixplist@@#$ios8fixplist#g $dist_dir/html/* sed -i '' s#@@ipa@@#$ipa#g $dist_dir/html/* python $qiniupy $dist_dir/html/$workspace_name.html $workspace_name/$branch/app.html python $qiniupy $dist_dir/html/$workspace_name.plist $workspace_name/$branch/app.plist python $qiniupy $dist_dir/html/$workspace_name-ios8.plist $workspace_name/$branch/app-ios8.plist cp $dist_dir/html/version.json $dist_dir/../version.json }echo "**** Package Application"build_appechoecho "**** Update html/plist"sync_templateechoecho "**** Complete @ `date +"%Y-%m-%d %T"`!"
腳本里需要用到qiuniupy,所以你的機器還是要安裝好python相關的環境,安裝的過程中遇到缺啥就直接安裝啥,但是這個過程中我也遇到了一個坑,我pip install qiniu系統提示我安裝成功,import的時候一直提示沒有這個module,最終還是通過系統自帶的easy_install qiniu來安裝成功的。
到了這一步,所有的指令碼都準備完成了,可以先在命令列裡執行這個打包指令碼,看是否能打包成功,到這步就成功了一半啦~~
3、有了指令碼,如何方便的執行指令碼,這時候就是Jenkins上場的時候到啦,Jenkins的安裝就不多說了,網上的資料一抓一大把,但是!但是!但是!
Mac的同學請注意!注意!意!在Mac上安裝Jenkins要額外關注許可權的問題,我曾經就因為這個問題耗費了好幾個美妙的夜晚,抓耳撓腮的解決許可權的問題,各種不能訪問,各種不能執行。發生這種問題的前提是下載和安裝的從jenkins官網下載的pkg安裝包,安裝後會直接啟動jenkins的web容器,然後你會發現jenkins的目錄是預設安裝在/Users/Shared/jenkins的(就是共享資料夾),也就是在你的使用者目錄之外,好像這時候Jenkins各種許可權都沒有,就各種執行失敗了。解決辦法就是儘量使用命令列安裝,然後自己建立Jenkins的配置檔案去啟動Jenkins,那麼一切都是受你的控制啦~~
配置檔案的路徑:/Library/LaunchDaemons,在這個路徑下建立:org.jenkins-ci.plist,配置內容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>StandardOutPath</key> <string>/var/log/jenkins/jenkins.log</string> <key>StandardErrorPath</key> <string>/var/log/jenkins/jenkins.log</string> <key>EnvironmentVariables</key> <dict> <key>JENKINS_HOME</key> <string>/Users/leon/Documents/IOSJenkins/Jenkins/Home</string> </dict> <key>GroupName</key> <string>daemon</string> <key>KeepAlive</key> <true/> <key>Label</key> <string>org.jenkins-ci</string> <key>ProgramArguments</key> <array> <string>/bin/bash</string> <string>/Library/Application Support/Jenkins/jenkins-runner.sh</string> </array> <key>RunAtLoad</key> <true/> <key>UserName</key> <string>jenkins</string> <key>SessionCreate</key> <true/> </dict> </plist>
其中的JENKINS_HOME 就是你的路徑,我這裡放在了文稿下,因為我的其他指令碼也放在文稿下,避免出現其他許可權問題一了百了,放在同一資料夾下,解決所有問題。
配置完成啟動Jenkins,接下來建立job的步驟網上的教程很多也很簡單,就直接建立一個,我這邊就不多說了。
主要是配置可執行的指令碼,我的配置內容如下:


到此所有打包的指令碼,執行都準備完成了,包生成的檔案是存放在你的打包機上的,如何讓其他使用者能直接通過域名訪問你的打包機器來獲取包的內容呢,這時候你就需要在你的機器上配置一下Nginx,Nginx的配置教程也很簡單,網上的教程也很多,我這邊就不贅述了 ,配置完Nginx,其他使用者就可以通過域名去訪問你的打包檔案啦~~
最終打包生成的結構如下所示:
使用者開啟這個html檔案,就可以直接掃碼二維碼去安裝最新的iOS測試包啦,頁面效果如下:

哈哈哈哈,頁面是不是很美膩啊(已經把我會寫的前端程式碼全都用上去啦)~~~
最終我們的一鍵打包功能就完成了,任何一個新來的同學都可以在Jenkins上去操作打包了,只要勾選各個引數,然後去點選立即構建,等打包完去收割二維碼就可以了,簡單方便。。。
網易雲 免費體驗館 ,0成本體驗20+款雲產品!
更多網易研發、產品、運營經驗分享請訪問 網易雲社群 。
相關文章:
【推薦】 Amazon新一代雲端關係資料庫Aurora(下)
【推薦】 從golang的垃圾回收說起(下篇)