[心得] CI 的使用注意事項
這篇來聊 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 版不用倚賴特定工程師的腦內思維,把工程師的中斷減少(不會被叫去過版或buil2. 設定即文件,而且是活的文件
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.
--
推
推
(不會'背'叫去過版或build) -> 應為"被"
已修正,謝啦
※ 編輯: 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推
推
推
推
推
推
我是用gitlab-ci, 重裝相依套件應該很難避免, 畢竟要
維持自動化的話
要不然就是固定依賴的套件 先備份一份docker image重
複使用?
gitlab的話,不是有cache可以用嗎
對喔 docker image本身在重建好像也有cache 煩惱這個
好像多餘了
是說幾個朋友在FB說, 覺得 CI 跟 build 還是有差, 欸 我覺得原則上同意, 因為 build 只是基礎的一環. 至於有了自動 build 是不是就能達到持續整合的精神, 比方說雖然有 build server 但還是每個月 build 一次. 那樣就不能說有持續整合的精神. 這我同意啦 只是說論述總有遠近, 要講到持續整合這個架構, 能進入的人又少太多了. XDDD (啊是說你們自己來回啊. = =)
※ 編輯: TonyQ (210.61.209.201 臺灣), 08/24/2020 14:15:18整個CI的主體應該是在Linter身上 0.0
謝謝分享
推
感謝分享!!!
fastlane還蠻好玩ㄉ
從沒有到有至少是一個進步
感謝分享
提供執行檔這些不是屬於CD的範圍嗎?
樓上請看本文第三四行 XD
朋友:PTT上鯊魚環伺,不小心流點血就會被圍起來咬了
推!
VVVVVVVVVVVVVVVV
大力的推,感謝分享
感謝分享
CI看起來就像是統整之前的一些流程 給他一個名詞
補個推
建置速度慢一點才能看著 pipeline 發呆啊 (X
看著 pipeline 發呆不知道為什麼有種強烈的吸引力
推 最近跟lab一起做專案才學到CI/CD的概念 不然平常只會寫
完慢慢deploy 有夠浪費時間
話說tony大最近產出好多篇分享文XD最近比較多時間嗎
戰是寫文的原動力 XD
這東西感覺如果自己想方便一點就創的出來 專門提無非
要交流
好文 推個
91
Re: [討論] 對岸的軟體工程師分享一下現在中國公司工作的狀況好了, 程式碼 build 都沒過,是絕對不能回家的,你會害很多人被扣錢。 首先程式碼 commit到分支前,都要設定好jenkins 使用 git push 程式碼到 repository 的分支時, 會觸發CICD流程,大致會執行以下流程:27
[討論] 對岸的軟體工程師本ID在台北一家陸商待過一個月 發現對岸SW RD的整code習慣是這樣 覺得自己寫好了,就commit了 commit之前不做驗證,不初步抓一下bug 連local build pass都沒有20
[情報] Windows 10 21H1定名為May 2021 UpdateWindows 10 21H1定名為May 2021 Update 文/林妍溱 | 2021-04-29發表 微軟宣布今年上半年代號21H1的Windows 10更新,正式定名為May 2021 Update,並在本 周稍早將測試版本釋出給開發人員。 沒有意外的話,Build 19043.928將是Windows 10 May 2021 Update的最終版本。目前這22
[情報] 微軟將改善現有的IME輸入法設計這是在目前Insider Preview上進行的測試項目 與現有的IME相比外觀會更加符合現在的Fluent Design框架和美學設計,同時也改善預覽 字體的大小、輸入時能直接轉化成Emoji和更多互動(例如直接從列表刪除候選字和進行關 鍵字搜尋) 此測試項目是在月中Build 21313加入的,根據微軟說明主流亞洲語系的IME(包含注音)9
Re: [心得] Windows 11 測試版微軟在今天釋出Build 25158。同時也提供25158的iso檔案 在Build 25158中,微軟為工作列的天氣資訊提供提示徽章通知(與Android/iOS的應用程 式通知相似)11
Re: [請益] 請問這樣的git使用方式是否是正確的?個人意見,僅供參考 不太確定常不常見,但看起來是合理的。 可以想到的好處和情況是 不同的service 可以分開Build,Build 之後的artifact 可以依照每個service 的開發進 度deploy 到不同的測試環境,利於不同進度的開發和整合。8
Re: [請益] 如何當軟體QA??之前寫的軟體測試幾個層級,提供參考。 最入門的狀況,Intern/工讀生通常只會碰到這 A. 依照Test Case進行測試。回報Issue,重現步驟 B. 有能力建置測試環境到可以部屬待測軟體。 測試的軟性觀念,這邊開始才真的進入測試的領域。8
Re: [心得] Windows 11 測試版微軟在今天發布Build 25211。在Build 25211中提供Widgets的一些客製化選項,例如: 是否在游標移動至圖標時顯示Widgets、是否在工作列顯示天氣和通知標記 同時在工作列的右鍵選單可以叫出工作管理員了,又一個Windows 10既有的功能回歸。2
Re: [心得] Windows 11 測試版微軟在今天釋出Build 25145。主要是解決Suface Pro X從休眠恢復時會黑畫面的問題 ,另一個是改善使用點字朗讀的無障礙體驗 目前Win11的22H2 RTM版本會在帳戶頁面顯示Microsoft 365的訂閱資訊(測試版額外支援 2019&2021買斷版的產品資訊),在Build 25145會額外支援OneDrive付費空間的使用資訊1
Re: [心得] Windows 11 測試版微軟在日前釋出Build 25352 微軟在Build 25352將rs_release變更為zn_release。通常變更新的分支是為了測試一些 新項目來調整開發項目的優先程序。同時在zn_release下會刪除部分尚在測試中的功能, 未來可能會重新加入