用jenkins有將近三四個月了,為了支持iOS打包,網上有開源的工具集fastlane,就簡單總結一下,使用的心得和過程中遇到的坑。。。。
一、打包
下載fastlane,就三個命令:
sudo gem update --system sudo gem install bundler sudo gem install fastlane
可以查看一下 fastlane -v的版本,我們打包主要用到gym和上傳命令pilot,其他工具略有研究,但是未深入,還要提醒,我都是用的命令行格式,未使用官方推薦的Fastfile的方式,主要是我對ruby不夠了解,因為我也是個大菜鳥。附上打包命令。
gym打包,需要講解的不多,DEVELOPMENT_TEAM等等解釋,可以詳細看這里https://dpogue.ca/articles/cordova-xcode8.html
需要提醒的是 xcpretty_report_josn可以輸出oclint需要的xcpretty執行之后的內容,這里可以oclint集成到一起。
DEVELOPER_DIR="/Applications/Xcode.app" gym --workspace ${workspace_path} --scheme ${scheme} --clean true --configuration ${configuration} --xcargs "PRODUCT_BUNDLE_IDENTIFIER='${bundle_id}' DEVELOPMENT_TEAM='${DEVELOPMENT_TEAM}' PROVISIONING_PROFILE_SPECIFIER='${PROVISIONING_PROFILE_SPECIFIER}'" --export_method ${export_method} --archive_path ${archive_path} --codesigning_identity "${rightDistributionSign}" --xcpretty_report_json "${json_path}" --export_options ${ExoptionPlist} --output_directory ${ipa_path} --output_name ${ipa_name} || exit
二、集成
講講其他遇到的坑和解決方案。
由于主要使用fastlane中gym打包,但是這次需要注意的我們的需求是:
1、分別打三種包,對證書和rightProvision了解的不夠透徹?
解決:把三種證書都從開發那里要過來,然后將自己的APPLE ID升級到開發者Admin狀態,就具有了三種證書的使用權限,然后跟開發一一對接,對每個包分別對應的證書了解并整理,打包的時候一一對應上就好。這個過程中,收獲的是對xcodebuild的method參數有更深的了解,其實inhouse,adhoce,appstore分別對應的打包方式是enterprise,ad-hoc,app-store。
2、需要更換inhouse的圖標?
解決:之前想通過是打包的時候指向不同的target,后來的解決方案是直接替換。
for file in os.listdir(appIconPath): if ".png" in file: for appicon in os.listdir(replaceAppIconPath): if file==appicon: shutil.copy(replaceAppIconPath+'/'+appicon, appIconPath+'/'+file)
但是需要注意的是像素和尺寸需要保持一致,設計同學的幫忙很必要。
3、和slack對接
解決:其實我覺得slack真的非常好用,因為它提供了各種整合持續集成的api,這里特別佩服我們老大對這塊內容的重視,slack和jenkins集成非常方便。
只是網速有點不靠譜。slack api地址:https://api.slack.com/docs/message-guidelines
附上我寫的腳本,借助slack web api推送信息到slack,并且可以取出jenkins中執行者的信息:
#coding=utf-8 import sys import time import requests import re from slacker import Slacker def send(job_url, job_name, starters, build_timestamp, workspace, build_cause, git_branch, change_log, text, userid): """執行結果推送slack,可選個人和channel""" api_token="xxxx" slack=Slacker(api_token, 100) data=[{ "fallback": "Required plain-text summary of the attachment.", "color": "#36a64f", "fields": [ { "title": "Job name", "value": job_name, "short": True }, { "title": "Build Trigger", "value": starters, "short": True }, { "title": "Build Time", "value": build_timestamp, "short": True }, { "title": "Build Workspace", "value": workspace, "short": True }, { "title": "Root Build Cause", "value": build_cause, "short": True }, { "title": "GIT_BRANCH", "value": git_branch, "short": True }, { "title": "Job url", "value": job_url, }, { "title": "CHANGE_LOG", "value": change_log, } ], "footer": "XX公司", "ts": time.time() } ] try_times=0 while try_times < 5: try: slack.chat.post_message(userid, text=text, attachments=data) return "push to slack failed" except Exception as e: time.sleep(50) try_times +=1 if try_times >=5: raise Exception('push to slack failed') def get_content(job_url): """取出console log全部內容""" url=job_url + "consoleText/api/json" headers={ "Content-Type": "application/json", "Accept": "application/json" } response=requests.get(url, auth=("xx", "xx")) assert response.status_code==requests.codes.ok return response.content def get_trigger(result): """取出構建者""" trigger_user=re.findall(r"Started by", result) trigger_other=re.findall(r"Triggered by", result) starters="" if len(trigger_user) > 0: starters=re.findall(r"Started by(.*)", result)[0].lstrip() elif len(trigger_other) > 0: starters=re.findall(r"Triggered by(.*)", result)[0].lstrip() return starters if __name__=='__main__': if len(sys.argv) >=2: job_url=sys.argv[1] job_name=sys.argv[2] build_timestamp=sys.argv[3] workspace=sys.argv[4] build_cause=sys.argv[5] git_branch=sys.argv[6] text=sys.argv[7] userid=sys.argv[8] change_log=sys.argv[9] result=get_content(job_url) starters=get_trigger(result) result=get_content(job_url) starters=get_trigger(result) send_userid=["#xx", userid] for i in send_userid: send(job_url, job_name, starters, build_timestamp, workspace, build_cause, git_branch, change_log, text, i)
然后構造請求,發送即可,詳細不表。
4、因為我們app兩個平臺用的xcode版本不一致,需要升級到xcode8,需要將自動管理改為手動管理證書。
sed -i '' 's/ProvisioningStyle=Automatic;/ProvisioningStyle=Manual;/g' "$project_path/project.pbxproj"
5、pod install總是出現問題,分析可能是因為網絡或者本機pod安裝有問題。
若是pod問題,可以通過升級gem解決。
sudo gem update --system sudo gem install -n /usr/local/bin cocoapods
最后
我知道我寫的可能并不好,排版可能也不漂亮,但是是我們已經落地在用的工程,后續再加上持續集成jenkins中遇到的問題,請大家輕拍。謝謝。
再附上我們推送的截圖。
1. 雙擊打開之前創建的空白項目。
2. 本節課將為您演示,如何給一張矩形圖片,添加圓角的效果。首先在一個空白項目中,打開視圖控制器的代碼文件。
3. 接著開始編寫代碼,實現這項功能。
4. 首先從項目中,讀取一張之前添加的圖片文件。
5. 初始化一個圖像視圖對象,用來顯示讀取的圖片。
6. 初始化一個原點在(10, 80),寬度和高度都是300的矩形常量,作為圖像視圖的顯示區域。
7. 設置圖像視圖的顯示區域。
8. 接著設置圖像視圖層的圓角半徑大小,使其半徑大小等于圖像視圖寬度的一半。
9. 繼續設置圖像視圖層的遮罩覆蓋屬性,進行邊界裁切。
10. 將圖像視圖對象,添加到當前視圖控制器的根視圖。點擊[編譯并運行]按鈕,打開模擬器預覽效果。
11. 從彈出的模擬器中可以看出,您已經給圖像視圖添加了圓角效果。最后點擊[停止]按鈕,關閉模擬器,并結束本節課程。
本文整理自:《互動教程 for Xcode9
& Swift4》APP, 非特殊說明,本文版權歸原作者所有。
原文:http://coolketang.com/staticCoding/5a990dd8d50eee2ea302a1ef.html
文章標簽: ios開發
個人分類: iOS移動開發
所屬專欄: iOS開發從入門到精通
上一篇2.4 給圖像視圖添加邊框效果 [原創iOS開發-Xcode教程] 下一篇2.6 給圖像視圖添加陰影效果 [原創iOS開發-Xcode教程]
code13正式版已經更新,這是Mac平臺上一款專業的開發工具,Xcode 13 for Mac添加了強大的新團隊開發功能,非常適合與Xcode云以及GitHub、Bitbucket和GitLab協作功能,你還能在Xcode中直接發起、審查、評論和合并拉取請求,這次的xcode mac版功能更加完善,歡迎各位來體驗哦!
Xcode 13 for Mac官方介紹
Xcode 包含開發人員為 Mac、iPhone、iPad、Apple TV 和 Apple Watch 創建出色應用程序所需的一切。Xcode 為開發人員提供了統一的用戶界面設計、編碼、測試和調試工作流程。Xcode IDE 與 Swift 編程語言相結合,使開發應用程序變得簡單而有趣。
https://mac.orsoon.com/Mac/187182.html
xcode13正式版功能特點
Xcode 包括 Xcode IDE、Swift 和 C/C++/Objective-C 編譯器、Instruments 分析工具、模擬器、最新的 SDK 以及數百個強大的功能:
創新工具可幫助您創建出色的應用程序
? Swift 是一種直觀的編程語言,安全、快速且現代
? SwiftUI 是一個革命性的框架,可使用聲明式 Swift 語法創建用戶界面
? Playgrounds 是一種試驗 Swift 代碼并與之交互的有趣方式
? 視圖調試顯示運行時所有應用程序 UI 視圖層的 3D 堆棧
? 以幾乎無限的方式拆分編輯器、顯示預覽或選擇助手查看相關內容
? 實時問題會在您鍵入時顯示錯誤,而 Fix-its 只需單擊一下即可改進您的代碼
? 源代碼控制導航器和服務集成可幫助您跨團隊管理代碼
SwiftUI 和 Interface Builder 使設計界面變得容易
? SwiftUI 使用聲明式 Swift 代碼來清楚地描述您的界面
? 設計畫布使用控件和修改器庫以圖形方式構建 UI 視圖
? 以不同的屏幕尺寸、方向和字體大小預覽 SwiftUI 代碼或 UIKit 界面
? SwiftUI 代碼始終與圖形設計畫布和預覽完美同步
? 動畫是使用簡單的命令構建的,這些命令描述了您想看到的動作
專業的編輯器和調試器使您的代碼保持在前端和中心
? 重構使修改 Swift、Objective-C、C 和 C++ 代碼的結構變得容易
? 打開快速立即打開您項目中的任何文件
? 數據提示和快速查看可以通過在調試時將鼠標懸停在代碼上來檢查變量
性能分析儀器
? 隨著時間的推移,將 CPU、磁盤、內存和 GPU 性能作為圖形軌跡進行比較
? 確定性能瓶頸,然后深入代碼以找出原因
? 直接分析您的應用程序,或以很少的開銷對整個系統進行采樣
? 創建具有獨特可視化效果的自定義工具來分析您自己的代碼和框架
*請認真填寫需求信息,我們會在24小時內與您取得聯系。