Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
從 Legacy 到 Lovely,用 CI/CD 改建二十年祖產全記錄
Search
mouson(墨嗓)
December 03, 2022
Programming
580
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
440
10 Git Command You Should Start Using Today
mouson
0
150
Advanced GitLab Workshop - 談 pipeline 調教與進階 GitLab CI 語法
mouson
0
1.5k
GitLab 13~14CICD功能亮點提示-GitLab 10週年線上聚會
mouson
0
1k
深入GitLabCI-談描述檔重構與流水線加速
mouson
4
1.3k
GitLab CI 從團隊導入到運用
mouson
2
1k
PHP 升版絕活 - 給你一劑面對 Legacy 專案的還魂丹
mouson
0
750
20190323_ThreeGitTips-台日技術社群交流會
mouson
1
1.5k
用PHP快速建立商品上架通知器 - Star Rocket Meetup EP3
mouson
1
240
Other Decks in Programming
See All in Programming
JPUG勉強会 OSSデータベースの内部構造を理解しよう(第2回)
oga5
0
220
Security issues being discussed on Web Platforms
petamoriken
0
940
GraphRAGのKnowledge Graphを 直接!見る/View-GraphRAG's-KnowledgeGraph-directly!
tyumugi1113
1
320
そのリトライ、死んだコネクションを使い回していませんか ── GoのHTTPクライアントとHTTP/2を実プロダクト障害から学び直す
myus4a
0
140
XHTMLが残したもの
yosuke_furukawa
PRO
2
800
A2UI for Android: Safely Rendering AI-Generated UI with Jetpack Compose - DroidKaigi 2026
itsmedreamwalker
0
140
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
620
Family mrubyの進捗
kishima
1
120
cdk deploy JawsSonic #MARATHONしながらAWSリソースをデプロイしてみよう
akihisaikeda
2
130
アクセシビリティから考える情報設計
high_g_engineer
0
380
Claude Codeを組織的に動かして月400PRを実現した話
happy_ryo
0
280
AHC070解法紹介
eijirou
0
120
Featured
See All Featured
We Are The Robots
honzajavorek
0
370
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
The Curse of the Amulet
leimatthew05
3
14k
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Technical Leadership for Architectural Decision Making
baasie
3
570
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
203
76k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
3
1.2k
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
10
1.3k
Test your architecture with Archunit
thirion
2
2.4k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
480
Pawsitive SEO: Lessons from My Dog (and Many Mistakes) on Thriving as a Consultant in the Age of AI
davidcarrasco
0
240
Sam Torres - BigQuery for SEOs
techseoconnect
PRO
0
540
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