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.sock
與Docker
守護程序通訊,管理其他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就完成了