看板 Soft_Job 關於我們 聯絡資訊
這篇來聊 CI (Continuous integration) 的導入須知, 什麼是 CI ,中文常見是翻"持續整合"。 (也有人是 CI / CD 持續整合/持續交付 並稱, 我以下都只說 CI,但涵蓋是 CI/CD。) 雖然是一個常見而且通用的概念, 我個人覺得因為名字不太好懂,很多人還是一知半解。 DevOps 很大一部分的工作會跟這題有關, 這個詞的發展就我接觸的順序早 DevOps 不少。 這十年來有些詞彙的發展先後不一, 都是根據當時的市場跟分工需求,定義上有些混亂。 -------- CI 最基本的概念,至少包含, 把一個專案從 source code ,到他真的上服務, 這一段 flow 中間的自動化。 換言之, checkout 自動,build 自動, local(nightly) release 自動,deploy 自動。 很多人對這題可能認知的只有build專案的服務。 雖然最早 CI 其實是搭配 test ,因為持續發布持續測試, 所以在每個版本可以迅速找到"假設"被破壞的地方回饋。 不過國內撰寫測試風氣不發達, 真的做到測試能涵蓋到確保安全的地方,就我所見不多。 但即使如此,build 仍然是過版失誤中,相當常見的主因, 諸如 build 錯版本,丟錯版本,丟錯地方,下錯環境參數等等。 CI 在 build 自動化的優點在於, 只要設定好一個已經變化不大的 build process 。 剩下的要出錯的機率很低, 因為機器基本上都是 step by step process。 一般來說,做好 CI 有幾個好處: 1. build 版不用倚賴特定工程師的腦內思維,把工程師的中斷減少(不會被叫去過版或buil 2. 設定即文件,而且是活的文件 3. 為測試整合打好基礎 4. 減少測試環境的過版負擔 5. 能夠提供水平角色(pm/qa) 自動存取最新 build 的資料, 包括 web / app / 各類執行檔。 有些專案甚至是每天對外發 nightly version , 就是個典型 CI 流程的特徵。 ---------- 目前圈內常見的 CI 手段, 最基本的大概是定期跑排程,一些 batchjob 勉勉強強就算數了。 其他常見工具包括 jenkins (前身為 hudson),Travis CI , travis CI 的優點是跟 github 無縫整合。 可能還有一些其他的,我自己是比較習慣用 jenkins 。 也不是他特別好還是怎樣,從早期就一直用到現在懶得改, 另外是步驟都可以 shell base , 換言之你能用指令做到的就能用他做,我是用的很習慣。 另外 azure devop 也有提供 pipeline & release, 可以做對應的事情,不過 azure 封裝的比較多, 用起來我自己是覺得跟 jenkins 風格大異其趣。 -------- 導入時的第一個問題,build 的環境處理: 當你裝好 jenkins ,他就是個 web server , 然後你可以使用該台 server 上的環境進行建置。 也可以建多台 slave ,到別台機器上去建置。 (比方說某些有平台相依的,ex. mac vs windows) 建置時有些工具需要分開安裝, 如 build android 需要 android sdk , build .net framework 需要 msbuild。 dotnet core 需要 dotnet core runtime 。 除了像 azure pipeline 有提供線上能 build 的機器(要收錢), 其他大部分都是得自己搞定。 另外要留意一件事情是為了隔離性, CI 的執行使用者通常不是我們進入操作的高權限帳號, 一開始的各類設定,檔案權限處理,通常會花一點力氣。 --------- 第二個常碰到的問題,在於不熟悉指令建置的 input output 。 比方說微軟體系的 msbuild ,多數人可能用過 vs 的發布工具, 但對 msbuild 怎麼用不熟。 其實能用 vs 做到的都能用 msbuild 做到, 但有時需要鑽過茫茫複雜設定海。 另外就是 build 出來的 package 在哪,有時候需要找, 有些專案設定甚至會影響 build 的結果。 要留意跟團隊溝通有變化時要更新對應的 build 設定。 像是 android 有些人會改 gradle 設定檔,加入檔名的變化, 這個設定如果 build 那邊沒考慮到就會事倍功半。 --------- 第三個常碰到的問題,在於權限管理的模型設定, 有些地方是採取集中建置的策略, 有些地方是讓工程師各自建置的策略。 其中特別需要的部分, 是把測試環境跟建置環境的權限分開。 另外設定檔的保存,不要讓沒有權限的人, 存取到超過他權限的設定檔也是重要課題之一。 ----------- 第四題跟第三題有點重疊,在於各類環境設定的處理。 目前主流有幾派,一個是設定在 os 的環境變數。 (台灣我是非常少看到有專案這樣做) 一個是獨立保管設定檔, 但保管在哪這點目前無標準化,就我看到大家都是各做各的。 如找個 private blob (or s3) 放之類的, 也有人是交給 ansible 之類的發布作業接手。 ----------- 常見的問題還包括討厭的跨專案間的相依問題, 比方說某專案需要某建置工具的 A 版本, 另一個專案需要某建置工具的 B 版本。 有時候會需要費心去處理版本的 bin 指定跟環境安裝。 ---------- 最後因為每次建置,大多數預設的情況, 我們會保留 workspaces 跟 output file 。 所以如果專案 build 出來的東西不幸比較肥, 那可能會常常把伺服器的空間塞爆, 這裡的空間管理就會是問題。 常見做法是直接接到外部的 file service 做保存。 ---------- CI 有時候大家會開始設定 trigger ,可能 A 專案建置完之後,要跟著整套建完上測試之類的。 當單一建置時間太常,團隊人又多時,有可能會導致建置服務的塞車。 我們可能也要留意設定上,設定是不是適當的, 舉例,每次都需要 clone 整個專案嗎? 還是只需要取最新版就好。 每次都要重裝相依性套件嗎?(ex. maven , npm , nuget ) 能不能 local cache ,或是內部有個 cache service, 有些設定在 build 時,會需要稍微調校來加快效能。 總之,很多人覺得自動化建置,等於再久也沒關係, 實務經驗來說,我覺得還是得追求建置速度, 快速反應,快速前進。 還有一些相對比較不多人關心的問題, build fail 的處理要怎麼安排,這些就是有空再說了。 我個人會建議,有機會的話,多瞭解一些發布流程如何自動化, dotnet 工程師看看 msbuild 跟 dotnet(core) . android 玩一玩 ./gradlew assembleRelease signapk 怎麼指令化操作 ios 玩一玩 xcode 對自己手邊專案的掌握跟理解都會比較上升。 有時候也可以幫自己省下不少時間, 省下多一點的時間,不管是要混要認真, 還是要在週末上網寫廢文,都會比較有時間。(笑) ----- Sent from JPTT on my Google Pixel 3 XL. -- I have a dream, it's silly but beautiful. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.167.67.203 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/Soft_Job/M.1598230146.A.8A1.html
ckp4131025: 推 08/24 08:55
jerryshadow: 推 08/24 09:02
imchou239: (不會'背'叫去過版或build) -> 應為"被" 08/24 09:16
已修正,謝啦 ※ 編輯: TonyQ (114.136.135.6 臺灣), 08/24/2020 09:28:58 ※ 編輯: TonyQ (114.136.135.6 臺灣), 08/24/2020 09:29:19 ※ 編輯: TonyQ (114.136.135.6 臺灣), 08/24/2020 09:29:34
virgil246: 推 08/24 09:31
bbbgreentea: 推 08/24 09:52
brian80122: 推 08/24 09:56
et84121: 推 08/24 10:54
AgileSeptor: 推 08/24 10:58
black2575: 推 08/24 11:31
shooter555: 我是用gitlab-ci, 重裝相依套件應該很難避免, 畢竟要 08/24 13:16
shooter555: 維持自動化的話 08/24 13:18
shooter555: 要不然就是固定依賴的套件 先備份一份docker image重 08/24 13:24
shooter555: 複使用? 08/24 13:25
knives: gitlab的話,不是有cache可以用嗎 08/24 13:45
shooter555: 對喔 docker image本身在重建好像也有cache 煩惱這個 08/24 13:51
shooter555: 好像多餘了 08/24 13:51
是說幾個朋友在FB說, 覺得 CI 跟 build 還是有差, 欸 我覺得原則上同意, 因為 build 只是基礎的一環. 至於有了自動 build 是不是就能達到持續整合的精神, 比方說雖然有 build server 但還是每個月 build 一次. 那樣就不能說有持續整合的精神. 這我同意啦 只是說論述總有遠近, 要講到持續整合這個架構, 能進入的人又少太多了. XDDD (啊是說你們自己來回啊. = =) ※ 編輯: TonyQ (210.61.209.201 臺灣), 08/24/2020 14:15:18
shooter555: 整個CI的主體應該是在Linter身上 0.0 08/24 14:27
meokay: 謝謝分享 08/24 15:36
wayne0530: 推 08/24 15:49
blackcan: 感謝分享!!! 08/24 17:53
hellomotogg: fastlane還蠻好玩ㄉ 08/24 19:53
wulouise: 從沒有到有至少是一個進步 08/24 20:16
ice0803: 感謝分享 08/24 20:51
day831231: 提供執行檔這些不是屬於CD的範圍嗎? 08/24 21:20
TonyQ: 樓上請看本文第三四行 XD 08/24 22:03
landlord: 朋友:PTT上鯊魚環伺,不小心流點血就會被圍起來咬了 08/24 22:36
kennedy1024: 推! 08/24 22:36
clamperni: VVVVVVVVVVVVVVVV 08/25 00:06
joery: 大力的推,感謝分享 08/25 08:08
SFV650: 感謝分享 08/25 08:16
shooter555: CI看起來就像是統整之前的一些流程 給他一個名詞 08/25 09:05
shooter555: 補個推 08/25 09:13
SoftwareSing: 建置速度慢一點才能看著 pipeline 發呆啊 (X 08/25 12:08
GLaDOS1105: 看著 pipeline 發呆不知道為什麼有種強烈的吸引力 08/25 13:41
unmolk: 推 最近跟lab一起做專案才學到CI/CD的概念 不然平常只會寫 08/25 23:35
unmolk: 完慢慢deploy 有夠浪費時間 08/25 23:35
unmolk: 話說tony大最近產出好多篇分享文XD最近比較多時間嗎 08/25 23:35
戰是寫文的原動力 XD
superpandal: 這東西感覺如果自己想方便一點就創的出來 專門提無非 08/26 00:23
superpandal: 要交流 08/26 00:23
kaitokid1214: 好文 推個 08/26 11:22
※ 編輯: TonyQ (118.167.72.246 臺灣), 08/27/2020 05:38:45