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
310
從 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(墨嗓)
Advanced GitLab Workshop - 談 pipeline 調教與進階 GitLab CI 語法
mouson
0
1.1k
GitLab 13~14CICD功能亮點提示-GitLab 10週年線上聚會
mouson
0
760
深入GitLabCI-談描述檔重構與流水線加速
mouson
4
1k
GitLab CI 從團隊導入到運用
mouson
2
770
PHP 升版絕活 - 給你一劑面對 Legacy 專案的還魂丹
mouson
0
570
20190323_ThreeGitTips-台日技術社群交流會
mouson
1
1.2k
用PHP快速建立商品上架通知器 - Star Rocket Meetup EP3
mouson
1
160
20170701 Eloquent 核心解構 讓 Laravel 支援更多資料庫
mouson
3
1.5k
GIT從入門到應用-線上讀書會
mouson
1
1.2k
Other Decks in Programming
See All in Programming
これが俺の”自分戦略” プロセスを楽しんでいこう! - Developers CAREER Boost 2024
niftycorp
PRO
0
190
アクターシステムに頼らずEvent Sourcingする方法について
j5ik2o
4
200
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
120
プロダクトの品質に コミットする / Commit to Product Quality
pekepek
2
770
range over funcの使い道と非同期N+1リゾルバーの夢 / about a range over func
mackee
0
110
これでLambdaが不要に?!Step FunctionsのJSONata対応について
iwatatomoya
2
3.6k
創造的活動から切り拓く新たなキャリア 好きから始めてみる夜勤オペレーターからSREへの転身
yjszk
1
130
Zoneless Testing
rainerhahnekamp
0
120
42 best practices for Symfony, a decade later
tucksaun
1
180
LLM Supervised Fine-tuningの理論と実践
datanalyticslabo
3
1k
CSC509 Lecture 14
javiergs
PRO
0
130
ブラウザ単体でmp4書き出すまで - muddy-web - 2024-12
yue4u
2
460
Featured
See All Featured
Designing Dashboards & Data Visualisations in Web Apps
destraynor
229
52k
jQuery: Nuts, Bolts and Bling
dougneiner
61
7.5k
A designer walks into a library…
pauljervisheath
204
24k
Large-scale JavaScript Application Architecture
addyosmani
510
110k
The Language of Interfaces
destraynor
154
24k
Agile that works and the tools we love
rasmusluckow
328
21k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
The Cult of Friendly URLs
andyhume
78
6.1k
Build The Right Thing And Hit Your Dates
maggiecrowley
33
2.4k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
44
6.9k
A better future with KSS
kneath
238
17k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
191
16k
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