透過【持續整合】讓軟體的產出更有品質與保障
撰文者: 智慧城鄉處 技發一群 協理 林威佐(Joe)

▲ 開發流程與 CI/CD 之關聯說明
敏捷軟體開發(Agile Software Development),是一種從 1990 年代開始逐漸引起廣泛關注與運用的新型軟體開發方法,能應對需求快速變化的軟體開發能力,強調開發團隊與客戶之間的緊密協作、面對面的溝通比書面的文件更有效、頻繁交付新的軟體版本、成熟且自我管理的組織團隊。總體來說敏捷開發有兩大核心:
1. 擁抱變化
2. 快速迭代
為了達到這種開發模式,一些軟體開發實踐方法與工具也相繼被提出來,其中 CI/CD 被認為是敏捷開發的最重要實踐之一。
持續整合 (CI,Continuous Integration)
在開發過程中,為了快速適應需求變化,常常在很短的週期 (Scrum 大約兩週) 就會發佈一個新版本,在每個產出的新版本中要能驗證是正確且可執行的,為了達到此一目的,我們希望能在每次的原始碼提交後,能夠自動進行系統的建置與測試,並第一時間得到驗證的結果,這個自動化的過程就稱為持續整合 (Continuous Integration),其主要目標是更快發現和解決錯誤、改善軟體品質,還有減少驗證和發行新軟體更新所需的時間。
持續整合的自動化驗證過程可分為以下四個步驟:
- 版本控制 (svn): 持續整合最重要的一步,可以說,沒有版控,就沒有 CI/CD
- 建置 (build):確保提交的程式碼是否可以執行的
- 自動化測試 (test):確保功能正常與軟體品質
- 程式碼分析 (source code analysis):檢查 code style 或程式的穩健度
驗證完成後,進一步可以整合自動化發佈或部署 (Continuous Delivery / Continuous Deployment) 。例如將驗證通過的系統發行至測試環境,讓使用者驗收測試,以達到更高的品質保證。
透過此些流程可以確保軟體品質,不會因為一個錯誤變動而產生錯誤結果或崩潰。同時在驗證過程中,也會產生一些回饋 (報表) 給開發者或其他角色,用來追蹤並改善軟體潛藏的問題。
本文針對在實踐 CI/CD 的過程中,所運用的流程與工具進行經驗分享。
CI/CD 流程

