平時一直是用git來管理代碼倉庫,也用過一段時間github,可是github免費版不能建私有倉庫。後來轉到了bitbucket,後來被atlassian收購後有點不適應,並且在國內訪問常常連不上。仍是gitlab比較好用,由於公司也是用gitlab,因此上手很快,新增的構建功能很是方便。html
gitlab是開源項目,官網也提供了社區版安裝包,若是有本身服務器的話能夠私有化部署一個,安裝教程參考官網,只須要簡單幾步就能運行,地址https://about.gitlab.com/installation/。linux
可是對於我的開發者來講要求的服務器配置有點高,1核1G的服務器也只能勉強跑起來。另外一種選擇就是使用GitLab.com,這是官方提供的免費平臺,功能和社區版同樣,有人在維護、更新,新功能會比較多,缺點就是偶爾抽風。地址https://gitlab.com/users/sign_in > GitLab.com offers free unlimited (private) repositories and unlimited collaborators.git
這是官方的宣傳語,提供無限的免費的私人的倉庫,無限制的協做者,條件很是誘人。github
註冊流程比較簡單,填一下username和email就差很少了,這也將是git空間的標記,名字不要取得太隨意就好了。golang
登陸後點擊右上角的加號(New project)。web
點擊create,建立項目,進入空項目,會出現初始化步驟,能夠用ssh和https方式來上傳代碼,推薦ssh,比較安全。docker
若是本地沒有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填本身知道的就行,儘可能語義化點。ssh
Add key,完成。
回到咱們建立的空項目頁面,在項目名稱下面選擇傳輸協議,ssh或者https,下面教程裏的url會跟着變。
以後按照下面的教程來作就好了,最後push
git push -u origin master
完成,這時項目頁面應該就有東西了,後面就能夠用正常的git命令來維護代碼倉庫了。
若是隻是要一個git代碼託管的話上面幾步已經足夠了,如今開始介紹gitlab提供的持續集成功能,這對於須要打包、發佈的人來講很是方便。
一個pipeline就是一次持續集成任務,通常由一次push觸發,在網頁上對項目的修改、merge也會觸發pipline。pipline由Runner執行,Runner有兩種:
pipline由多個job組成,一個job會發給一個runner來執行,因此各個job之間的數據不是共享的,除非使用cache。因此儘可能把一些有依賴的步驟放到一個job裏,或者把一些通用步驟放到before_script裏,這個後面會提到。
stage是對job的分組,同一個stage裏的job是並行的,兩個stage之間是串行的
要想配置上面說的這些,須要在項目根目錄新建.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
編譯使用的docker鏡像,若是是golang的話能夠用golang:latest,使用最新版golang,其餘能夠在docker hub查https://hub.docker.com/_/golang/
每一個job執行前都會執行before_script裏的步驟,主要是作一些環節初始化,好比我這裏把工程目錄鏈到了GOPATH下,這樣方便使用go命令。也能夠在這裏作一些go get工做
我分了兩個stage,build和deploy。build裏有build_web、build_service,deploy裏的是deploy_web,名字能夠隨便,主要是job裏的stage字段須要和stages裏定義的對應上。
script裏的是執行的命令,作go build的工做,except表示這個job不能在release分支執行。
script和前面同樣。environment用來標記發佈的名字,咱們能夠用environment來管理髮布版本、回滾等。when表示執行時間,默認是always每次都會執行,manual表示須要在後臺手動執行,這樣在不須要全部deploy job都執行的時候手動deploy項目。only表示只在release分支執行。
在.gitlab-ci.yml裏配置了environment後,job執行完後會在項目頁面裏的Pipelines->Environments下看到此次job,他會按照配置裏的name來合併,每次job均可以重作,也就是能夠用來作項目的重發和回滾,右邊有相對於的按鈕,很方便。
gitlab有不少功能很是實用,好比上面講到的Pipelines、Environments等,還有像Graph(之前叫network)能夠顯示全部分支的樹狀結構,這對於在多個分支裏來回切換、分不清在哪一個分支提交的人來講很直觀。並且gitlab對於權限控制提供了不少的選項,很適合團隊合做。然而缺點也仍是有的,由於是官方託管的平臺,平常維護、偶爾抽風什麼的,還有被牆的風險什麼的。。。若是是我的用戶應該關係不大,若是是團隊的話仍是自建gitlab社區版,功能應該差很少,畢竟安全和穩定對團隊來講是比較重要的。