基於gitlab+docker+k8s打造自動化構建部署流程

前言

隨着需求愈來愈多,以及相關代碼分支權限的流程規範化,團隊內部的項目上線部署複雜度提高,基於現有的環境和市場上主流的軟件,打造了一套基於gitlab+docker+harbor+kubernetes的自動化構建部署流程(CI/CD),目前團隊內部流程基本走通,整理了一份相關文檔分享出來。寫的糙的地方,輕噴。linux

概念

GitLab CI/CD

GitLab 是一個用於倉庫管理系統的開源項目,使用Git做爲代碼管理工具,並在此基礎上搭建起來的Web服務。與之對應的有GitHub和Gitee,公司內部使用通常使用GitLab做爲代碼管理工具。git

GitLab CI/CD 是一個內置在GitLab中的工具,用於經過持續方法進行軟件開發:golang

  • Continuous Integration (CI) 持續集成
  • Continuous Delivery (CD) 持續交付
  • Continuous Deployment (CD) 持續部署

持續集成的工做原理是將小的代碼塊推送到Git倉庫中託管的應用程序代碼庫中,而且每次推送時,都要運行一系列腳原本構建、測試和驗證代碼更改,而後再將其合併到主分支中。docker

持續交付和部署至關於更進一步的CI,能夠在每次推送到倉庫默認分支的同時將應用程序部署到生產環境。這些方法使得能夠在開發週期的早期發現bugs和errors,從而確保部署到生產環境的全部代碼都符合爲應用程序創建的代碼標準。shell

GitLab CI/CD 由一個名爲 .gitlab-ci.yml 的文件進行配置,改文件位於倉庫的根目錄下。文件中指定的腳本由GitLab Runner執行。vim

Docker

Docker 是一個開源的應用容器引擎,基於Go語言開發並聽從 Apache2.0 協議開源。Docker 可讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,而後發佈到任何流行的 Linux 機器上,也能夠實現虛擬化。容器是徹底使用沙箱機制,相互之間不會有任何接口,更重要的是容器性能開銷極低。安全

Harbor

雖然Docker官方提供了公共的鏡像倉庫,可是從安全和效率等方面考慮,部署公司私有環境內的Registry是很是有必需要的。bash

Harbor是由VMware公司開源的企業級的Docker Registry管理項目,相比docker官方擁有更豐富的權限管理和完善的架構設計,適用於大規模docker集羣部署提供倉庫服務服務器

它主要提供Docker Registry管理界面UI,可基於角色訪問控制,鏡像複製,AD/LDAP集成,日誌審覈等功能,重點是徹底支持中文。markdown

Kubernetes

kubernetes(簡稱k8s)是用於自動部署、擴容和管理編排容器化應用程序的開源系統,該系統由Google設計並捐贈給Linux基金會來使用。

它旨在提供「跨主機集羣的自動部署、擴展以及運行應用程序容器的平臺」。 它支持一系列容器工具,包括docker、containerd等。

搭建GitLab-Runner

服務器要求

  • 最少一臺runner服務器,建議最低配置爲2C4G以上
  • gitlab服務

配置CI/CD的Runners

  • 點擊項目,左側的Settings---->CI/CD---->Runners---->Expand,以下圖所示

image-20210806164257980

  • 登陸runner服務器,安裝gitlab-runner

    curl -L --output /usr/local/bin/gitlab-runner "https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64"
    ​
    chmod +x /usr/local/bin/gitlab-runner
    ​
    ##添加用戶,此處能夠不添加,若是用root權限的話,建議直接指定root用戶。防止後續持續性集成的時候出現權限問題
    useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
    ## 切換到root用戶  --user=root
    gitlab-runner install --user=root --working-directory=/home/gitlab-runner
    #gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
     
    gitlab-runner start
    ## 也能夠後續調整配置文件
    vim /etc/systemd/system/gitlab-runner.service
    複製代碼
  • 配置文件 : /etc/systemd/system/gitlab-runner.service

    [Unit]
    Description=GitLab Runner
    ConditionFileIsExecutable=/usr/local/bin/gitlab-runner
    After=syslog.target network.target
    ​
    [Service]
    StartLimitInterval=5
    StartLimitBurst=10
    ExecStart=/usr/local/bin/gitlab-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--user" "root"
    ​
    Restart=always
    RestartSec=120
    EnvironmentFile=-/etc/sysconfig/gitlab-runner
    [Install]
    WantedBy=multi-user.target
    複製代碼
  • 重啓服務

    systemctl daemon-reload
    systemctl restart gitlab-runner.service
    複製代碼

