於 Laravel x Vue Conf Taiwan 2022 的演講簡報,主要描述一個多年的 Legacy 專案如何慢慢的演變為現代化框架為基底的專案過程。
從 Legacy 到 Lovely陳佑⽵ aka. 墨嗓 @Laravel & Vue Conf Taiwan⽤ CI/CD 改建⼆⼗年祖產全記錄
View Slide
• 陳佑⽵,朋友都叫我墨嗓 Mouson• GitLab Hero• 資深系統分析師• GitLab Taipei User Group /DevOps Taiwan / Laravel Taiwan志⼯• [email protected]• https://gitlab.com/mo-playground• https://gitlab.com/mousonAbout Me
世成科技
Legacy什麼是 Legacy?
什麼是 Legacy?
什麼是 Legacy?• 年代久遠
什麼是 Legacy?• 年代久遠• 結構龐⼤
什麼是 Legacy?• 年代久遠• 結構龐⼤• 經歷多次迭代
什麼是 Legacy?• 年代久遠• 結構龐⼤• 經歷多次迭代• 沒有⽂件
該怎麼⾯對 Legacy?
• ⾯對它• 接受它• 處理它• 放下它該怎麼處理 Legacy?重構或重寫 Legacy code 的幾個階段https://jaceju.net/steps-of-refactoring-or-rebuilding/
⾯對它
⾯對它• 不要仇視它
⾯對它• 不要仇視它• 你的薪⽔可能是它提供的
⾯對它• 不要仇視它• 你的薪⽔可能是它提供的• 深入解析
⾯對它• 不要仇視它• 你的薪⽔可能是它提供的• 深入解析• 調查⽬前的規格、背景故事等
⾯對它• 不要仇視它• 你的薪⽔可能是它提供的• 深入解析• 調查⽬前的規格、背景故事等• 理解 Legacy Code 的架構
接受它
接受它• 導入單元測試
接受它• 導入單元測試• 導入持續整合 CI
接受它• 導入單元測試• 導入持續整合 CI• 導入持續部署/發佈 CD
接受它• 導入單元測試• 導入持續整合 CI• 導入持續部署/發佈 CD• 導入 E2E ⾃動化測試
處理它
處理它• 不⽤⼀次到位,⼀次調整⼀點
處理它• 不⽤⼀次到位,⼀次調整⼀點• 選⽤好的⼯具
處理它• 不⽤⼀次到位,⼀次調整⼀點• 選⽤好的⼯具• 可以考慮使⽤ Feature Toggle 來重構• 遇到問題可切回上⼀版本
處理它• 不⽤⼀次到位,⼀次調整⼀點• 選⽤好的⼯具• 可以考慮使⽤ Feature Toggle 來重構• 遇到問題可切回上⼀版本• 挑⼀個適合的好框架改寫
放下它
放下它• 持續向前、持續改善
放下它• 持續向前、持續改善• 透過加入單元測試,讓原始碼的保護越來越⾼
放下它• 持續向前、持續改善• 透過加入單元測試,讓原始碼的保護越來越⾼• 透過靜態分析⼯具,持續調整改善原始碼
放下它• 持續向前、持續改善• 透過加入單元測試,讓原始碼的保護越來越⾼• 透過靜態分析⼯具,持續調整改善原始碼• 童軍守則:讓離開時的營地比進去時乾淨
以上為「理論」的部分
我們的故事2014.071.5P
PHP 4我們的版本 - ⾯對它• Apache 1.3• PHP 4.1.2• 核⼼為使⽤ C 編寫之 PHP Extension• PHP 程式碼超過千隻 PHP 程式• LoC 超過 20 萬⾏(僅PHP)• 版本控制(CVS)服務損毀• 非 PHP 原始碼遺落或不完整• 使⽤非常⾒的商⽤資料庫NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver41.34.1.2
⾯對它 - Legacy• 年代久遠• 結構龐⼤• 經歷多次迭代• 沒有⽂件
⾯對它 - Legacy• 年代久遠• 結構龐⼤• 經歷多次迭代• 沒有⽂件• 沒有原始碼
⾯對它 - Legacy• 年代久遠• 結構龐⼤• 經歷多次迭代• 沒有⽂件• 沒有原始碼-FHBDZႩᗇ
先從重要的開始
Part 1 - 接受它
Part 1 - 接受它• 建立 Issue Tracking System
Part 1 - 接受它• 建立 Issue Tracking System• 建立版本控制系統
Part 1 - 接受它• 建立 Issue Tracking System• 建立版本控制系統• The One DevOps Platform
Part 1 - 接受它• 建立 Issue Tracking System• 建立版本控制系統• The One DevOps Platform• 建立研發團隊⼯作流程
Part 1 - 接受它• 透過各種⽅法了解系統結構• 透過新需求了解程式架構• 撰寫⽂件
Part 1 - 處理它PHP 4NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver41.34.1.2PHP 5NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.12.25.2.17
Part 1 - 接受它• 藉此更了解系統結構、架構• 初步升級 PHP 5.2.17 及核⼼元件
Part 1 - 接受它• 藉此更了解系統結構、架構• 初步升級 PHP 5.2.17 及核⼼元件• 依然沒有 namespace
Part 1 - 接受它• 藉此更了解系統結構、架構• 初步升級 PHP 5.2.17 及核⼼元件• 依然沒有 namespace• 依然沒有 Composer Package 可以⽤
說好的 CI CD 呢?
Part 2 - 處理它
Part 2 - 處理它• 導入單元測試,以測試描述規格
Part 2 - 處理它• 導入單元測試,以測試描述規格• 寫 PHP 5.2 與 PHP 5.6 相容的語法
Part 2 - 處理它• 導入單元測試,以測試描述規格• 寫 PHP 5.2 與 PHP 5.6 相容的語法• 導入 TDD 進⾏新功能開發
Part 2 - 處理它• 導入單元測試,以測試描述規格• 寫 PHP 5.2 與 PHP 5.6 相容的語法• 導入 TDD 進⾏新功能開發• 持續針對重要核⼼演算法重構、補上測試
Part 2 - 處理它• 導入單元測試,以測試描述規格• 寫 PHP 5.2 與 PHP 5.6 相容的語法• 導入 TDD 進⾏新功能開發• 持續針對重要核⼼演算法重構、補上測試• 透過 GitLab 的 CI/CD 功能加入⾃動化測試
Part 2 - 處理它• 持續累積研發團隊(2.5P) Credit• 錯了代表以測試所描述的規格還不夠完整• 補測試後就不會再錯,不再改 A 壞 B
Part 2 - 處理它• 持續累積研發團隊(2.5P) Credit• 錯了代表以測試所描述的規格還不夠完整• 補測試後就不會再錯,不再改 A 壞 B• 程式⼜算錯了!
Part 2 - 處理它• 持續累積研發團隊(2.5P) Credit• 錯了代表以測試所描述的規格還不夠完整• 補測試後就不會再錯,不再改 A 壞 B• 可能不是程式寫錯,⽽是使⽤端設定錯誤• 程式⼜算錯了!
PHP 5NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.12.25.2.17Part 3 - ⾯對它 - 下⼀⽬標?PHP 7.3NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.1.3
PHP 7.3NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.1.3Part 3 - ⾯對它 - 下⼀⽬標?• 升級 PHP 到 PHP 7• 導入 ORM• 如果可能導入 Laravel 作為後端核⼼• 作業系統升級• 資料庫版本升級
Part 3 - ⾯對它 - 升級 PHP 7.3• Use Register Global 問題• PHP 7.3 語法相容• Custom ExtensionPHP 7.3NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.1.3
Part 3 - 處理它 - 升級 PHP 7.3• ⼤量修正使⽤ Register Global 問題
Part 3 - 處理它 - 升級 PHP 7.3• Custom Extension• 以 TDD 的⽅法重建 Extension• ⼤部分直接以 PHP 直接重寫• 少量 PHP Extension
Part 3 - 處理它 - 升級 PHP 7• PHP 7.3 語法相容調整• 透過 PHPCompatibility 產出報告逐⼀修正• https://github.com/PHPCompatibility• mcrypt 語法移除:改寫
PHP 7.3NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.1.3下⼀⽬標?PHP 7.4NativeCustomExtensionPHPExtensionSoftwareDatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.4.48
Part 4 - 導入 Laravel 需要?• 使 Laravel ⽀援 DBMaker• 非 Laravel 架構的原始碼處置• 檔案上傳儲存機制調整PHP 7.4NativeCustomExtensionPHPExtensionSoftwareDatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.4.48
Part 4 - 使 Laravel ⽀援 DBMaker• 使 Eloquent 能夠⽀援DBMaker,建立Eloquent Driver
Part 4 - 使 Laravel ⽀援 DBMaker• 使 Eloquent 能夠⽀援DBMaker,建立Eloquent Driverhttps://mouson.im/Publication/PHP/20170701-laravelconf-taiwan-2017-eloquent-destruct/
Part 4 - 非 Laravel 架構的原始碼處置• Legacy• Route• Controller
Part 5 - 程式碼品質持續改善• Code Lint 置入開發⽇常• 程式碼品質資料蒐集、討論• 在 GitLab Merge Request Highlight
Part 5 - 程式碼品質持續改善• Code Lint 置入開發⽇常
Part 5 - 程式碼品質持續改善• Code Lint 置入開發⽇常• 建立程式碼格式的團隊規則共識
Part 5 - 程式碼品質持續改善• Code Lint 置入開發⽇常• 建立程式碼格式的團隊規則共識• 減少不必要的 Commit 留存
Part 5 - 程式碼品質持續改善• Code Lint 置入開發⽇常• 程式碼品質資料蒐集、討論• 在 GitLabMerge Request Highlight
Part 6 - 程式碼品質主動監控
Part 6 - 程式碼品質主動監控• 搭配 Laravel Logging 主動通知服務執⾏異常
Part 6 - 程式碼品質主動監控• 搭配 Laravel Logging 主動通知服務執⾏異常• PHP SAST(static application security testing)
Part 7 - 持續交付、部署 (CD)
Part 7 - 持續交付、部署 (CD)• 持續交付 (Continuous Delivery)
Part 7 - 持續交付、部署 (CD)• 持續交付 (Continuous Delivery)• 持續部署 (Continuous Deployment)
Part 8 - 持續改善
Part 8 - 持續改善PHP 4NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver41.34.1.2
Part 8 - 持續改善PHP 4NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver41.34.1.2 PHP 5NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.12.25.2.17
Part 8 - 持續改善PHP 4NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver41.34.1.2 PHP 5NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.12.25.2.17 PHP 7.3NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.1.3
Part 8 - 持續改善PHP 4NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver41.34.1.2 PHP 5NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.12.25.2.17 PHP 7.3NativeCustomExtensionPHPExtensionCustomSoftware6DatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.1.3 PHP 7.4NativeCustomExtensionPHPExtensionSoftwareDatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.4.48
PHP 7.4NativeCustomExtensionPHPExtensionSoftwareDatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.4.48Part 8 - 持續改善
PHP 7.4NativeCustomExtensionPHPExtensionSoftwareDatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.4.48Part 8 - 持續改善• ⼤型範圍重構需⼀點⼀滴的改善及累積
PHP 7.4NativeCustomExtensionPHPExtensionSoftwareDatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.4.48Part 8 - 持續改善• ⼤型範圍重構需⼀點⼀滴的改善及累積• ⼤⽬標需要切割成⼩⽬標
PHP 7.4NativeCustomExtensionPHPExtensionSoftwareDatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.4.48Part 8 - 持續改善• ⼤型範圍重構需⼀點⼀滴的改善及累積• ⼤⽬標需要切割成⼩⽬標• 團隊需要有共識的作取捨
PHP 7.4NativeCustomExtensionPHPExtensionSoftwareDatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.4.48Part 8 - 持續改善• ⼤型範圍重構需⼀點⼀滴的改善及累積• ⼤⽬標需要切割成⼩⽬標• 團隊需要有共識的作取捨• 如果可能,重構要盡早
PHP 7.4NativeCustomExtensionPHPExtensionSoftwareDatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.4.48我們的下⼀⽬標?
PHP 7.4NativeCustomExtensionPHPExtensionSoftwareDatabaseProjectBackend FrontendHTML, JavaScript, PHPODBC Driver5.4.48我們的下⼀⽬標?PHP 8.2NativeCustomExtensionPHPExtensionSoftwareProjectBackend FrontendHTML, JavaScript, PHPODBC Driver.29
我們的 GitLab CI
今天跟⼤家介紹的 GitLab CI
今天跟⼤家 Demo 的 GitLab CI 範例https://gitlab.com/mo-playground/laravel-vue-conf-taiwan-2022-gitlabci-example/
軟體開發版本規劃組譯測試產品釋出發佈部署維運監控
Summaryhttps://twitter.com/markbrooks/status/1573286323515170816/photo/1
Summaryhttps://twitter.com/markbrooks/status/1573286323515170816/photo/1願景Vision技能Skills誘因Incentives資源Resources⾏動計畫Action Plan改變Change技能 誘因 資源 ⾏動計畫困惑Confusion願景 誘因 資源 ⾏動計畫焦慮Anxiety願景 技能 資源 ⾏動計畫抵抗Resistance願景 技能 誘因 ⾏動計畫挫折Frustration願景 技能 誘因 資源⼀開始就失敗False Starts• 願景、技能、誘因、資源、⾏動計畫,形成改變• 沒有「願景」會造成困惑• 沒有「技能」會令⼈焦慮• 沒有「誘因」會讓⼈抵抗• 沒有「資源」會使⼈挫折• 沒有「⾏動計畫」則⼀開始就失敗
讓每⼀次的 Commit 都是⼀次改善的機會https://www.facebook.com/groups/DevOpsTaiwan/posts/5610989525654714/
Q&A