GitLab+Docker快速搭建CI/CD自動化部署


什么是持續集成(Continuous integration)?

CI

在持續集成環境中,開發人員將會頻繁得提交代碼到主干。這些新提交在最終合並到主線之前,都需要通過編譯和自動化測試進行驗證。這樣做是基於之前持續集成過程中很重視自動化測試驗證結果,以保障所有得提交在合並主干之后得質量問題,對可能出現得一些問題進行預計。

持續交付(Continuous Delivery)

持續交付就是講得應用發布出去的過程。這個過程可以確保盡量可能快的實現交付。這就意味着除了自動化測試,還需要有自動化的發布流,以及通過一個按鍵就可以隨時隨地實現應用的部署上線

通過持續交付,可以決定每天,每周,每兩周發布一次,這完全可以根據自己的業務進行設置。

但是,如果真的希望體驗持續交付的優勢,就需要先進行小批量發布,盡快部署到生產線,以便在出現問題時方便進行故障排除。

持續部署(Continuous Deployment)

如果想更加深入一步的話,就是持續部署了。通過這個方式,任何修改通過了所有已有的工作流就會直接和客戶見面。沒有人為干預(沒有一鍵部署按鈕),只有當一個修改在工作流中構建失敗才能阻止它部署到產品線。

持續部署是一個很優秀的方式,可以加速與客戶的反饋循環,但是會給團隊帶來壓力,因為不再有"發布日"了。開發人員可以專注於構建軟件,他們看到他們修改在他們完成工作后幾分鍾就上線了。基本上,當開發人員在主分支合並一個提交時,這個分支將被構建,測試,如果一切順利,則部署到生產環境中。

持續集成需求

  • 持續集成是通過平台串聯各個開發環節,實現和沉淀工作自動化的方法。
  • 線上代碼和代碼倉庫不同步,影響迭代和團隊協作。
  • 靜態資源發布依賴人工,浪費開發人力。
  • 缺少自動化測試,產品質量得不到保障
  • 文案簡單修改上線,需要技術介入。

Gitlab

Gitlab是一個開源的版本管理系統,實現一個自托管的Git項目倉庫,可通過Web界面進行訪問公開的或者私人項目。它擁有與Github類似的功能,能夠瀏覽源碼,管理缺陷和注釋,可以管理團隊對倉庫的訪問,它非常易於瀏覽提交的版本並提供一個文件歷史庫。團隊成員可以利用內置的簡單的聊天程序進行交流。它還提供一個代碼片段收集功能可以實現代碼復用。

GitLab對於系統性能有要求,所以需要將克隆出來的虛擬機的內存提高到至少2G以上。

Gitlab安裝

方法一:

sudo docker run --detach \
  --hostname localhost \
  --publish 443:443 --publish 8084:8084 --publish 222:22 \
  --name gitlab \
  --restart always \
  --volume /home/docker/gitlab/config:/etc/gitlab \
  --volume /home/docker/gitlab/logs:/var/log/gitlab \
  --volume /home/docker/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce:latest 

localhost:主機名,即虛擬機的ip,8084可以自己定義端口號,restart重啟方式,volume目錄掛載,gitlab/gitlab-ce:latest鏡像名。

方法二:

docker pull twang2218/gitlab-ce-zh 

等待其拉取,然后在 /home下新建docker目錄,再在其下新建gitlab目錄,進入gitlab目錄,在當前目錄下新建docker-compose.yml配置文件,編寫內容如下。

version: '3'
services:
   web:
     image: 'twang2218/gitlab-ce-zh'   #gitlab鏡像
     restart: always
     privileged: true  #權限
     hostname: ''       #主機名,即虛擬機的ip
     environment:
        TZ: 'Asia/Shanghai'
        GITLAB_OMNIBUS_CONFIG: |
            external_url '' #主機名,即虛擬機的ip
            gitlab_rails['gitlab_shell_ssh_port'] = 2222
            unicorn['port'] = 8888
            nginx['listen_port'] = 8084
     ports:
        - '8084:8084'
        - '8443:443'
        - '2222:22'
     volumes:
        - './config:/etc/gitlab'
        - './logs:/var/log/gitlab'
        - './data:/var/opt/gitlab' 

執行docker-compose up,然后進入等待時間,等它下好了去通過自己設置的虛擬機的ip和端口號訪問。

如果安裝過程中有報錯權限問題,那么加上privileged: true

查看方式:

root@iZm5ebvlfc3n55vzckl9ifZ:# docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                 PORTS                                                                         NAMES
ddc7d0e214ef        twang2218/gitlab-ce-zh        "/assets/wrapper"        30 hours ago        Up 6 hours (healthy)   80/tcp, 0.0.0.0:8084->8084/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp   gitlab_web_1 

通過虛擬主機的ip+端口訪問,此時需要設置管理員密碼,賬號為root,密碼最少為8位。

登錄成功后,如下:

項目創建

點擊 + 號 --> 新建項目

輸入項目名稱及描述信息,設置可見等級:私有,內部,公開。

初始化項目

可以選擇通過增加一個README的方式來初始化項目,如下:

創建項目的時候有一個問題,在自己最開始定義了端口號,創建項目的時候會沒有端口號,這時候clone項目的時候會訪問不了,這時候在最開始安裝定義目錄里面config目錄下找到gitlab.rb,編輯它,搜索external_url,沒有就添加external_url:主機ip+端口號,有就修改就行了。這時候就可以去克隆項目了。當然也可以通過下面方法去把項目推送到gitlab上面:

Gitlab-Runner

