從獨立開發到大型專案的CI/CD攻略

56eecc8d10c342264eea5b90f3cb1306?s=47 Hokila Jan
November 08, 2020

 從獨立開發到大型專案的CI/CD攻略

56eecc8d10c342264eea5b90f3cb1306?s=128

Hokila Jan

November 08, 2020
Tweet

Transcript

  1. 2020/11/08 從獨立開發到大型專案 的 CI/CD 攻略 Hokila iPlayground 2020

  2. 關於我 詹岳勳 (@hokilaj) iOS 4 開始 頂尖軟體開發者協會 理事長 星宇航空 Bitrise

    Speaker Expert
  3. 為什麼要自動化? 個人開發 接案公司 產業領導品牌 InHouse

  4. 為什麼要自動化?(書上寫的) 減少人為錯誤 增加系統可靠度

  5. 為什麼要自動化?(真實世界) 跟風/ 炫 工程師想偷懶 主管要我做 買 Mac Pro

  6. 為什麼要自動化?(真實世界) 己所不欲 外包於人

  7. - 本機 build script - 自架 build server - Cloud

    CI
  8. 本機 build script - shell script - fastlane

  9. shell script function build_product() { ProductPostfix=$1 XcodeConfiguration=$2 removeLastBuild setNewBuildNumber generateparameter

    archive upload #to TestFlight or OTA service notify } eval "$1" # sh buildScript.sh "build_product AppStore PROD" # sh buildScript.sh "build_product AdHoc UAT"
  10. shell script function archive() { xcodebuild clean archive\ -archivePath "build/prod_$scheme/$scheme"\

    -workspace $XcodeWorkspaceFile\ -scheme "$scheme" | xcpretty xcodebuild -exportArchive\ -archivePath "build/prod_$scheme/$scheme.xcarchive"\ -exportPath "build/prod_$scheme/$scheme"\ -exportOptionsPlist $exportPlist | xcpretty }
  11. shell script function archive() { eval "fastlane gym \ --workspace

    $XcodeWorkspaceFile \ --scheme $XcodeScheme \ --clean \ --configuration $XcodeConfiguration \ --output_name $ipaFileName \ --include_bitcode YES \ --export_method $ExportMethod " }
  12. shell script 缺點 主動觸發,自動化程度不夠 fasfile 使用不夠深入 對初學 CI/CD 的 developer

    不夠友善
  13. None
  14. None
  15. lane :matchAll do match(type: "appstore", app_identifier: [ "com.starlux.cale", "com.starlux.cale.notificationService"], readonly:

    true) match(type: "development", generate_apple_certs: false, force:true, force_for_new_devices: true, app_identifier: [ "com.starlux.cale.dev", "com.starlux.cale.dev.notificationService", "com.starlux.cale", "com.starlux.cale.notificationService" ], readonly:false) end
  16. desc "Archive" lane :archive_app do |options| cocoapods increment_build_number( build_number: ENV['BUILD_NUMBER'],

    # set a specific number ) #match certificate and provision file case ENV['ARCHIVE_TYPE'] when 'app-store' match(type: "appstore", app_identifier: ["com.starlux.cale", "com.starlux.cale.notificationService"], readonly: true) ………
  17. % bundle exec fastlane archive_app --env dev # .env.dev (committed

    to version control) ARCHIVE_TYPE=development BUILD_CONFIGURATION=DEV APPCENTER_NAME=<secret> APPCENTER_GROUP=<another secret>
  18. None
  19. Fastlane 優點 確實解決 Developer 痛點,想要的工具都找得到 Match 很好用,尤其是要管理一堆 bundleID 的時候 只用

    gym 的話,其實用 xcodebuild 就夠了
  20. 更懶惰一點? - 有 merge request 就跑 unit test,成功按讚 - Develop

    branch 有更新就 build 一版測試版 - 有新的 tag 就 build 一版送審
  21. None
  22. None
  23. None
  24. Jenkins 的優點 ⾃架機器,完全榨乾效能 限制內網 使⽤ LDAP 登入,多樣性權限控管 plug-in 很多

  25. None
  26. Jenkins 的缺點(⼈多了以後) 要維護 IP table/使⽤者權限 plug-in 更新不知道會不會壞掉 最⼤的 plug-in 叫

    Xcode
  27. Version maintain hell

  28. plug-in 清單裡⾯出現⼀堆 windows 跟 Android 的設定 Build 好的安裝檔都會傳到 master 可能會導致空間不⾜。

    管 Jenkins 的同事可能未告知就把 job 的紀 錄刪掉 Jenkins 的缺點(續)
  29. 總之 ⽤ Jenkins 會讓你的 iOS 開發之 路從頭到尾⾛⼀遭 其實可以創造個職位叫 jenkins engineer

  30. 那些年看過的 CI/CD ‣ AppCenter ‣ CircleCI ‣ Github action ‣

    Xcode Server ‣ fastlane CI
  31. 提供

  32. IP Table? Just type bitrise.io to access service

  33. Security?

  34. Xcode version?

  35. Super fast

  36. 來個範例 1. 開⼀個 PR/MR 2. 執⾏ workflow 檢查 unit test

    3. 成功以後 unlock merge button
  37. None
  38. 再來個範例 1. Developer branch 有更新 2. 執⾏ workflow ,archive 測試版

    3. 上傳 ipa 4. 通知 QA 有新版可以測
  39. None
  40. ‣ Repo 在內網⽽且沒有 vpn 的話不能⽤ ‣ 還沒有代理商不能開發票 ‣ 效能沒有⾃架主機好 ‣

    沒有顯⽰ test case trend Bitrise 的缺點 Bitrise 的缺點
  41. 要從安裝 command line 開始 ‣ bundle install ‣ pod install

    ‣ fastlane plugin ‣ DerivedData? Cloud CI 共同缺點-沒有 cache 真的很久
  42. None
  43. None
  44. Setting -> Manage Build Caches

  45. 如何加速 Build Time! ‣ 除了換機器以外 ‣ Optimize Build Setting ‣

    Prebuild code into library/framework ‣ Cocoapods-binary or Carthage
  46. Strong Community

  47. Twitter hash tag #bitrise #bitrise_meetup Forum https://discuss.bitrise.io/ Blog https://blog.bitrise.io/

  48. Wanna try?

  49. Wanna try? ‣ ⽤ developer plan 試看看 ‣ 思考你現在最想⾃動化的流程: 發版︖測試︖

    ‣ Next Step
  50. Bitrise in practice https://youtu.be/m2kqs8Ve7ZE 從零開始的 CI/CD 教學 ⼀⼩時完成

  51. 結論-個⼈開發/外包/⼩公司案⼦很多 ‣ 只需要發版:⽤ shell script 就好 ‣ ⾃動化機制:⽤ bitrise

  52. 結論-startup ‣ ⽤ bitrise ‣ Jenkins 主機需要空間 ‣ 先付費省下寫 script

    的時間
  53. 結論-有 infra ⽀援/公司政策 ‣ Jenkins 是你唯⼀選擇

  54. 休淡幾類 ‣ 休息 5 分鐘 ‣ 有 weak self talk

    秀 ‣ 隔壁間