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
コンテナをたくさん詰め込んだシステムとランタイムの変化
makihiro
1
130
採用事例の少ないSvelteを選んだ理由と それを正解にするためにやっていること
oekazuma
2
1k
Scalaから始めるOpenFeature入門 / Scalaわいわい勉強会 #4
arthur1
1
330
暇に任せてProxmoxコンソール 作ってみました
karugamo
2
720
Keeping it Ruby: Why Your Product Needs a Ruby SDK - RubyWorld 2024
envek
0
190
Spatial Rendering for Apple Vision Pro
warrenm
0
110
tidymodelsによるtidyな生存時間解析 / Japan.R2024
dropout009
1
790
クリエイティブコーディングとRuby学習 / Creative Coding and Learning Ruby
chobishiba
0
3.9k
CSC305 Lecture 26
javiergs
PRO
0
140
17年周年のWebアプリケーションにTanStack Queryを導入する / Implementing TanStack Query in a 17th Anniversary Web Application
saitolume
0
250
Итераторы в Go 1.23: зачем они нужны, как использовать, и насколько они быстрые?
lamodatech
0
800
数十万行のプロジェクトを Scala 2から3に完全移行した
xuwei_k
0
270
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
665
120k
What's in a price? How to price your products and services
michaelherold
243
12k
Facilitating Awesome Meetings
lara
50
6.1k
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
28
2.1k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
159
15k
Speed Design
sergeychernyshev
25
670
Building Applications with DynamoDB
mza
91
6.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
GraphQLとの向き合い方2022年版
quramy
44
13k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
251
21k
Making the Leap to Tech Lead
cromwellryan
133
9k
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