Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
從 Legacy 到 Lovely,用 CI/CD 改建二十年祖產全記錄
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
mouson(墨嗓)
December 03, 2022
Programming
540
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
從 Legacy 到 Lovely,用 CI/CD 改建二十年祖產全記錄
於 Laravel x Vue Conf Taiwan 2022 的演講簡報,主要描述一個多年的 Legacy 專案如何慢慢的演變為現代化框架為基底的專案過程。
mouson(墨嗓)
December 03, 2022
More Decks by mouson(墨嗓)
See All by mouson(墨嗓)
20251212 AI 時代的 Legacy Code 營救術 2025 WebConf
mouson
0
370
10 Git Command You Should Start Using Today
mouson
0
130
Advanced GitLab Workshop - 談 pipeline 調教與進階 GitLab CI 語法
mouson
0
1.4k
GitLab 13~14CICD功能亮點提示-GitLab 10週年線上聚會
mouson
0
990
深入GitLabCI-談描述檔重構與流水線加速
mouson
4
1.2k
GitLab CI 從團隊導入到運用
mouson
2
980
PHP 升版絕活 - 給你一劑面對 Legacy 專案的還魂丹
mouson
0
710
20190323_ThreeGitTips-台日技術社群交流會
mouson
1
1.5k
用PHP快速建立商品上架通知器 - Star Rocket Meetup EP3
mouson
1
230
Other Decks in Programming
See All in Programming
net-httpのHTTP/2対応について
naruse
0
480
メソッドのジェネリクスでGoの夢は広がるか? / Kyoto.go #65
utgwkk
3
760
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
540
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
160
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
130
フロントエンドとバックエンドで「1文字」を揃えよう
youkidearitai
PRO
0
670
作って学ぶ、 JSX (TSX) ランタイムの基本
syumai
7
1.6k
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
230
脅威をエンジニアリングの糧にして――現場編 / Turning Threats into Engineering Fuel — Field Edition
nrslib
0
280
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
130
The NotImplementedError Problem in Ruby
koic
1
780
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
550
Featured
See All Featured
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
WCS-LA-2024
lcolladotor
0
630
Bash Introduction
62gerente
615
220k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
230
23k
技術選定の審美眼(2025年版) / Understanding the Spiral of Technologies 2025 edition
twada
PRO
118
120k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
GitHub's CSS Performance
jonrohan
1033
470k
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
190
Transcript
從 Legacy 到 Lovely 陳佑⽵ aka. 墨嗓 @Laravel & Vue
Conf Taiwan ⽤ CI/CD 改建⼆⼗年祖產全記錄
• 陳佑⽵,朋友都叫我墨嗓 Mouson • GitLab Hero • 資深系統分析師 • GitLab
Taipei User Group / DevOps Taiwan / Laravel Taiwan 志⼯ •
[email protected]
• https://gitlab.com/mo-playground • https://gitlab.com/mouson About Me
世成科技
Legacy 什麼是 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.07 1.5P
PHP 4 我們的版本 - ⾯對它 • Apache 1.3 • PHP
4.1.2 • 核⼼為使⽤ C 編寫之 PHP Extension • PHP 程式碼超過千隻 PHP 程式 • LoC 超過 20 萬⾏(僅PHP) • 版本控制(CVS)服務損毀 • 非 PHP 原始碼遺落或不完整 • 使⽤非常⾒的商⽤資料庫 Native Custom Extension PHP Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 4 1.3 4.1.2
⾯對它 - Legacy • 年代久遠 • 結構龐⼤ • 經歷多次迭代 •
沒有⽂件
⾯對它 - Legacy • 年代久遠 • 結構龐⼤ • 經歷多次迭代 •
沒有⽂件 • 沒有原始碼
⾯對它 - Legacy • 年代久遠 • 結構龐⼤ • 經歷多次迭代 •
沒有⽂件 • 沒有原始碼 -FHBDZ Ⴉᗇ
None
先從重要的開始
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 4 Native Custom Extension PHP
Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 4 1.3 4.1.2 PHP 5 Native Custom Extension PHP Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 2.2 5.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 5 Native Custom Extension PHP Extension Custom Software 6
Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 2.2 5.2.17 Part 3 - ⾯對它 - 下⼀⽬標? PHP 7.3 Native Custom Extension PHP Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 .3
PHP 7.3 Native Custom Extension PHP Extension Custom Software 6
Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 .3 Part 3 - ⾯對它 - 下⼀⽬標? • 升級 PHP 到 PHP 7 • 導入 ORM • 如果可能導入 Laravel 作 為後端核⼼ • 作業系統升級 • 資料庫版本升級
PHP 7.3 Native Custom Extension PHP Extension Custom Software 6
Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 .3 Part 3 - ⾯對它 - 下⼀⽬標? • 升級 PHP 到 PHP 7 • 導入 ORM • 如果可能導入 Laravel 作 為後端核⼼ • 作業系統升級 • 資料庫版本升級
Part 3 - ⾯對它 - 升級 PHP 7.3 • Use
Register Global 問題 • PHP 7.3 語法相容 • Custom Extension PHP 7.3 Native Custom Extension PHP Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 .3
Part 3 - 處理它 - 升級 PHP 7.3 • ⼤量修正使⽤
Register Global 問題
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.3 Native Custom Extension PHP Extension Custom Software 6
Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 .3 下⼀⽬標? PHP 7.4 Native Custom Extension PHP Extension Software Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8
Part 4 - 導入 Laravel 需要? • 使 Laravel ⽀援
DBMaker • 非 Laravel 架構的原始碼處 置 • 檔案上傳儲存機制調整 PHP 7.4 Native Custom Extension PHP Extension Software Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8
Part 4 - 使 Laravel ⽀援 DBMaker • 使 Eloquent
能夠⽀援 DBMaker,建立 Eloquent Driver
Part 4 - 使 Laravel ⽀援 DBMaker • 使 Eloquent
能夠⽀援 DBMaker,建立 Eloquent Driver https://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 置入開發⽇常 • 建立程式碼格式的團隊規則共識
• 減少不必要的 Commit 留存
Part 5 - 程式碼品質持續改善 • Code Lint 置入開發⽇常 • 建立程式碼格式的團隊規則共識
• 減少不必要的 Commit 留存
Part 5 - 程式碼品質持續改善 • Code Lint 置入開發⽇常 • 程式碼品質資料蒐集、討論
• 在 GitLabMerge Request Highlight
Part 5 - 程式碼品質持續改善 • Code Lint 置入開發⽇常 • 程式碼品質資料蒐集、討論
• 在 GitLabMerge Request Highlight
Part 5 - 程式碼品質持續改善 • Code Lint 置入開發⽇常 • 程式碼品質資料蒐集、討論
• 在 GitLabMerge Request Highlight
Part 5 - 程式碼品質持續改善 • Code Lint 置入開發⽇常 • 程式碼品質資料蒐集、討論
• 在 GitLabMerge Request Highlight
Part 5 - 程式碼品質持續改善 • Code Lint 置入開發⽇常 • 程式碼品質資料蒐集、討論
• 在 GitLabMerge Request Highlight
Part 5 - 程式碼品質持續改善 • Code Lint 置入開發⽇常 • 程式碼品質資料蒐集、討論
• 在 GitLab Merge Request Highlight
Part 5 - 程式碼品質持續改善 • Code Lint 置入開發⽇常 • 程式碼品質資料蒐集、討論
• 在 GitLab Merge Request Highlight
Part 5 - 程式碼品質持續改善 • Code Lint 置入開發⽇常 • 程式碼品質資料蒐集、討論
• 在 GitLab Merge Request Highlight
Part 5 - 程式碼品質持續改善 • Code Lint 置入開發⽇常 • 程式碼品質資料蒐集、討論
• 在 GitLab Merge Request Highlight
Part 6 - 程式碼品質主動監控
Part 6 - 程式碼品質主動監控 • 搭配 Laravel Logging 主動通知服務執⾏異常
Part 6 - 程式碼品質主動監控 • 搭配 Laravel Logging 主動通知服務執⾏異常
Part 6 - 程式碼品質主動監控 • 搭配 Laravel Logging 主動通知服務執⾏異常 •
PHP SAST(static application security testing)
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 4 Native Custom Extension PHP
Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 4 1.3 4.1.2
Part 8 - 持續改善 PHP 4 Native Custom Extension PHP
Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 4 1.3 4.1.2 PHP 5 Native Custom Extension PHP Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 2.2 5.2.17
Part 8 - 持續改善 PHP 4 Native Custom Extension PHP
Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 4 1.3 4.1.2 PHP 5 Native Custom Extension PHP Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 2.2 5.2.17 PHP 7.3 Native Custom Extension PHP Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 .3
Part 8 - 持續改善 PHP 4 Native Custom Extension PHP
Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 4 1.3 4.1.2 PHP 5 Native Custom Extension PHP Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 2.2 5.2.17 PHP 7.3 Native Custom Extension PHP Extension Custom Software 6 Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.1 .3 PHP 7.4 Native Custom Extension PHP Extension Software Database Project Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8
PHP 7.4 Native Custom Extension PHP Extension Software Database Project
Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8 Part 8 - 持續改善
PHP 7.4 Native Custom Extension PHP Extension Software Database Project
Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8 Part 8 - 持續改善 • ⼤型範圍重構需⼀點⼀滴 的改善及累積
PHP 7.4 Native Custom Extension PHP Extension Software Database Project
Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8 Part 8 - 持續改善 • ⼤型範圍重構需⼀點⼀滴 的改善及累積 • ⼤⽬標需要切割成⼩⽬標
PHP 7.4 Native Custom Extension PHP Extension Software Database Project
Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8 Part 8 - 持續改善 • ⼤型範圍重構需⼀點⼀滴 的改善及累積 • ⼤⽬標需要切割成⼩⽬標 • 團隊需要有共識的作取捨
PHP 7.4 Native Custom Extension PHP Extension Software Database Project
Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8 Part 8 - 持續改善 • ⼤型範圍重構需⼀點⼀滴 的改善及累積 • ⼤⽬標需要切割成⼩⽬標 • 團隊需要有共識的作取捨 • 如果可能,重構要盡早
PHP 7.4 Native Custom Extension PHP Extension Software Database Project
Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8 Part 8 - 持續改善 • ⼤型範圍重構需⼀點⼀滴 的改善及累積 • ⼤⽬標需要切割成⼩⽬標 • 團隊需要有共識的作取捨 • 如果可能,重構要盡早
PHP 7.4 Native Custom Extension PHP Extension Software Database Project
Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8 我們的下⼀⽬標?
PHP 7.4 Native Custom Extension PHP Extension Software Database Project
Backend Frontend HTML, JavaScript, PHP ODBC Driver 5.4 .4 8 我們的下⼀⽬標? PHP 8.2 Native Custom Extension PHP Extension Software Project Backend Frontend HTML, JavaScript, PHP ODBC Driver .2 9
我們的 GitLab CI
我們的 GitLab CI
今天跟⼤家介紹的 GitLab CI
今天跟⼤家 Demo 的 GitLab CI 範例 https://gitlab.com/mo-playground/laravel-vue-conf-taiwan-2022-gitlabci-example/
軟體開發 版本規劃 組譯 測試 產品釋出 發佈部署 維運 監控
Summary https://twitter.com/markbrooks/status/1573286323515170816/photo/1
Summary https://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