▲ CI/CD 流程示意圖
- 開發者完成一個功能開發後,將原始碼簽入版控系統 (GitLab)
- 版控系統經由 Webhook 自動觸發 CI Server(Jenkins) 進行建置以及測試
-
CI Server 為 CI/CD 執行過程中的核心工具,它會依照流程設定一步步的執行工作,確保每一環節都能正常運作,當有異常時也能發送通知給相關人員,我們設定的主要工作項目有:
◆ 專案建至
◆ 單元測試
◆ 源碼檢測
◆ 系統部署
◆ 結果通知
- 開發者完成一個功能開發後,將原始碼簽入版控系統 (GitLab)
- 每個步驟完成後,不管成功或失敗,皆會發送結果通知 Slack 群組。
- 在所有的檢測通過後,依照發行設定發行一版,等待技術長確認是否要過版至 Stage 環境,供測試人員進行驗收測試
- 驗收人員至 Stage 環境進行功能測試 (UAT)
工具介紹
♦Jenkins
談到 CI,最廣為人知且老牌的工具是 Jenkins。Jenkins 是由 Java 撰寫的開源持續整合工具,可以幫助使用者達成專案建置、測試及部署等階段自動化的目標,是實現測試自動化及持續整合的利器。Jenkins 的功能完整,也提供了上千個外掛 (Plugins) 來對應各種開發語言與工具,是一套可以自訂運用的系統。但也因為其功能強大、客製程度高,上手需要一些時間。然而一旦流程被定義,並整合好相關環境,它可以發揮持續性整合威力,大幅增加開發生產力。總體來說,透過 Jenkins 打理開發流程中的大小事,透過自動化串接起每個階段工作,讓開發人員能專注在最有價值的工作上。
♦GitLab
對 CI/CD 而言,一個好的 Source Control Management 系統也是絕對必要的。版控工具一定是使用 git,至於用哪一套管理系統可以選擇則很多了,知名的有 GitHub、BitBucket、GitLab、TFS 等等,我們則選擇自行安裝 GitLab 管理。GitLab 是一個用於 Git 倉庫管理系統的開源專案,使用 Git 作為程式碼管理工具,並在此基礎上搭建起來的 web 服務,提供團隊完整的開發流程支援,除了基本的版控、Wiki、問題追蹤等常用功能外,近期也整合了 CI/CD 功能,不過我們還是專注在版控的功能,CI 還是交由 Jenkins 控制。
♦SonarQube
在系統軟體開發中,本團隊將採用 OWASP 組織推出的 SonarQube 原始碼檢測系統,SonarQube 起源於 2007 年並專注於提供程式碼品質、風險檢測解決方案,目前支援超過 25 種以上程式語言的開發分析,如 Java,C#,JavaScript,C/C++,TypeScript 以及金融行業的 COBOL 語言等,並能針對 C WE/SANS Top 25 及 OWASP Top 10 等弱點項目加以檢出及產品檢測報告。
開發人員可透過 SonarQube 分析專案中有潛在危險之程式碼片段,並產生測試報告 (PDF 檔案) 供系統開發人員進行修正與程式優化,它提供了高度安全性(Vulnerabilities、SQL injection),可靠度(Bugs) 以及可維護性 (Code Smells )。SonarQube 也提供了 IDE 插件 SonarLint,在編寫程式代碼時可即時顯示問題,因此可以儘早修復它們。
SonarQube 在品質檢測方面主要涉及七個維度:程式碼架構與設計、重複度、單元測試覆蓋率、複雜度、潛在 bug、程式碼撰寫風格及標準、程式碼註釋。我們可以建立適合的品質規則組合 (Quality Profile),在 CI 過程中同時檢測,可大幅縮減人工 Code Review 的時間,並讓程式碼的產出有一致性,是好維護以及高品質的。
♦Slack
Slack 是一套團隊溝通工具,團隊能依照工作內容、專案或任何主題開設頻道,在頻道內能訊息與檔案交流、螢幕共享、進行視訊、釘選重要訊息,提升溝通效率在 CI 。Slack 可以與多數服務進行串接,在 CI 流程中,將原始碼提交、專案建置、測試結果、源碼檢測、部署結果等資訊發布於頻道上,相較於其他的通訊軟體,更能讓團隊專注於專案訊息交流與溝通上
持續精進
- 目前的自動測試只有單元測試,接下來要導入 BDD 的模式,將需求轉化成可測試的文件,搭配 Seleium 等自動化 UI 測試工具,讓 UI 整合測試也能加入 CI 中。
- Docker 容器是個可攜式、輕量級的執行環境,使用 Docker 能統一開發者、測試人員、以及產品的執行環境,避免因環境差異造成的系統問題,並有著快速建置與部屬的優勢,未來可將 Docker 應用整合至 CI 流程中。
結語
持續整合,就是持續改善,每個自動化的環節,都可以進一步優化,透過 CI/CD 的導入,讓團隊理解不足之處,提早發現軟體的缺失並進行改善,持續整合的其中一個重點是自動化,將重覆的動作利用程式的方式自動進行,可減少人為的錯誤,也讓開發人員可以專心於開發上,透過自動化建置、測試、程式碼檢測等讓軟體的產出更有品質與保障。
持續整合的導入不是一蹴可幾的,就算是只有自動建置而沒有測試,也能開始架設 CI Server,讓專案動起來,感受一下 CI 帶來的好處,之後再將其他流程與工具慢慢加入,這也是敏捷開發的實踐。
#WeMakeItAmazing #持續整合 #CI/CD #DevOps