平時一直是用git來管理代碼倉庫,也用過一段時間github,但是github免費版不能建私有倉庫。后來轉到了bitbucket,后來被atlassian收購后有點不適應,而且在國內訪問經常連不上。還是gitlab比較好用,因為公司也是用gitlab,所以上手很快,新增的構建功能非常方便。
1. GitLab.com
gitlab是開源項目,官網也提供了社區版安裝包,如果有自己服務器的話可以私有化部署一個,安裝教程參考官網,只需要簡單幾步就能運行,地址https://about.gitlab.com/installation/。
但是對於個人開發者來說要求的服務器配置有點高,1核1G的服務器也只能勉強跑起來。另一種選擇就是使用GitLab.com,這是官方提供的免費平台,功能和社區版一樣,有人在維護、更新,新功能會比較多,缺點就是偶爾抽風。地址https://gitlab.com/users/sign_in > GitLab.com offers free unlimited (private) repositories and unlimited collaborators.
這是官方的宣傳語,提供無限的免費的私人的倉庫,無限制的協作者,條件非常誘人。
注冊流程比較簡單,填一下username和email就差不多了,這也將是git空間的標記,名字不要取得太隨意就行了。
2. 創建項目
登錄后點擊右上角的加號(New project)。
- Project path:如果你屬於group的話可以選group名字,這樣項目就會放在對應group下,一般團隊項目比較好用。
- Project name:你的項目名字
- Import project from:可以從多個github、bitbucket等主流托管平台導入項目。
- Project description:項目描述,可選
- Visibility Level:項目可見級別
- Private:私有項目,需要授權才能訪問,適合個人、團隊開發。
- Internal:內部項目,注意只要登錄賬號就能訪問,適合開源貢獻代碼。
- Public:公開項目,不用登錄就能訪問,適合分享項目。
點擊create,創建項目,進入空項目,會出現初始化步驟,可以用ssh和https方式來上傳代碼,推薦ssh,比較安全。
3. 配置ssh(可選)
如果本地沒有ssh key,用ssh-keygen初始化一個,可以參考我之前寫的github教程git初始化那部分https://wuyuans.com/2012/05/github-simple-tutorial/#toc-3
有ssh key后添加到后台,點擊右側頭像,下拉菜單里選settings,在頂部的tab里點擊SSH Keys,或者直接訪問https://gitlab.com/profile/keys。
Key就是.ssh/id_rsa.pub文件內容,title填自己知道的就行,盡量語義化點。
Add key,完成。
4. 上傳項目
回到我們創建的空項目頁面,在項目名稱下面選擇傳輸協議,ssh或者https,下面教程里的url會跟着變。
之后按照下面的教程來做就行了,最后push
git push -u origin master
完成,這時項目頁面應該就有東西了,后面就可以用正常的git命令來維護代碼倉庫了。
5. 配置CI(持續集成)
如果只是要一個git代碼托管的話上面幾步已經足夠了,現在開始介紹gitlab提供的持續集成功能,這對於需要打包、發布的人來說非常方便。
5.1 Pipelines
一個pipeline就是一次持續集成任務,一般由一次push觸發,在網頁上對項目的修改、merge也會觸發pipline。pipline由Runner執行,Runner有兩種:
- Specific Runners:私有runner,部署和執行在自己服務器上,優點是安全、速度快,缺點是需要提供服務器,部署教程https://docs.gitlab.com/runner/install/linux-repository.html
- Shared Runners:共享runner,官方提供的runner,優點是免費,缺點是會偶爾抽風、或者速度慢
5.2 Jobs
pipline由多個job組成,一個job會發給一個runner來執行,所以各個job之間的數據不是共享的,除非使用cache。所以盡量把一些有依賴的步驟放到一個job里,或者把一些通用步驟放到before_script里,這個后面會提到。
5.3 stages
stage是對job的分組,同一個stage里的job是並行的,兩個stage之間是串行的
5.4 .gitlab-ci.yml
要想配置上面說的這些,需要在項目根目錄新建.gitlab-ci.yml文件,文件格式為yaml,教程https://docs.gitlab.com/ee/ci/yaml/README.html。舉個例子,這是我www工程配置文件的簡化版,使用golang編譯:
image: golang:latest
before_script:
- ln -s /builds/wuyuans/www /go/src/www
- cd /go/src/www
- mkdir bin
stages:
- build
- deploy
build_web:
stage: build
script:
- go build -v -o bin/web www/web
except:
- release
build_service:
stage: build
script:
- go build -v -o bin/service www/service
except:
- release
deploy_web:
stage: deploy
script:
- go build -v -o bin/web www/web
- scp bin/web root@${HOST_1}:/bin/
environment:
name: www/web
url: http://$CI_ENVIRONMENT_SLUG.wuyuans.com
when: manual
only:
- release
5.4.1 image
編譯使用的docker鏡像,如果是golang的話可以用golang:latest,使用最新版golang,其他可以在docker hub查https://hub.docker.com/_/golang/
5.4.2 before_script
每個job執行前都會執行before_script里的步驟,主要是做一些環節初始化,比如我這里把工程目錄鏈到了GOPATH下,這樣方便使用go命令。也可以在這里做一些go get工作
5.4.3 stages
我分了兩個stage,build和deploy。build里有build_web、build_service,deploy里的是deploy_web,名字可以隨便,主要是job里的stage字段需要和stages里定義的對應上。
5.4.4 build_web、build_service
script里的是執行的命令,做go build的工作,except表示這個job不能在release分支執行。
5.4.5 deploy_web
script和前面一樣。environment用來標記發布的名字,我們可以用environment來管理發布版本、回滾等。when表示執行時間,默認是always每次都會執行,manual表示需要在后台手動執行,這樣在不需要所有deploy job都執行的時候手動deploy項目。only表示只在release分支執行。
5.5 Environments
在.gitlab-ci.yml里配置了environment后,job執行完后會在項目頁面里的Pipelines->Environments下看到這次job,他會按照配置里的name來合並,每次job都可以重做,也就是可以用來做項目的重發和回滾,右邊有相對於的按鈕,很方便。
6. 總結
gitlab有很多功能非常實用,比如上面講到的Pipelines、Environments等,還有像Graph(以前叫network)可以顯示所有分支的樹狀結構,這對於在多個分支里來回切換、分不清在哪個分支提交的人來說很直觀。而且gitlab對於權限控制提供了很多的選項,很適合團隊合作。然而缺點也還是有的,因為是官方托管的平台,日常維護、偶爾抽風什么的,還有被牆的風險什么的。。。如果是個人用戶應該關系不大,如果是團隊的話還是自建gitlab社區版,功能應該差不多,畢竟安全和穩定對團隊來說是比較重要的。