GitLab整合kubernetes實現自動釋出
建立GitLab原始碼專案並上傳示例程式碼
1. 建立GitLab原始碼專案
本示例中建立的GitLab原始碼專案地址為:https://gitee.com/SunHarvey/helloworld_java.git
2. 執行以下命令獲取示例程式碼並上傳至GitLab
git clone https://gitee.com/SunHarvey/helloworld_java.git git remote add helloworld https://gitee.com/SunHarvey/helloworld_java.git git push helloworld master
在Kubernetes叢集中安裝GitLab Runner
1. 獲取GitLab Runner的註冊資訊
- 登入你的GitLab。
- 在頂部導航欄中,選擇Projects > Your projects。
- 在Your projects頁簽下,選擇相應的Project。
- 在左側導航欄中,選擇Settings > CI / CD。
- 單擊Runners右側的Expand。
獲取URL和registration token, 這個url 和token下邊要用到
2. 獲取並修改GitLab Runner的Helm Chart
獲取gitlab-runner
git clone https://github.com/haoshuwei/gitlab-runner.git
替換values.yaml檔案中 gitlabUrl和runnerRegistrationToken欄位, 就是上邊看到的那個兩個欄位,
也可以配置全域性的runner, 這個就不用每個專案都加了,具體方法請看文章末尾附錄
gitlabUrl: http://xx.xx.xx.xx/ runnerRegistrationToken: "xxxxxx"
3 安裝GitLab Runner
打包應用
helm package .
Successfully packaged chart and saved it to: /root/gitlab/gitlab-runner/gitlab-runner-0.1.37.tgz
安裝應用
helm install --namespace gitlab --name gitlab-runner *.tgz
檢視相關的deployment/pod是否成功啟動。若成功啟動,則可在GitLab上看到註冊成功的GitLab Runner
也可在kubernetes上檢視
設定全域性變數
在GitLab的頂部導航欄中,選擇Projects > Your projects。
在Your projects頁簽下,選擇相應的Project。
在左側導航欄中,選擇Settings > CI / CD。
單擊Variables右側的Expand。新增GitLab Runner可用的環境變數。本示例中,新增以下三個變數。
REGISTRY_USERNAME:映象倉庫使用者名稱。
REGISTRY_PASSWORD:映象倉庫密碼。
kube_config:KubeConfig的編碼字串。
執行以下命令生成KubeConfig的編碼字串:
echo $(cat ~/.kube/config | base64) | tr -d " "
編寫.gitlab-ci.yml
編寫.gitlab-ci.yml檔案,完成 helloworld 原始碼專案的編譯構建、映象推送和應用部署(可參考hellowrld原始碼專案中的.gitlab-ci.yml)
image: docker:stable stages: - package - docker_build - deploy_k8s variables: KUBECONFIG: /etc/deploy/config MAVEN_OPTS: "-Dmaven.repo.local=/opt/cache/.m2/repository" mvn_build_job: image: maven:3.6.2-jdk-14 stage: package tags: - k8s-runner script: - mvn clean install - cp target/helloworld-1.0.jar /opt/cache/ docker_build_job: image: docker:latest stage: docker_build tags: - k8s-runner script: - docker login -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD registry-vpc.cn-hongkong.aliyuncs.com - cp /opt/cache/helloworld-1.0.jar target/helloworld-1.0.jar - docker build -t registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_PIPELINE_ID . - docker push registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_PIPELINE_ID deploy_k8s_job: image: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/kubectl:1.16.6 stage: deploy_k8s tags: - k8s-runner script: - mkdir -p /etc/deploy - echo $kube_config |base64 -d > $KUBECONFIG - sed -i "s/IMAGE_TAG/$CI_PIPELINE_ID/g" deployment.yaml - cat deployment.yaml - kubectl apply -f deployment.yaml
.gitlab-ci.yml定義了一個Pipeline, 分三個階段步驟執行
image: docker:stable # Pipeline中各個步驟階段的構建映象沒有指定時, 預設使用docker:stable映象 stages: - package # 原始碼打包階段 - docker_build # 映象構建和打包推送階段 - deploy_k8s # 應用部署階段 variables: KUBECONFIG: /etc/deploy/config # 定義全域性變數KUBECONFIG
maven原始碼打包階段。
mvn_build_job: # job名稱 image: maven:3.6.2-jdk-14 # 本階段構建使用的構建映象 stage: package # 關聯的階段名稱 tags: # GitLab Runner的tag - k8s-runner # 指定runner-tag script: - mvn clean install # 執行構建指令碼 - cp target/helloworld-1.0.jar /opt/cache/ # 構建物儲存至快取區
映象構建和打包推送階段
docker_build_job: image: docker:latest stage: docker_build tags: - k8s-runner script: - docker login -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD registry-vpc.cn-hongkong.aliyuncs.com # 登入映象倉庫 - cp /opt/cache/helloworld-1.0.jar target/helloworld-1.0.jar - docker build -t registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_PIPELINE_ID . # 打包Docker映象,使用的tag為本次Pipeline的ID - docker push registry-vpc.cn-hongkong.aliyuncs.com/YourImageRepo/helloworld:$CI_PIPELINE_ID # 推送Docker映象
應用部署階段
deploy_k8s_job: # job名稱 image: registry.cn-hangzhou.aliyuncs.com/haoshuwei24/kubectl:1.16.6 # 本階段構建使用的構建映象 stage: deploy_k8s # 關聯的階段名稱 tags: - k8s-runner # GitLab Runner的tag script: - mkdir -p /etc/deploy - echo $kube_config |base64 -d > $KUBECONFIG # 配置連線Kubernetes叢集的config檔案 - sed -i "s/IMAGE_TAG/$CI_PIPELINE_ID/g" deployment.yaml # 動態替換部署檔案中的映象tag - cat deployment.yaml - kubectl apply -f deployment.yaml
執行Pipeline
提交.gitlab-ci.yml檔案後,Project gitlab-java-demo會自動檢測到這個檔案並執行Pipeline, 如下圖所示
訪問服務
如果部署檔案中沒有指定Namespace,則預設會部署到GitLab名稱空間下kubectl -n gitlab get svc
注意事項
1. 取消Auto DevOps
附錄:
全域性runner 新增
以管理員省份登入gitlab ,進入adminArea --> Overview --> Runners, 就可以看到 url 和token 了。
文字參考:https://help.aliyun.com/document_detail/106968.html