1. 程式人生 > 其它 >docker gitlab版本管理和CI/CD 自動部署go

docker gitlab版本管理和CI/CD 自動部署go

一、docker中安裝gitlab

#先拉取映象
docker pull gitlab/gitlab-ce:latest

#執行映象
docker run -d -p 443:443 -p 80-100:80-100 -p 22:22  --name gitlab  --restart always   --v D:/docker/gitlab/config:/etc/gitlab  -v D:/docker/gitlab/logs:/var/log/gitlab   --v D:/docker/gitlab/data:/var/opt/gitlab  gitlab/gitlab-ce:latest

# 22埠對應的是 ssh  80-100表示80-100之間的所有埠
# -d:後臺執行
# -p:將容器內部埠向外對映
# --name:命名容器名稱
# -restart always 表示一直開機啟動,docker啟動就會啟動
# -v:將容器內目錄掛載到宿主機指定目錄

  安裝成功後,開啟瀏覽器輸入本地IP即可開啟頁面

    管理員預設是root,第一次登陸的時候需要設定密碼

  進入容器內部

 docker exec -it gitlab /bin/bash

  然後輸入命令

gitlab-rails console

  

  彈出 Loading production environment 後,在下面逐步輸入:

1、【user=User.where(id:1).first】 查出指定修改的使用者,1 為root

2、【user.password='abc123456'】 需要設定的密碼

3、【user.password_confirmation='abc123456'】  確認上面輸入的密碼

4、【user.save!】 儲存

  

  有了賬號登陸進去後,可以在右上角設定裡面設定成中文介面。別的使用者想要登入,直接頁面註冊,然後後臺稽核使用者就行。

   新建一個群組,把使用者新增進組裡面,新建一個git專案指定給某個群組

  額外配置

  gitlab建立專案的時候,預設的git地址是容器本機的IP地址,可以改成一個虛擬主機,修改配置檔案 D:\docker\gitlab\config\gitlab.rb 裡面的 external_url

external_url 'http://git.xxx.com'

  重啟gitlab

#在gitlab內部重啟載入配置
gitlab-ctl reconfigure
gitlab-ctl  restart

  

二、安裝gitlab-runner CI/CD自動部署

持續整合 CI(Continuous Integration):在原始碼變更後,觸發自動檢測、構建和測試的過程。在程式碼提交後,會自動進行構建和測試,並反饋結果。當結果符合預期時,再將程式碼整合到主幹。持續整合的目標是快速確保當前變更是可用的。

持續交付 CD(Continuous Delivery):是基於持續整合基礎上,將整合後的程式碼自動化部署到各個環境測試,確定可以釋出生產版本。

持續部署 CD(Continuous Deployment):是基於持續交付的基礎上,將在各個環境經過測試的應用自動化部署到生產環境。其實各個環境的釋出過程都是一樣的。應用釋出到生產環境後,我們需要對應用進行健康檢查、新增應用的監控項、 應用日誌管理。

 

1. 安裝並執行gitlab-runner

GiTLab Runner是一個指令碼執行器,類似於Jenkins,可以為我們執行一些CI持續整合、構建的指令碼任務(即.gitlab-ci.yml),執行器具有執行指令碼、排程、協調的工作能力。

#拉去映象
gitlab/gitlab-runner:latest

#執行容器
docker run -d --name gitlab-runner --restart always  -v D:/docker/gitlab/gitlab-runner/config:/etc/gitlab-runner  -v /var/run/docker.sock:/var/run/docker.sock  gitlab/gitlab-runner:latest  

對映/var/run/docker.sock這個檔案是為了讓容器可以通過/var/run/docker.sockDocker守護程序通訊,管理其他Docker容器,因為docker daemon程序預設監聽的是/var/run/docker.sock這個檔案,所以docker客戶端只要把請求命令發往這裡,daemon就能收到並且做出響應。這個命令將外部docker客戶端的/var/run/docker.sock對映給了內部docker客戶端,使內部docker客戶端也可以訪問外部的docker daemon服務。否則後面註冊如果選擇了docker作為執行器時,因為是docker-in-docker模式,內部的docker將無法啟動。

  -v D:/docker/gitlab/gitlab-runner/config:/etc/gitlab-runner 是將runner的配置檔案對映到宿主機/home/gitlab-runner/config方便調整和檢視配置

安裝完成我們需要去註冊Gitlab-Runner。

2. 將gitlab專案或組註冊到gitlab-runner

開啟gitlab後臺某個專案裡面的設定,開啟runner,獲取配置資訊

  開始註冊runner
#首先進入runner容器
docker exec -it gitlab-runner bash

#開始註冊
gitlab-runner register -n  --url https://gitlab.com/  --registration-token REGISTRATION_TOKEN  --executor docker   --description "My Docker Runner"  --docker-image "docker:19.03.12"  --docker-privileged   --docker-volumes "/certs/client"

#url:後臺設定裡面的url
#token:後臺設定裡面的token
#executer:使用docker
#docker-image:docker映象,一定要使用19.03.12的版本

  執行成功後,檢視一下生成出來的配置檔案,在目錄  D:/docker/gitlab/gitlab-runner/config 下的config.toml

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "d25fbd515fd7"
  url = "http://192.168.1.106/"
  token = "osaKgBGS7yausc5t4KTg"
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "docker:19.03.12"
    privileged = true
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache","/certs/client"]
    shm_size = 0
   pull_policy="if-not-present"  #選擇優先使用本地快取的映象還是拉取最新的映象,官方有比較詳細的解釋。預設為always,在斷網或者想要加快ci執行的速度時貌似可以設定if-not-present。

  上面配置完成之後,開啟後臺設定CI/CD就可以看見一個可用的runner了

 

 三、在專案根目錄建立一個runner執行檔案

配置好runner後,我們把這個專案使用git拉下來本地,然後在專案根目錄建立兩個檔案,一個是  【.gitlab-ci.yml】,一個是【Dockerfile】

.gitlab-ci.yml

打包執行一個go語言的專案
image: golang:1.18.1

stages: # 分段
  - build
  - deploy

cache: # 快取
  paths:
    - dist

variables:
  DOCKER_TLS_CERTDIR: "/certs"
  

job_build:
  tags:
    - go
  stage: build
  script:
    - go env -w GOPROXY=https://goproxy.cn,direct
    - go build -o dist/main
    - ls -l
    - pwd

job_deploy:
  tags:
    - go
  image: docker:19.03.12
  only:
    - develop 
  services:
    - docker:19.03.12-dind
  stage: deploy
  script:
    - docker build -t goproject .
    - if [ $(docker ps -aq --filter name=goapp) ]; then docker rm -f goapp;fi   #如果存在執行的容器則刪除重建
    - docker run -e TZ="Asia/Shanghai" -d -p 980:80 --name goapp goproject
打包執行一個node專案
image: node:16.14

stages: # 分段
  - install
  - build
  - deploy

cache: # 快取
  paths:
    - node_modules
    - dist

variables:
  DOCKER_TLS_CERTDIR: "/certs"
  

job_install:
  tags:
    - web
  stage: install
  script:
    - npm install vue --save
    - npm install vue-router
    - npm install

job_build:
  tags:
    - web
  stage: build
  script:
    - npm install vue --save
    - npm install vue-router
    - npm run build

job_deploy:
  tags:
    - web 
  image: docker:19.03.12
  only:
    - develop 
  services:
    - docker:19.03.12-dind
  stage: deploy
  environment:
    name: web_test
    url: http://192.168.1.106:8080/
  script:
    - docker build -t appimages .
    - if [ $(docker ps -aq --filter name=app-container) ]; then docker rm -f app-container;fi
    - docker run -d -p 8880:80 -p 8080:8080 --name app-container appimages
引數說明  
stages
  例子中 stages 值為一個數組(p.s. 用 - 代表陣列和 markdown 類似)。包含了三個 job,test, build, deploy分別實現自動測試,打包專案和部署。下方的 stage 必須在全域性定義的 stages 內。
variables
  值為鍵值物件,為了後續的流程,此處定義了開發專案和部署專案的 namespace 和 repo_name。同 shell 類似,後續使用其值需要加上 $ 符號。定義的變數也有對應的作用域,定義在頂層就可以作為全域性變數供所有 job 使用,如果是一些 job 特有的變數,就定義在 job 內部。
before_script
  值為陣列,每一個元素其實就是一個 linux 命令,寫的時候裝作自己在寫 shell 就好。該部分主要生成了後續構建需要的映象標籤,切換當前目錄等。為了 debug 方便,這些變數最好列印。類似的,如果在 job 完成後有一些時候操作,可以定義 after_script。需要注意的是如果定義在頂層,內部的命令會在每個 job 執行之前執行,如果某些 job 需要特別的預操作,可以在 job 內部再配置一個 before_script 物件,它會複寫外部的全域性預操作。
test_stage
  名為 test 的 job 的具體配置,一般是個複合物件。
cache
  保留上一階段的檔案資料 stage   job 對應的 stage,如果有多個 job 對應同一個 stage,在執行時會並行執行這些 job。 script   這個 job 執行的命令,此處是進入的專案倉庫目錄,並且執行了一個 shell 指令碼,這個指令碼定義了執行專案的所有單元測試。一般建議如果要執行的命令過多,就把這些命令寫成指令碼放在專案內。CICD 流程直接執行這個指令碼。 build_stage   該步驟在測試通過的基礎上,把專案編譯打包,方便後續部署。 tag   用來選擇該標籤對應的註冊runner的例項,可以在gitlab後臺設定指定 only   only 指明瞭 job 的執行場景,可以是分支名,表明只有 master 分支可以執行 build,如果要用排除法反向指定,可以用 except。 

Dockefile檔案

FROM golang:1.18.1  #拉取一個映象
EXPOSE 8080 80  #對外暴露埠
WORKDIR /go/   #定義工作目錄,沒有則建立
COPY . /go/    #複製檔案
COPY dist/main main   
CMD ./main  容器啟動後執行命令

  

4、git commit、push 提交程式碼檢視結果

 

開啟docker ps檢視也會發現有一個容器在執行,後續每次提交都會自動構建釋出,一個簡單的CI/CD就完成了