註冊到gitlab上

說明:

gitlab-ci-multi-runner register:執行註冊命令
Please enter the gitlab-ci coordinator URL:輸入 ci 地址
Please enter the gitlab-ci token for this runner:輸入 ci token
Please enter the gitlab-ci description for this runner:輸入 runner 名稱
Please enter the gitlab-ci tags for this runner:設置 tag
Whether to run untagged builds:這裏選擇 true ,代碼上傳後會可以直接執行
Whether to lock Runner to current project:直接回車,不用輸入任何口令 
Please enter the executor:選擇 runner 類型,這裏咱們選擇的是 shell
複製代碼
  • 執行註冊:(後面在GitLab的UI中更改)

    gitlab-runner register
    ##輸入gitlab的地址,如下信息在上圖中有體現,圖中4的位置
    Enter the GitLab instance URL (for example, https://gitlab.com/):
    https://gitlaball.xx.net/
    ##輸入token
    Enter the registration token:
    *********
    ##輸入runner的描述,通常能夠設置爲runner的hostname
    Enter a description for the runner:
    do-runner-004
    ## 輸入與Runner關聯的標籤
    Enter tags for the runner (comma-separated):
    master
    ##輸入Runner執行程序,通常選擇shell,根據真實狀況選擇
    Enter an executor: docker+machine, parallels, shell, ssh, virtualbox, kubernetes, custom, docker, docker-ssh, docker-ssh+machine:
    shell
    ##執行完畢
    Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!
    複製代碼
  • 刷新剛剛的CI/CD頁面,發現已經添加runner機器成功

    image-20210806165653810

配置gitlab-ci.yml文件

注意:此處demo是演示的go版本,能夠根據具體的項目環境進行調整腳本操做,大致操做是不變的

項目添加.gitlab-ci.yml

此處默認爲該文件名,若有調整,能夠從GitLab項目中的Settings---->CI/CD---->General pipelines中修改

before_script:
  - go env -w GOPROXY=https://goproxy.cn,direct
  - go env -w GO111MODULE=on
stages:
  - build
  - test
  - lint
  - docker-deploy
build:
  stage: build
  allow_failure: false  
  script:
    - go mod tidy
    - make
  only:
    - tags
    - branches
  retry: 1
test:
  stage: test
  script:
    - echo
    - go test -test.v  ./...  -nacosDir=$PWD/conf  -logDir=$PWD/
  only:
    - tags
    - branches
  retry: 1
lint:
  stage: lint
  allow_failure: false
  script:
    - golangci-lint --version
    - golangci-lint run -v
  only:
    - tags
    - branches
  retry: 1
docker-deploy:
  stage: docker-deploy
  script:
    - make
    - docker build --rm -t harbor.xx.net/risk/riskclient:$CI_COMMIT_REF_NAME .
    - docker push harbor.xx.net/risk/riskclient:$CI_COMMIT_REF_NAME
  only:
    - tags
複製代碼

說明:

觸發build、test、lint 流程: 當branchs和tags變動的時候。注意allow_failure: false ,設置是否容許該job失敗。

觸發docker-deploy 流程:當項目打tag版本的時候,觸發docker編譯和推送到公司私有倉庫上。此處須要特別注意:

1:代碼的tag版本須要嚴格按照發版操做,vx.y.z。由於下面的docker 鏡像就是根據這個版原本建立,同時生產環境升級也是根據此狀況來執行。

2:runner服務器若是已經登陸過私服,則能夠不執行docker login 192.168.1.1 -u admin -p 123456,不然會推送到倉庫失敗

3:若是上面執行gitlab-runner 的用戶不是root,則此處有可能會出現權限問題,由於docker是用root啓動的。

提交代碼到gitlab

觀察項目此時會有pipline的日誌流程,能夠點進去看每個job的執行日誌

image-20210721184841558

image-20210721185110735

image-20210721185132153

查看docker 私服

image-20210806181958282

調整k8s版本

因爲程序升級的時間須要根據具體的狀況進行發佈,故此處操做爲手動調整鏡像版本進行升級

\

相關文章
相關標籤/搜索