安裝

sudo docker run -d --name gitlab-runner --restart always \
  -v /home/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容器 -v /home/gitlab-runner/config:/etc/gitlab-runner是將runner的配置文件映射到宿主機/home/gitlab-runner/config方便調整和查看配置

安裝完成需要去注冊Gitlab-Runner。

運行docker ps查看:

root@iZm5ebvlfc3n55vzckl9ifZ:/home/docker/gitlab# docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                 PORTS                                                                         NAMES
ed6c7a038263        gitlab/gitlab-runner:latest   "/usr/bin/dumb-init …"   24 hours ago        Up 24 hours                                                                                          gitlab-runner
ddc7d0e214ef        twang2218/gitlab-ce-zh        "/assets/wrapper"        30 hours ago        Up 6 hours (healthy)   80/tcp, 0.0.0.0:8084->8084/tcp, 0.0.0.0:2222->22/tcp, 0.0.0.0:8443->443/tcp   gitlab_web_1 

注冊

docker run --rm -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register \
  --non-interactive \
  --executor "docker" \
  --docker-image alpine:latest \
  --url "" \
  --registration-token "" \
  --description "first-register-runner" \
  --tag-list "vue3-app" \
  --run-untagged="true" \
  --locked="false" \
  --access-level="not_protected" 

注冊需要輸出url,token,描述,tag,執行器等,url和token怎么來的呢?在設置->CI/CD->Runner里面,這里面注冊了一個專用的和共享的Runner,正常情況用專用Runner就可以了。共享版Runner是登錄root賬戶在頭部小扳手圖片里面的Runner得到url和token,然后去注冊。這里面的tag值會在編寫.gitlab-ci.yml時用到。

運行流水線

在項目根目錄里面創建一個.gitlab-ci.yml,編寫代碼如下:

image: node:alpine

stages: # 分段
  - install
  - eslint
  - build
  - deploy

cache: # 緩存
  paths:
    - node_modules

job_install:
  tags:
    - vue3-app
  stage: install
  script:
    - npm install

job_build:
  tags:
    - vue3-app
  stage: build
  script:
    - npm run build 

參數說明:

  • stages:pipeline的階段列表,定義整個pipeline階段
  • stage:定義某個job的所在階段
  • image:指定一個基礎Docker進行作為基礎運行環境,比如:node,python,java
  • tags:用於指定Runner,tags的取值范圍是在該項目可惜可見的runner tags中,也就是前面設置的那個tag
  • only/except:知道當前任務條件
  • when:實現在發生故障時仍能運行的作業
  • cache:講當前工作環境目錄中的一些文件,文件夾存儲起來,用於在各個任務初始化的時候恢復
  • environment:指定部署相關任務的環境,並非真實環境,是對要部署到某環境的任務的歸類。方便在gitlab上聚合以便進行回滾和重新部署操作
  • artifacts:保留文檔。在每次 job 之前runner會清除未被 git 跟蹤的文件。為了讓編譯或其他操作后的產物可以留存到后續使用,添加該參數並設置保留的目錄,保留時間等。被保留的文件將被上傳到gitlab以備后續使用。
  • dependencies:任務依賴。指定job的前置job。添加該參數后,可以獲取到前置job的artifacts。注意如果前置 job 執行失敗,導致沒能生成artifacts,則 job 也會直接失敗。

編寫好上面代碼后推送到gitlab后就會自己執行里面的語句:

部署

在項目中創建一個Dockerfile,代碼如下:

FROM node:latest as builder
WORKDIR /app
COPY  package.json
RUN npm install --registry=http://registry.npm.taobao.org
COPY ..
RUN npm run build

FROM nginx:latest
COPY --from=builder /app/dist /usr/share/nginx/html 

.gitlab-ci.yml修改如下:

image: node:alpine

stages: # 分段
  - install
  - eslint
  - build
  - deploy

cache: # 緩存
  paths:
    - node_modules

job_install:
  tags:
    - vue3-app
  stage: install
  script:
    - npm install

job_build:
  tags:
    - vue3-app
  stage: build
  script:
    - npm run build

job_deploy:
    image: docker
    stage: deploy
    script:
      - docker build -t appimages
      - if [ $(docker ps -aq --filter name=app-container) ]; then docker rm -f app-container;fi
      - docker run -d -p 8082:80 --name app-container appimages 

if語句判斷:使用docker命令去搜索docker容器里面是否有一個name為app-container的容器,如果有就銷毀掉,銷毀掉是為了使用新的容器重新運行。

這里image:docker不寫的話會報錯:

代碼推送后,流水線工作,到第三步就會出下報錯:

解決辦法,在runner配置文件中配置docker命令:

"/usr/bin/docker:/usr/bin/docker", "/var/run/docker.sock:/var/run/docker.sock" 

 

在gitlab-runner->config-vim config.toml,找到注冊runner所對應的token,在volumes數組里面加入上面命令:

concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800
  
[[runners]]
  name = "first-register-runner"
  url = ""
  token = ""
  executor = "docker"
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]
    [runners.cache.azure]
  [runners.docker]
    tls_verify = false
    image = "alpine:latest"
    privileged = false
    disable_entrypoint_overwrite = false
    oom_kill_disable = false
    disable_cache = false
    volumes = ["/cache","/usr/bin/docker:/usr/bin/docker", "/var/run/docker.sock:/var/run/docker.sock"]
    shm_size = 0 

再去重新運行失敗的Jobs,這時候發現成功了:

然后通過前面注冊的端口號去訪問,可以正常訪問項目。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM