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配置。
部署完成了,後續使用構建工具打包時添加指定緩存目錄。例如:maven
mvn clean package -DskipTests -Dmaven.repo.local=/home/gitlab-runner/ci-build-cache/maven
發現構建速度很快證明已經完成構建緩存配置。可以配合查看本地緩存目錄是否有更新(目錄時間)。
解決構建制品問題
在kubernetes中對cache支持一般,我們可以使用artifacts進行代替。但是考慮到artifacts收集製品會佔用存儲空間,所以準備研究下如何配置統一的緩存。實際上我們可以將repo目錄做成持久化。
經過測試,在使用kubernetes執行器創建的構建pod會默認掛載一個空目錄。此目錄用於存儲每次下載的代碼,因爲是空目錄的原因導致後續測試pod無法獲取需要重新下載代碼,這還不要緊,重要的是構建生成的文件target目錄都不存在了導致後續步驟接連失敗。
由於yaml文件都是有官方默認配置的,問題不好定位。這其實是個兩年前的問題了。 https://gitlab.com/gitlab-org/gitlab-runner/-/issues/3148 。最後經過分析直接將持久化的pvc掛載到空目錄中的某個目錄中。需要配置runner自定義構建目錄,但是構建目錄必須是在$CI_BUILD_DIRS目錄裏面。
準備本地的工作目錄
/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
經過測試在本地的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模板
一起學習呀: