實踐分享!GitLab CI/CD 快速入門

語言: CN / TW / HK

用過 GitLab 的同學肯定也對 GitLab CI/CD 不陌生,GitLab CI/CD 是一個內建在 GitLab 中的工具,它可以幫助我們在每次程式碼推送時執行一系列指令碼來構建、測試和驗證程式碼的更改以及部署。

Rainbond 本身預設集成了 CI/CD 的整套流程,使用者只需提供原始碼,後續構建、執行完全交給 Rainbond 處理,整個過程是由 Rainbond 定義的,無需使用者干預。這樣有利也有弊,利就是簡化使用者的操作和無需學習 CI/CD 相關知識;弊是使用者無法在 CI/CD 過程中自定義,比如想整合程式碼檢測或執行個指令碼,這在 Rainbond 的原始碼構建流程中是不可自定義的。

本文給大家講述如何使用 GitLab CI/CD 構建、測試、部署 Spring Boot 應用,將產物執行在 Rainbond 上。

GitLab CI 介紹

使用 GitLab CI 需要在倉庫根目錄下建立 .gitlab-ci.yml 檔案。在這個檔案中,你可以定義需要執行的編譯、測試、部署指令碼。

在添加了 .gitlab-ci.yml 檔案後,當推送程式碼時,GitLab Runner 自動執行你定義的 Pipeline,並在 GitLab CI 頁面上展示 CI 過程以及結果。

GitLab CI 的基本流程如下:

  1. 開發人員推送程式碼
  2. 觸發 GitLab CI 啟動
  3. runner 執行預定義指令碼

GitLab CI/CD 快速開始

部署 GitLab 和 Runner

通過開源應用商店一鍵部署 GitLab 和 Runner ,新增 -> 基於應用商店建立元件 -> 在開源應用商店中搜索 GitLab 依次安裝 GitLab 和 Runner 到指定應用中。

在 Rainbond 上配置 Runner

在 Rainbond v5.8 版本之前,Rainbond 對 Runner 型別的元件支援的並不是很好。因為 Runner 若以容器的形式去執行的話,本身它需要去掛載宿主機的docker.sock 檔案,使它可以排程宿主機的 docker 環境,建立容器執行任務。在 Rainbond v5.8 版本中,支援修改元件的 YAML,就可以自定義 Volumes 並掛載本地的 docker.sock。

在通過應用商店安裝了 Runner 之後,可以在 Runner 元件內 -> 其他設定中看到 Kubernetes 屬性,Rainbond 的應用模型已相容了 Kubernetes 屬性。

註冊 Runner 到 GitLab :

  1. 進入編排模式,將 runner 連線到 GitLab 並更新 runner 元件。(如提示 GitLab 未開啟對內埠,則選擇 80 埠)

  2. 首先訪問 GitLab,Menu -> Admin -> Overview -> Runners -> Register an instance runner -> 複製 Registration token。

  3. 進入 runner 元件內,點選右上角 web 終端進入,執行以下命令進行註冊,<token> 換成上一步複製的 Registration token。

gitlab-runner register \
  --non-interactive \
  --executor "docker" \
  --docker-image alpine:latest \
  --url "http://127.0.0.1" \
  --registration-token "NxNuoRXuzYy3GnFbkhtK" \
  --description "docker-runner" \
  --tag-list "newdocker" \
  --run-untagged="true" \
  --locked="false" \
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock \
  --docker-privileged="true" \
  --access-level="not_protected"

引數說明

Parameter Value Describe
--executor docker 執行器型別為docker。
--url http://127.0.0.1 GitLab addr
--registration-token <token> GitLab token
--tag-list newdocker 定義runner的標籤/名字
--locked false runner為啟用狀態
--run-untagged true 執行沒有指定標籤的Job
--docker-volumes file_path 掛載檔案到runner中
--docker-privileged true runner執行模式:特權模式
  1. 註冊完成後就可以在 GitLab 頁面中看到 online 的 runner

GitLab CI/CD To Rainbond

整個流程可以分為:

  1. 開發人員提交程式碼到GitLab倉庫。
  2. 觸發GitLab 流水線建立,Runner 執行 .gitlab-ci.yml 定義的 stages。
  3. 將製作好的映象推送到已有的映象倉庫,供後續的Deploy流程使用。
  4. 通過Rainbond自定義API的方法,觸發平臺元件的自動構建,進入Deploy階段。

實踐步驟

前提:

  • 已有 Rainbond 環境
  • 準備映象倉庫,本文使用的DockerHub
  • 本文所使用到程式碼專案為 Java-Maven-Demo

1.在Rainbond上有已經基於映象部署好的元件

2.將示例程式碼匯入到 GitLab中。

3.編寫 .gitlab-ci.yml 檔案:

在專案根目錄下建立 .gitlab-ci.yml 內容如下:

# 定義 job 的執行順序
stages:
  - test
  - package
  - push
# 定義基礎映象
image: maven:3.6.3-jdk-8
job-test:
  stage: test
  tags: 
    - newdocker
  script:
    - echo "===============開始執行程式碼測試任務==============="
    - mvn test
job-package:
  stage: package
  tags: 
    - newdocker
  script:
    - echo "===============開始執行打包任務==============="
    - ls
    - mvn clean package
    - cp Dockerfile target/Dockerfile
  cache:
    key: devops
    paths:
      - target/ 
job-push:
  stage: push
  image: docker:dind
  cache:
    key: devops
    paths:
      - target/
  tags:
    - newdocker
  script:
    - docker login -u ${DOCKER_USERNAME} -p ${DOCKER_PASSWORD}
    - docker build -t ${IMAGE_DOMAIN}/java-maven:latest .
    - docker push ${IMAGE_DOMAIN}/java-maven:latest
  after_script:  
    - curl -d '{"secret_key":"${RAINBOND_SECRET}"}' -H "Content-type:application/json" -X POST http://${RAINBOND_IP}:7070/console/custom/deploy/3321861bcadf0789af71898f23e8e740

after_script 是在推送映象完成後執行,通過 Rainbond API 構建元件,Rainbond 會獲取最新映象構建執行。<RAINBOND_SECRET> 可在元件 -> 構建源 -> 自動構建中看到。詳情可參閱文件 配置元件自動構建部署

4.提交程式碼測試自動構建

修改程式碼並提交,提交後可在專案的 CI/CD -> Jobs 可以看到正在執行的以及執行完成的任務詳情。

5.檢視 Rainbond 元件構建

可以在元件的操作記錄中看到自動構建資訊。

寫在最後

GitLab CI 擴充套件性很好,可以整合很多第三方工具,結合 Rainbond 作為 CD,將產物執行到 Rainbond 上,即可形成適用於自身程式碼專案的 Pipeline。

Rainbond 會在未來的 v5.9.x 版本中實現 Pipeline,對 Rainbond 實現 Pipeline 有想法的同學可以在 issue 上提出 Proposal https://github.com/goodrain/rainbond/issues