背景
我們是一個10人小團隊,因為本人之前接觸過Docker和Drone,所有項目開發階段開始的時候就确定使用CICD和Docker的方式進行開發與部署。前期為了友善我們直接使用
Gitlab.com(不是私有部署)進行代碼倉庫的存儲于Gitlab CI進行建構,然後通過Gitlab Runner部署到阿裡雲的開發伺服器上。
沒有自己部署Gitlab的原因是不想去管理Gitlab,比如保證Gitlab的可用,資料安全等,對于我們這樣的小團隊減少自己部署産品可以節省不少時間和精力,而且
也基本是免費的。
前期因為産品開發階段是以我們隻考慮了直接在伺服器上通過Gitlab Runner部署開發環境和測試環境。但近期在準備産品的上線,我們需要将鏡像推送到阿裡雲的Kubernetes(我們是使用托管版)上進行部署。在準備使用Gitlab CI部署時發現阿裡雲K8s(托管版)不支援token連接配接。
後來與阿裡雲相關從業人員聯系後告知可以通過service和endpoint間接通過token通路k8s api。這種方式kubectl可以使用,但是配置
到Gitlab.com上依然無效。
評估後我們得出兩種方案:
- 使用自定義的鏡像(Gitlab CI支援使用任意鏡像進行擴充)封裝kubectl進行部署,這樣的方式需要将kubeconfig配置到變量中,并使用腳本生成kubeconfig檔案。然後再執行service和deployment檔案進行部署。(Drone上的K8s插件不太靠譜,最好不要使用)
-
尋找其他的CICD平台(其實想尋找其他平台的還有一個重要的原因是Gitlab.com在17點-03點這段時間速度特變,我們團隊又經常要
加班,是以晚上很痛苦。猜測應該和美國人上班時間有關系)。也有看了下CodePipeline,但是純GUI一步配置的方式真心不友善,沒有效率,是以放棄。
後來找到了一個CICD的SaaS平台:
CodeRun經過一段時間的研究和試用後我們目前所有的CICD都遷移到了
上(代碼倉庫也順便遷移到
Gitee上)
下面具體介紹下兩個平台
Gitlab
Gitlab(包括私有部署)應該是國内使用量最大的代碼倉庫,Gitlab因為發展不斷加入新功能,最亮眼的應該就是CICD和Kubernetes的
支援了。
是以理論上一套Gitlab就可以搞定你的代碼倉庫和CICD還是很友善的。
Gitlab的代碼倉庫功能就不讨論了。對于Gitlab CI這個新功能就比較有意思。大家都知道國内使用最多的CICD應該是Jenkins(應該是全球最多的)。我覺得其中最重要的一個原因是Jenkins是一個比較老的産品,在新的CICD方式沒有出來的時候他就已經有非常大了的使用者了。
但Jenkins有幾個比較明顯的缺點:
- 需要自行部署
- 插件和配置還是有一定學習難度
- 配置相對來說比較複雜
- Jenkins一般都需要專人進行維護
是以後來出現了一些僅通過一個Yaml檔案就可以配置整個Pipeline的産品,最有名的應該是
Drone。Drone因為部署友善,配置簡單,同時還是開源産品是以得到了大量的使用者。目前Drone也支援SaaS模式。但對于中國很悲劇的是他伺服器也在國外,性能是個問題。
Gitlab CI是另一個支援一個Yaml檔案配置的CI産品,他和Drone模式非常類似,基于 Docker 鏡像作為 Stage 來執行。使用鏡像作為Stage的好處就是你可以自定義鏡像來進行擴充需求。比如前面提到的自行擴充對K8s的支援。
Gitlab Yaml配置樣子如下:
image: docker:latest
stages:
- build
- deploy
variables:
APP_NAME: api
REGISTRY_IMAGE: "${DOUWA_REGISTRY_URL}/image/${APP_NAME}"
before_script:
- docker login -u $REGISTRY_USER -p $REGISTRY_PASSWORD $REGISTRY_URL
build:
stage: build
retry: 2
tags:
- dev
script:
- docker build -t $REGISTRY_IMAGE:${CI_COMMIT_REF_NAME} .
- docker push $REGISTRY_IMAGE:${CI_COMMIT_REF_NAME}
deploy-dev:
stage: deploy
tags:
- dev
script:
- docker stack deploy ${APP_NAME}_${CI_COMMIT_REF_NAME} -c deploy/${CI_COMMIT_REF_NAME}/docker-compose.yml --with-registry-auth
environment:
name: develop
only:
- dev
yaml這個配置應該挺好懂的。這裡再簡單介紹下:
- image: 定義了所有下面的步驟預設使用docker鏡像
- variables: 定義了友善後續使用的變量
- 兩個步驟:
- build: 建構鏡像
- deploy-dev: 部署開發環境,其中
限制了隻有only
分支才執行dev
- stages部分進行了說明
因為gitlab沒有整合資源,所有docker的操作和部署都是需要自己寫腳本完成。當然這對于進階使用者肯定是沒有難度的,但對于新手就需要一定學習。
+
代碼遷移到
,國内一般叫
碼雲
。主要原因就是
太慢了。另外
碼雲
的項目管理功能也是相當強大的。
那麼
應該是一個比較新的産品,好像也沒什麼知名度。但試用了下感覺還不錯,而且國内好像也沒有
類似的獨立平台。
我個人認為
的優點有:
- 整合常見的Git平台:Github、Bitbucket、Gitee、Coding、Gitlab(私有部署好像也能支援)
- 有獨立的鏡像倉庫,當然也可以配置第三方鏡像倉庫
- 可以配置token或者證書驗證的Kubernetes(阿裡雲Kubernetes預設使用證書的驗證方式)
- 有獨立的Helm倉庫
- 同樣是Yaml配置,有一個簡單的GUI
- Yaml的易用性比Gitlab要好
下面是之前Gitlab那個項目的CodeRun版本:
steps:
build:
image: crun/docker
repo_name: ${APP_NAME}
registry_name: coderun
dockerfile: Dockerfile
context: .
tags: ${CI_COMMIT_BRANCH}
deploy:
image: crun/kube
cluster_name: myk8s
template: deploy/deployment.yml
namespace: default
when:
branch: dev
簡單說明下:
- build: 使用
步驟,代碼倉庫中的Dockerfile建構鏡像,并上傳到crun/docker
提供的鏡像倉庫CodeRun
- deploy: 使用
步驟,和代碼倉庫中的crun/kube
配置直接将鏡像部署到在deploy/deployment.yml
上配置好的CodeRun
的Kubernetes叢集上myk8s
和Gitlab的差異:
- 沒有任何腳本操作
- 不需要定義一堆變量和參數
Kubernetes叢集
myK8s
的配置:
