5.1 Runner構建優化

runner部署優化

  • 添加構建緩存PVC
  • 添加工作目錄PVC
  • 開啓自定義構建目錄

準備工作

runner配置信息可以通過參數指定,也可以以環境變量方式設置。詳細內容可以通過 gitlab-runner register -h獲取到相關參數和變量名稱。

在使用官方提供的runner鏡像註冊runner,默認的runner配置文件在/home/gitlab-runner/.gitlab-runner/config.toml

參考文檔:http://s0docs0gitlab0com.icopy.site/runner/executors/kubernetes.html#using-volumes


解決構建緩存問題

所謂的構建緩存就是我們在進行maven/npm等構建工具打包時所依賴的包。默認會在私服中獲取,加快構建速度可以在本地緩存一份。在此,我們需要創建PVC來持久化構建緩存,加速構建速度。爲了節省存儲空間決定不在每個項目中存儲構建緩存,而是配置全局緩存。

準備本機緩存目錄

/opt/ci-build-cache

首先,創建一個PVC用於掛載到pod中使用。

apiVersion: v1
kind: PersistentVolume
metadata:
  name: ci-build-cache-pv
  namespace: gitlab-runner
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/opt/ci-build-cache"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ci-build-cache-pvc
  namespace: gitlab-runner
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

使用命令查看驗證

# kubectl get pvc -n gitlab-runner
NAME                 STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS   AGE
ci-build-cache-pvc   Bound    ci-build-cache-pv   10Gi       RWO            manual     5h41m


OK,pvc準備好了,考慮到不能每次部署runner都手動掛載pvc,需要自定義gitlab-runner chart,優化runner配置。

第一步:編輯value.yml文件,添加構建緩存信息配置。

## configure build cache
cibuild:
  cache:
    pvcName: ci-build-cache-pvc
    mountPath: /home/gitlab-runner/ci-build-cache

第二步:編輯templates/configmap.yml文件,entrypoint部分添加runner配置。在start之前添加,這樣runner在創建構建pod的時候會根據配置掛載pvc。

    # add build cache
    cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF
      [[runners.kubernetes.volumes.pvc]]
      name = "{{.Values.cibuild.cache.pvcName}}"
      mount_path = "{{.Values.cibuild.cache.mountPath}}"
    EOF

    # Start the runner
    exec /entrypoint run --user=gitlab-runner \
      --working-directory=/home/gitlab-runner

到此gitlab-runner chart部分配置就完成了,接下來可以通過Helm命令進行創建和更新了。

helm install gitlab-runner04 ./gitlab-runner --namespace gitlab-runner
helm upgrade gitlab-runner04 ./gitlab-runner --namespace gitlab-runner

使用以上命令部署完成後,可以在gitlab admin頁面和k8s面板查看runner的狀態,確保部署成功。查看pod配置。

images


部署完成了,後續使用構建工具打包時添加指定緩存目錄。例如:maven

mvn clean package  -DskipTests -Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/maven  

發現構建速度很快證明已經完成構建緩存配置。可以配合查看本地緩存目錄是否有更新(目錄時間)。


解決構建制品問題

在kubernetes中對cache支持一般,我們可以使用artifacts進行代替。但是考慮到artifacts收集製品會佔用存儲空間,所以準備研究下如何配置統一的緩存。實際上我們可以將repo目錄做成持久化。

經過測試,在使用kubernetes執行器創建的構建pod會默認掛載一個空目錄。此目錄用於存儲每次下載的代碼,因爲是空目錄的原因導致後續測試pod無法獲取需要重新下載代碼,這還不要緊,重要的是構建生成的文件target目錄都不存在了導致後續步驟接連失敗。

images

由於yaml文件都是有官方默認配置的,問題不好定位。這其實是個兩年前的問題了。 https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3148 。最後經過分析直接將持久化的pvc掛載到空目錄中的某個目錄中。需要配置runner自定義構建目錄,但是構建目錄必須是在$CI_BUILD_DIRS目錄裏面。

