天天看點

CICD從Gitlab到Coderun

背景

我們是一個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上依然無效。

評估後我們得出兩種方案:

  1. 使用自定義的鏡像(Gitlab CI支援使用任意鏡像進行擴充)封裝kubectl進行部署,這樣的方式需要将kubeconfig配置到變量中,并使用腳本生成kubeconfig檔案。然後再執行service和deployment檔案進行部署。(Drone上的K8s插件不太靠譜,最好不要使用)
  2. 尋找其他的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有幾個比較明顯的缺點:

  1. 需要自行部署
  2. 插件和配置還是有一定學習難度
  3. 配置相對來說比較複雜
  4. 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這個配置應該挺好懂的。這裡再簡單介紹下:

  1. image: 定義了所有下面的步驟預設使用docker鏡像
  2. variables: 定義了友善後續使用的變量
  3. 兩個步驟:
    • build: 建構鏡像
    • deploy-dev: 部署開發環境,其中

      only

      限制了隻有

      dev

      分支才執行
    • stages部分進行了說明

因為gitlab沒有整合資源,所有docker的操作和部署都是需要自己寫腳本完成。當然這對于進階使用者肯定是沒有難度的,但對于新手就需要一定學習。

+

代碼遷移到

,國内一般叫

碼雲

。主要原因就是

太慢了。另外

碼雲

的項目管理功能也是相當強大的。

那麼

應該是一個比較新的産品,好像也沒什麼知名度。但試用了下感覺還不錯,而且國内好像也沒有

類似的獨立平台。

我個人認為

的優點有:

  1. 整合常見的Git平台:Github、Bitbucket、Gitee、Coding、Gitlab(私有部署好像也能支援)
  2. 有獨立的鏡像倉庫,當然也可以配置第三方鏡像倉庫
  3. 可以配置token或者證書驗證的Kubernetes(阿裡雲Kubernetes預設使用證書的驗證方式)
  4. 有獨立的Helm倉庫
  5. 同樣是Yaml配置,有一個簡單的GUI
  6. 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: 使用

    crun/docker

    步驟,代碼倉庫中的Dockerfile建構鏡像,并上傳到

    CodeRun

    提供的鏡像倉庫
  • deploy: 使用

    crun/kube

    步驟,和代碼倉庫中的

    deploy/deployment.yml

    配置直接将鏡像部署到在

    CodeRun

    上配置好的

    myk8s

    的Kubernetes叢集上

和Gitlab的差異:

  1. 沒有任何腳本操作
  2. 不需要定義一堆變量和參數

Kubernetes叢集

myK8s

的配置:

CICD從Gitlab到Coderun