Upgrade to Pro — share decks privately, control downloads, hide ads and more …

GitLab CI 從團隊導入到運用

Ab628671841774343b1020f22f712069?s=47 mouson
September 27, 2020

GitLab CI 從團隊導入到運用

這份簡報分為兩個部分:

第一部分怎麼讓一個完全沒有原始碼版本控制的大型專案,逐步的轉變,陸續導入 GitLab 的各種功能,直到現在專案已經有了自己的 CI/CD 流程。這期間期間當然包含了一些政治面、商業面的因素,但整體經歷了哪些事情呢?在這部分會跟大家聊聊這段故事。

第二部分,在使用及導入 GitLab 的過程中,隨著專案演進 .gitlab.yml 定義的流水線 pipeline 上有越來越多工作,怎麼讓工作流程進行的更快一些呢?又,可以怎麼整理 .gitlab.yml 檔,讓他更簡潔一些?在這部分將跟大家分享一些小技巧。

內容中所用到的 source code 如下:
https://gitlab.com/mouson-gitlab-playground/gitlab-ci-demo-sample

可透過切換分支進行查看

Ab628671841774343b1020f22f712069?s=128

mouson

September 27, 2020
Tweet

Transcript

  1. GitLab CI 從團隊導入到運⽤ 墨嗓 (陳佑⽵) 2020/09/27 @ GitLab Taipei User

    Group
  2. About Me • 陳佑⽵,朋友都叫我墨嗓 (Mouson)。專注於資訊科技整 合、應⽤、開發⽅法及研究的T 型⼈,現任 PHP 資訊系統分析 師/⼈夫/⼀隻臘腸狗的爸爸/通⽤

    設計(Universal Design)推廣。 平時喜好⽻球、登⼭及⼿沖咖 啡。 • mouson@gmail.com • https://fb.me/mouson
  3. Part I 團隊如何導入 GitLab ?

  4. 請問:⽬前團隊 有在使⽤ GitLab 的?

  5. 請問:⽬前團隊 有在使⽤ GitLab CI 的?

  6. 進入正題

  7. ⼤綱 Image Src: https://pixabay.com/vectors/evolution-charles-darwin-man-296584/ ⽯器時代 銅器時代 機器時代 資訊時代

  8. ⽯器時代 Image Src: https://pixabay.com/vectors/evolution-charles-darwin-man-296584/ ⽯器時代 銅器時代 機器時代 資訊時代

  9. 世成科技

  10. ⽯器時代 - 時代記憶 • 專案有數⼗萬⾏原始碼 • 經歷多次團隊迭代 • 版本控制系統已損毀 •

    沒有系統⽂件 • 部分執⾏程式沒有原始碼
  11. ⽯器時代 - 跨時代⾨檻 • 導入 Issue Tracking System • 導入版本控管機制

  12. ⽯器時代 - 考古遺跡 • PHP 4.1.2 / Apache 1.3 •

    單 PHP 原始碼超過 1,000隻,總⾏數超過 20 萬 • 核⼼為 C 編寫的 PHP Extension • 使⽤非常⾒的商⽤資料庫
  13. 版本控制系統 團隊選擇考量 • 希望可以提供 CI/CD 等配套⽅案 • 有免費/付費雙⽅案 • 可⾃架

    self-host • 好管理
  14. None
  15. 銅器時代 Image Src: https://pixabay.com/vectors/evolution-charles-darwin-man-296584/ ⽯器時代 銅器時代 機器時代 資訊時代

  16. 銅器時代 - 時代記憶 • Issue Tracking System - Redmine •

    版本控制系統 - GitLab • 沒有系統⽂件 • 部分執⾏程式沒有原始碼
  17. 銅器時代 - 跨時代⾨檻 • 導入單元測試 • 以單元測試描述新功能規格之能⼒

  18. 銅器時代 - 考古遺跡 • 透過功能調整需求,了解系統結構、架構 • 初步升級 PHP 5.2.17 及部分核⼼元件

    • 依然沒有 namespace • 依然沒有 PHP Package 可以引入使⽤
  19. 機器時代 Image Src: https://pixabay.com/vectors/evolution-charles-darwin-man-296584/ 銅器時代 機器時代 資訊時代 ⽯器時代

  20. 機器時代 - 時代記憶 • 部分系統⽂件建立 • 部分執⾏程式沒有原始碼

  21. 機器時代 - 跨時代⾨檻 • 持續整合、部署 等⾃動化機制導入 • PHP 版本升級⾄ PHP

    7
  22. 機器時代 - 考古遺跡 • 導入單元測試,以測試描述規格 • 導入 TDD 進⾏功能開發 •

    持續針對核⼼演算法重構、補上測試 • 透過 GitLab CI/CD 完成⾃動化測試 • 增加線上 Code Review 流程
  23. 機器時代 - 榮耀紀錄 • 持續累積研發團隊 Credit • 錯了代表以測試案例描述的規格還不完整 • 補測試後就不會再錯,不再改

    A 壞 B
  24. 機器時代 - 榮耀紀錄 • 持續累積研發團隊 Credit • 錯了代表以測試案例描述的規格還不完整 • 補測試後就不會再錯,不再改

    A 壞 B
  25. 機器時代 - 榮耀紀錄 • 持續累積研發團隊 Credit • 錯了代表以測試案例描述的規格還不完整 • 補測試後就不會再錯,不再改

    A 壞 B • 程式⼜算錯了!
  26. 機器時代 - 榮耀紀錄 • 持續累積研發團隊 Credit • 錯了代表以測試案例描述的規格還不完整 • 補測試後就不會再錯,不再改

    A 壞 B • 不太可能是程式寫錯, 應該是客⼾設定錯誤 • 程式⼜算錯了!
  27. 資訊時代 Image Src: https://pixabay.com/vectors/evolution-charles-darwin-man-296584/ ⽯器時代 銅器時代 機器時代 資訊時代

  28. 資訊時代 - 不退步⾨檻 • 導入持續部署機制 • 持續進化、持續改善 • 讓團隊習慣讓⾃⼰更好、更強

  29. 凡不能殺死你的,最終都會 使你更強⼤ What Doesn't Kill You Makes You Stronger Turning

    Bad Breaks Into Blessings 威廉·尼采 Wilhelm Nietzsche
  30. Part I:Q&A

  31. Part II GitLab 運⽤

  32. Part II:GitLab 運⽤ • 怎麼讓流⽔線 (Pipeline) 更快⼀點? • 可以怎麼整理 .gitlab-ci.yml

    檔?
  33. 怎麼讓流⽔線 (Pipeline) 更快⼀點?

  34. 流⽔線加速三原則

  35. 流⽔線加速三原則 • ⼯作 少做點

  36. 流⽔線加速三原則 • ⼯作 少做點 • 事情 作快點

  37. 流⽔線加速三原則 • ⼯作 少做點 • 事情 作快點 • 作事的 多⼀點

  38. 流⽔線 Pipeline 啟動到結束 哪些地⽅花了時間?

  39. 拆解

  40. .gitlab-ci.yml

  41. .gitlab-ci.yml Job Job Job Job Job Job Job Queue

  42. .gitlab-ci.yml Job Job Job Job Job Job Job Queue Runner

    Server Runner Server Runner Server Runner Runner Runner Runner
  43. .gitlab-ci.yml Job Job Job Job Job Job Job Queue Runner

    Server Runner Server Runner Server Runner Runner Runner Runner Run Job ____________________________
  44. .gitlab-ci.yml Job Job Job Job Job Job Job Queue

  45. •什麼⼯作先作比較好? .gitlab-ci.yml Job Job Job Job Job Job Job Queue

  46. 什麼⼯作先做比較好?

  47. 什麼⼯作先做比較好? • 跑的快的⼯作

  48. 什麼⼯作先做比較好? • 跑的快的⼯作 • 早點做完早點確認結果

  49. 什麼⼯作先做比較好? • 跑的快的⼯作 • 早點做完早點確認結果 • 有決定性的⼯作

  50. 什麼⼯作先做比較好? • 跑的快的⼯作 • 早點做完早點確認結果 • 有決定性的⼯作 • 沒通過直接 Reject

  51. •什麼⼯作先做比較好? .gitlab-ci.yml Job Job Job Job Job Job Job Queue

  52. •什麼⼯作先做比較好? •每個⼯作都是該做的嗎? .gitlab-ci.yml Job Job Job Job Job Job Job

    Queue
  53. 每個⼯作都是該做的嗎?

  54. 每個⼯作都是該做的嗎? • 同⼀專案中包含前端及後端的測試

  55. 每個⼯作都是該做的嗎? • 同⼀專案中包含前端及後端的測試 • 可以考慮對應原始碼變更才執⾏對應的測試

  56. 每個⼯作都是該做的嗎? • 同⼀專案中包含前端及後端的測試 • 可以考慮對應原始碼變更才執⾏對應的測試

  57. •什麼⼯作先做比較好? •每個⼯作都是該做的嗎? .gitlab-ci.yml Job Job Job Job Job Job Job

    Queue
  58. •什麼⼯作先做比較好? •每個⼯作都是該做的嗎? •有沒有⼯作花太久時間等 待進 Queue ? .gitlab-ci.yml Job Job Job

    Job Job Job Job Queue
  59. ⼯作花太久時間等待進 Queue?

  60. ⼯作花太久時間等待進 Queue? build test deploy build_a test_a deploy_a build_b test_b

    deploy_b build_c test_c deploy_c
  61. ⼯作花太久時間等待進 Queue? build test deploy build_a test_a deploy_a build_b test_b

    deploy_b build_c test_c deploy_c build_b
  62. ⼯作花太久時間等待進 Queue? build test deploy build_a test_a deploy_a build_b test_b

    deploy_b build_c test_c deploy_c build_b
  63. ⼯作花太久時間等待進 Queue? • 套⽤ DAG 機制 (GitLab 12.2) build test

    deploy build_a test_a deploy_a build_b test_b deploy_b build_c test_c deploy_c build_b
  64. ⼯作花太久時間等待進 Queue? • 套⽤ DAG 機制 (GitLab 12.2) build test

    deploy build_a test_a deploy_a build_b test_b deploy_b build_c test_c deploy_c build_b
  65. ⼯作花太久時間等待進 Queue? • 套⽤ DAG 機制 (GitLab 12.2) build test

    deploy build_a test_a deploy_a build_b test_b deploy_b build_c test_c deploy_c build_b
  66. .gitlab-ci.yml Job Job Job Job Job Job Job Queue

  67. .gitlab-ci.yml Job Job Job Job Job Job Job Queue Runner

    Server Runner Server Runner Server Runner Runner Runner Runner
  68. Job Job Job Job Job Job Job Queue Runner Server

    Runner Server Runner Server Runner Runner Runner Runner
  69. Job Job Job Job Job Job Job Queue Runner Server

    Runner Server Runner Server Runner Runner Runner Runner
  70. •可以取得⼯作的 Runner 夠 嗎? Job Job Job Job Job Job

    Job Queue Runner Server Runner Server Runner Server Runner Runner Runner Runner
  71. •可以取得⼯作的 Runner 夠 嗎? •可以有更多 Runner 嗎? Job Job Job

    Job Job Job Job Queue Runner Server Runner Server Runner Server Runner Runner Runner Runner
  72. •可以取得⼯作的 Runner 夠 嗎? •可以有更多 Runner 嗎? •Runner Server 可以同步執

    ⾏ Runner 嗎? Job Job Job Job Job Job Job Queue Runner Server Runner Server Runner Server Runner Runner Runner Runner
  73. Job Job Job Job Job Job Job Queue Runner Server

    Runner Server Runner Server Runner Runner Runner Runner
  74. Job Job Job Job Job Job Job Queue Runner Server

    Runner Server Runner Server Runner Runner Runner Runner Run Job ____________________________
  75. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________
  76. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________
  77. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image
  78. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch
  79. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch * package install
  80. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch * package install * download artifacts
  81. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch * package install * download artifacts * script execute
  82. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch * package install * download artifacts * script execute •Network Performance ?
  83. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch * package install * download artifacts * script execute •Network Performance ? •Docker image size ?
  84. Docker Image Size ?

  85. Docker Image Size ?

  86. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch * package install * download artifacts * script execute •Network Performance ? •Docker image size ? •Git Repo Size ?
  87. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch * package install * download artifacts * script execute •Network Performance ? •Docker image size ? •Git Repo Size ? •Programming Language Dependence Package Size ?
  88. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch * package install * download artifacts * script execute •Network Performance ? •Docker image size ? •Git Repo Size ? •Programming Language Dependence Package Size ? •Artifacts Size ?
  89. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch * package install * download artifacts * script execute •Network Performance ? •Docker image size ? •Git Repo Size ? •Programming Language Dependence Package Size ? •Artifacts Size ? •Script Performance ?
  90. Runner Server Runner Server Runner Server Runner Runner Runner Runner

    Run Job ____________________________ * pull docker image * git repo fetch * package install * download artifacts * script execute
  91. .gitlab-ci.yml Job Job Job Job Job Job Job Queue Runner

    Server Runner Server Runner Server Runner Runner Runner Runner Run Job ____________________________ * pull docker image * git repo fetch * package install * download artifacts * script execute
  92. 可以怎麼 整理 .gitlab-ci.yml 檔?

  93. 你會怎麼整理? 針對 ubuntu:20.04 及 ubuntu:18.04 兩個作業系統版本 分別組譯 v1.0、v2.0、v3.0 三個版本

  94. 怎麼整理? 針對 ubuntu:20.04 及 ubuntu:18.04 兩 個作業系統版本 分別組譯 v1.0、v2.0、v3.0 三個版本

  95. 第⼀招 擷取⼀致的 script 變為 default:

  96. 第⼀招 擷取⼀致的 script 變為 default:

  97. 第⼆招 擷取為變數 讓 Script 變成⼀樣

  98. 第⼆招 擷取為變數 讓 Script 變成⼀樣

  99. 第⼆招 擷取為變數 讓 Script 變成⼀樣

  100. 第三招 利⽤ hidden job 整理 job 共同的部分 並使⽤ extends 繼承

  101. 第三招 利⽤ hidden job 整理 job 共同的部分 並使⽤ extends 繼承

  102. 第三招 利⽤ hidden job 整理 job 共同的部分 並使⽤ extends 繼承

  103. 第四招 使⽤ Parallel Matrix GitLab 13.3 提供

  104. 第四招 使⽤ Parallel Matrix GitLab 13.3 提供

  105. 第四招 使⽤ Parallel Matrix GitLab 13.3 提供

  106. 第四招 使⽤ Parallel Matrix GitLab 13.3 提供

  107. 第四招 使⽤ Parallel Matrix GitLab 13.3 提供

  108. Recap • 第⼀招:利⽤ default stage 整理所有 job 都共同的 • 第⼆招:萃取出變數

    • 第三招:利⽤ .hidden 建立模板⼯作,並⽤繼承使⽤ • 第四招:利⽤ Parallel Matrix 功能 • Sample Source Code: https://bit.ly/3mTiBgJ
  109. Sample Code • https://bit.ly/3mTiBgJ

  110. • PHP 後端⼯程師 • Angular 前端⼯程師 WE WANT YOU !!

    https://bit.ly/NovaxJobs
  111. Part II Q&A https://bit.ly/NovaxJobs