images

準備本地的工作目錄

/opt/ci-build-dir

創建repo持久化pvc

apiVersion: v1
kind: PersistentVolume
metadata:
  name: ci-build-dir-pv
  namespace: gitlab-runner
  labels:
    type: local
spec:
  storageClassName: manual
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: "/opt/ci-build-dir"
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: ci-build-dir-pvc
  namespace: gitlab-runner
spec:
  storageClassName: manual
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 5Gi

使用命令驗證

# kubectl get pvc -n gitlab-runner
NAME                 STATUS   VOLUME              CAPACITY   ACCESS MODES   STORAGECLASS   AGE
ci-build-cache-pvc   Bound    ci-build-cache-pv   10Gi       RWO            manual         6h41m
ci-build-dir-pvc     Bound    ci-build-dir-pv     10Gi       RWO            manual         3h11m

編譯values.yaml文件添加註冊配置變量。RUNNER_BUILDS_DIR定義構建目錄。CUSTOM_BUILD_DIR_ENABLED開啓自定義構建目錄配置。

envVars:
  - name: RUNNER_BUILDS_DIR
    value: "/home/gitlab-runner/ci-build-dir/"
  - name: CUSTOM_BUILD_DIR_ENABLED
    value: true

添加repo目錄緩存配置,我們把自定義的構建目錄放到默認構建目錄的下面builds目錄中。

## configure build cache
cibuild:
  cache:
    pvcName: ci-build-cache-pvc
    mountPath: /home/gitlab-runner/ci-build-cache
  builds:
    pvcName: ci-build-dir-pvc
    mountPath: /home/gitlab-runner/ci-build-dir/builds

編輯templates/configmap.yml

    # add build cache
    cat >>/home/gitlab-runner/.gitlab-runner/config.toml <<EOF
      [[runners.kubernetes.volumes.pvc]]
      name = "{{.Values.cibuild.cache.pvcName}}"
      mount_path = "{{.Values.cibuild.cache.mountPath}}"
      [[runners.kubernetes.volumes.pvc]]
      name = "{{.Values.cibuild.builds.pvcName}}"
      mount_path = "{{.Values.cibuild.builds.mountPath}}"
    EOF

更新runner

helm install gitlab-runner04 ./gitlab-runner --namespace gitlab-runner
helm upgrade gitlab-runner04 ./gitlab-runner --namespace gitlab-runner

在CI文件中配置,如果不開啓自定義構建目錄配置會出現錯誤。

variables:
  GIT_CLONE_PATH: $CI_BUILDS_DIR/builds/$CI_PROJECT_NAMESPACE/$CI_PROJECT_NAME/$CI_PIPELINE_ID

images


經過測試在本地的pv中能夠看到,下載的代碼文件。但是默認每次每個job運行的時候都會獲取遠程最新的代碼,會把構建目錄刪除掉,此時就需要配置git checkout策略了。其實按照我們目前的場景,不需要每個作業都下載代碼。只要第一個作業下載好最新的代碼,然後運行流水線即可。當在運行流水線的過程中遇到新代碼提交可以放到下次流水線執行。

需要在ci文件中定義GIT_CHECKOUT變量,默認值爲true,即每次都需要代碼下載。我們將全局配置爲false然後在build作業中配置爲true。也就實現了只在build作業下載最新代碼了。

GIT_CHECKOUT: "false" 

參考鏈接:http://s0docs0gitlab0com.icopy.site/ee/ci/yaml/README.html#git-checkout


參考文檔:

http://s0docs0gitlab0com.icopy.site/runner/executors/kubernetes.html#using-volumes k8srunner配置volume

https://gitlab.com/gitlab-org/gitlab-foss/-/blob/master/.gitlab-ci.yml 企業級ci模板

 一起學習呀:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章