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
mouson(墨嗓)
December 03, 2022
Programming
0
400
從 Legacy 到 Lovely,用 CI/CD 改建二十年祖產全記錄
於 Laravel x Vue Conf Taiwan 2022 的演講簡報,主要描述一個多年的 Legacy 專案如何慢慢的演變為現代化框架為基底的專案過程。
mouson(墨嗓)
December 03, 2022
Tweet
Share
More Decks by mouson(墨嗓)
See All by mouson(墨嗓)
10 Git Command You Should Start Using Today
mouson
0
83
Advanced GitLab Workshop - 談 pipeline 調教與進階 GitLab CI 語法
mouson
0
1.3k
GitLab 13~14CICD功能亮點提示-GitLab 10週年線上聚會
mouson
0
870
深入GitLabCI-談描述檔重構與流水線加速
mouson
4
1.1k
GitLab CI 從團隊導入到運用
mouson
2
870
PHP 升版絕活 - 給你一劑面對 Legacy 專案的還魂丹
mouson
0
620
20190323_ThreeGitTips-台日技術社群交流會
mouson
1
1.3k
用PHP快速建立商品上架通知器 - Star Rocket Meetup EP3
mouson
1
180
20170701 Eloquent 核心解構 讓 Laravel 支援更多資料庫
mouson
3
1.6k
Other Decks in Programming
See All in Programming
はじめてのWeb API体験 ー 飲食店検索アプリを作ろうー
akinko_0915
0
140
Modern Angular with Signals and Signal Store:New Rules for Your Architecture @enterJS Advanced Angular Day 2025
manfredsteyer
PRO
0
270
Android 16KBページサイズ対応をはじめからていねいに
mine2424
0
450
MCPを使ってイベントソーシングのAIコーディングを効率化する / Streamlining Event Sourcing AI Coding with MCP
tomohisa
0
170
効率的な開発手段として VRTを活用する
ishkawa
0
160
Claude Code派?Gemini CLI派? みんなで比較LT会!_20250716
junholee
1
540
スタートアップの急成長を支えるプラットフォームエンジニアリングと組織戦略
sutochin26
1
7.3k
AI時代の『改訂新版 良いコード/悪いコードで学ぶ設計入門』 / ai-good-code-bad-code
minodriven
24
9.6k
LT 2025-06-30: プロダクトエンジニアの役割
yamamotok
0
870
iOS 26にアップデートすると実機でのHot Reloadができない?
umigishiaoi
0
140
AI駆動のマルチエージェントによる業務フロー自動化の設計と実践
h_okkah
0
230
テスターからテストエンジニアへ ~新米テストエンジニアが歩んだ9ヶ月振り返り~
non0113
2
220
Featured
See All Featured
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
331
22k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
282
13k
Designing for Performance
lara
610
69k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
The World Runs on Bad Software
bkeepers
PRO
70
11k
Art, The Web, and Tiny UX
lynnandtonic
299
21k
Faster Mobile Websites
deanohume
308
31k
Music & Morning Musume
bryan
46
6.7k
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
26
2.9k
GraphQLの誤解/rethinking-graphql
sonatard
71
11k
A Tale of Four Properties
chriscoyier
160
23k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
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