前言
如果你經手的經常是相同類型的專案,或者你是某種程式語言或 Framework 的愛好者,那麼在專案啟動的時候,多半會建立出固定的資料夾結構與檔案;同理,如果你的團隊有穩定的協作方式,在軟體開發流程中,採用了 GitHub Flow 或 GitLab Flow,那麼你可能在專案啟動時,固定會手動建立 main
、develop
、release
等多條 Branch。
無論如何,這些專案啟動的固定起手式,看似稀鬆平常,但累積起來也是會佔用團隊不少時間,再加上這都是一些固定且重複動作,做久了有時也是會覺得有些煩,甚至不小心就漏掉了某個必要的動作。
面對這樣的狀況,我們可以事先建立標準的 GitLab Project templates,讓團隊可以直接運用 Template 來省去這些重複的固定動作。
下面就介紹我曾經在 GitLab 建立 Project Templates 的方法。
付費功能:Custom group-level project templates
首先,如果你是 GitLab 的付費使用者,那麼恭喜你,GitLab 自 11.6 版即提供 Custom group-level project templates 功能。該功能讓我們可以將 Group 底下的所有 Projects 都變成 Templates,方便團隊可以盡情的為各種專案與情境,建立各種 Project Templates。
# 舉例來說,我可以建立一個名為 Project templates 的 Group
# 接著在裡面建立許多的 Project,每個 Project 適用一種情境
Project templates:
## 可能有適用不同 Python 版本的 Tempalte
python 3.9
python 3.10
## 可能有特定 Python 版本 + 特殊情境的 Template
python 3.10 + Data Pipeline
## 可能有常用的 Framework + 特殊情境的 Template
django 5 + shop
laravel 9 + shop
Custom group-level project templates 作為付費功能,用它來建立一個新的 GitLab Project 時,以下的內容都會一起被複製到新的 Project 內。
Files
因此,你可以將固定會用到的檔案與範本,留在 Project template 中,像是
README.md
、.gitlab-ci.yml
、.gitignore
、requirements.txt
固定會用的資料夾結構⋯⋯。Git Branch
如果你有固定的 Git 工作流程,有固定會建立的 Branch,像是
main
、develop
,都可以先在 Project template 建好。Commits
既然 Branch 會一併被複製過去,當然也包含 Branch 上的 Commits。因此在製作 Project template 時,可以順便製作一些示範用的良好 Commits,像是示範一下怎麼撰寫正確的 Commit message。
Tags
和 Branch 及 Commit 相同,Tag 也會被複製。
Issues、 Milestones
這就有點神奇了,Issue 及 Milestone 也會被複製。如果是作為一個新專案啟動,我目前是還沒想到會需要預設建立什麼 Milestone,但 Issue 倒是有機會,例如可以先建好第一個 Issue,叫做「建立專案測試環境」之類的⋯⋯。
Labels
可以將團隊常用的 Labels 事先建好,例如
refactor
、backend
、frontend
⋯⋯。多項 Settings
這些就與 GitLab 的各種功能比較有關,例如:
- General Settings:可以設定 GitLab Project 預設啟用或關閉哪些功能,像是 Wiki、Container registry、Package registry。
- Webhook Settings:如果 GitLab Project 有固定用 Webhook 的方式與其他服務整合,這些設定也都能放進 Template 中。
- Repository Settings:這個就相當實用,可以搭配 Git branch,例如將
main
設為 Default 與 Protected branch。 - Merge Requests Settings:像是如果團隊有規範需要遵守的 Merge request approvals 規則,可以事先設定在 Project Templates 中。
- CI/CD Settings:這也算實用,如果有固定的 GitLab CI/CD 設定,也可以隨著 Template 自動帶入。
Custom group-level project templates 畢竟是付費功能,因此當然是好用且能夠將較多的東西做成 Template。
當你成功設置自己的 Custom group-level project templates 後,當你在 Create New Project 時,就可以在 Create from template 中找到你自己的 Project Template。
Import porject
前面介紹完付費功能,剩下就來聊一聊免費的方案了,首先是 Import project。
在 Create New Project 時,除了 Create blank project、Create from template 之外,還有一個可用的選項是 Import project。
GitLab 接受多種 Import project 的管道,從下圖可以很明顯發現,這個方法主要的目標是讓你從其他地方搬家過來啦!
而這裡我想要分享的是第一個管道 GitLab export / Import an exported GitLab project,至於理由是什麼呢?因為這個方法也能複製 Files、Branches、Commits 以外的東西。
首先,我們一樣可以建立一個 GitLab project 作為 Template,在上面建立 Branches、Commits 與各種 Settings。
接著就利用 Export project 功能將它匯出。 (Export 時,可以匯出很多內容,像是 Wiki、Issue、部分的 Settings。)
Project 會被匯出成 .tar.gz
檔,接著就可以在 Create New Project 時,上傳該檔案將它匯入。
如下圖,實際做一次可以證實,確實如原廠所寫 Project configuration 是可以順利匯出匯入的,下圖就是 Protected branches 有成功匯入。
但這種方法有幾個缺點
- Export project 會需要一段等待的時間,並不是按下 Export 就能立即下載檔案,因此每次更新 Project 後,還要多一個 Export 的步驟與等待時間。
- 建立新 Project 時,要手動上傳那一包 Export 的檔案,因此萬一你的 Project 很肥⋯⋯
Fork project
另一個免費作法是利用 Fork,什麼是 Fork 應該大家都很熟悉了,這裡就不多做說明啦。
如上圖,Fork 的時候有一個選項,你可以選擇是否要複製所有的 Branches。
既然 Branches 會被複製,當然 Commits 也都會一併被複製,但各種 Settings,就無法透過 Fork 的方式一併複製了,所以 Fork 完畢之後,你還是需要自己手動設定像是 Protected branch、Merge request approvals 的規則。
最後,提醒一下如果你想要以 Fork 的方式來建立新 Project,我會建議在 Fork 完成之後,移除新 Project 與原 Project 的 Fork relationship,避免你不小心送 MR 送到原 Project 去喔。 (在 Project 的 General Settings 中可以找到地方 Remove fork relationship。)
GitLab API + 自動化腳本
最後一個免費方法就是利用 GitLab API + 自動化腳本,這個方法我以前在社群 Meetup 曾經簡單提過,簡單來說就是自己組合出一套 Project init 的自動化流程,我當時大致做了以下的事情。
- 建立作為範本的 GitLab Project,該 Project 有 CI Pipeline 會自動建立 Artifact。
- 取得 GitLab API 的 Access Token。
- 撰寫自動化腳本,該腳本會執行以下動作
- 利用 GitLab API 下載 Artifact。
- 利用 GitLab API 建立新 Project。
- 將 Artifact 的內容解壓縮之後,上傳到新 Project 內。
- 在新 Project 建立所需的各個 Branches。
- 利用 GitLab API 設定各項 Project Settings。
- 最後,將新 Project 的 URL 丟到 Slack 中通知我。
有了上述的東西後,最後就串接一下 Slack ChatBot,然後就可以在 Slack 呼叫 Bot 完成 Project init 啦! 這個方法好處當然是 GitLab API 越強大,那可以自動完成的事情就越多;反之缺點就是多一套自動化腳本需要維護,所以如果想要選擇這條路的人,要注意一下會變成同時需要維護 Project 範本 + 自動化腳本 + ChatBot 多個東西喔!
(曾經寫過這樣的 Ansible role,專門用來做 Project init 的動作。)
小結
在這篇文章中,快速介紹了幾個我實際用過可以建立 GitLab Project Templates 的方法,每種方法可以做到的範圍不同,需要花費的成本也不同,畢竟不同的團隊所處的情境也不同,各位可以自行判斷哪種方法比較適合自己。
最後,比起到底要用哪種方式來實現 Project Templates,我更想說的是「幫助團隊省時省力」是一件值得嘗試投資的事情,識別你們工作流程中的「浪費」,透過適度的標準化及規範,讓團隊可以更良好的工作與協作是一件重要的事情,希望大家都能持續改善工作流程,打造出你理想中的高效軟體開發團隊。
本文就到此結束啦,如果你有類似的 Project Templates 或 Project init 經驗,歡迎跟我分享與交流喔!