使用Gitlab+Rancher實(shí)現(xiàn)自動部署測試環(huán)境

以前項(xiàng)目使用jenkins打包部署環(huán)境,用了一段時間,發(fā)現(xiàn)jenkins太過臃腫了,java進(jìn)程動不動就占用幾個G的內(nèi)存,實(shí)在吃不消。

最近項(xiàng)目代碼全部遷移到了gitlab做統(tǒng)一管理。查看了官方文檔,發(fā)現(xiàn)自帶的ci/cd功能,只需要把部署過程定義在.gitlab-ci.yml文件中即可,十分方便。實(shí)際過程使用,使用很簡單,所有工作,全部在.gitlab-ci.yml完成即可,比jenkins好太多了。

以下是過程記錄,會對部分內(nèi)容做解釋,以便記憶。

Gitlab-runner部署

Centos7 安裝Gitlab-runner

Gitlab-runner建議安裝在一臺獨(dú)立的服務(wù)器上,我這里是docker、rancher安裝在一起


$ curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash

$ yum install gitlab-runner -y

Gitlab-runner注冊

gitlab支持多種方式的runner,通常使用以下兩種配置

獨(dú)享的runner配置:Project -> Settings -> CI/CD -> Runners settings

共享的runner配置:Admin area -> Overview -> Runners


$ gitlab-runner register    # 注冊runner

Running in system-mode.                           



Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):

http://10.10.0.3/  # gitlab服務(wù)器地址

Please enter the gitlab-ci token for this runner:

U-pS5ZVAeq-MhFmkxCyJ    # 訪問gitlab的token,見runner配置頁

Please enter the gitlab-ci description for this runner:

[public]:  # runner描述

Please enter the gitlab-ci tags for this runner (comma separated):

public-tag  # runner標(biāo)記

Registering runner... succeeded                    runner=U-pS5ZVA

Please enter the executor: ssh, docker+machine, kubernetes, docker, docker-ssh, parallels, shell, virtualbox, docker-ssh+machine:

shell      # 選擇執(zhí)行器,這里選擇shell

Runner registered successfully. Feel free to start it, but if it's running already the config should be automatically reloaded!

$ cat /etc/gitlab-runner/config.toml # 配置文件,配置成功后自動生成

測試


$ usermod -aG docker gitlab-runner      # 加入docker組

$ sudo -u gitlab-runner -H docker info  # 測試docker命令

$ gitlab-ci-multi-runner verify        # 檢查runner狀態(tài)

$ su - gitlab-runner                    # 切換到gitlab-runner用戶,默認(rèn)使用該用戶部署

$ ls /home/gitlab-runner/builds/43eee0a1/0/test/deploy_text    # 項(xiàng)目目錄

Gitlab部署示例

測試示例

項(xiàng)目結(jié)構(gòu)


- apps

    - backend      # 后臺項(xiàng)目目錄

        - api      # 后臺項(xiàng)目APP源代碼目錄

            - Dockerfile

            - run.py

            - requirements.txt

        - web

        - app

    - frontend      # 前端項(xiàng)目目錄

        - wx        # 前端項(xiàng)目APP源代碼目錄

        - web

- config            # 公共項(xiàng)目配置文件

    - nginx_web.conf

    - supervisord_web.conf

    - ...

- doc              # 項(xiàng)目文檔及API等

    - spring1

    - sprint2

- .gitignore        # git的忽略文件

- .gitlab-ci.yml    # gitlab部署文件

- docker-compose.yml            # 測試環(huán)境docker-compose

- rancher-compose.yml          # 測試環(huán)境rancher-compose

- docker-compose-pro.yml        # 生產(chǎn)環(huán)境docker-compose

- rancher-compose-pro.yml      # 生產(chǎn)環(huán)境rancher-compose

容器命名規(guī)范

倉庫地址/項(xiàng)目路徑/分支名稱/APP名稱:v打包ID

registry.registry:5000/test/deploy-text/master/test:v217

registry.registry:5000/test/deploy-text/master/test:latest

所有字母全部小寫和 : - / 三種合法的字符

.gitlab-ci.yml


variables:

  #CI_DEBUG_TRACE: "true"      # 調(diào)試使用

  REGISTRY_HOST: "registry.registry:5000"  # 本地鏡像

  BASE_IMAGE: "$REGISTRY_HOST/$CI_PROJECT_PATH/$CI_COMMIT_REF_NAME" # 鏡像前綴

  TEST_APP: "test"

before_script:  # gitlab流水線過程執(zhí)行前的腳本

  - export TEST_IMAGE="$BASE_IMAGE/$TEST_APP:v$CI_PIPELINE_ID"  # 當(dāng)前版本的鏡像

  - export TEST_IMAGE_LATEST="$BASE_IMAGE/$TEST_APP:latest"    # 最新的鏡像

stages:

  - build  # 定義build階段

build_test:

  stage: build  # job屬于build階段

  script:

    - docker build -t $TEST_IMAGE ./backend/app/.

    - docker tag $TEST_IMAGE $TEST_IMAGE_LATEST

    - docker push $TEST_IMAGE

    - docker push $TEST_IMAGE_LATEST

  tags:

    - public-tag    # runner配置了tags,則必須指定tags

實(shí)際項(xiàng)目示例

  1. git-runner用戶需要執(zhí)行rancher config
  1. dockerfile add命令只支持相對路徑

gitlab.yml

定時任務(wù)配置:Project -> Settings -> CI/CD -> Schedules


variables:

  #CI_DEBUG_TRACE: "true"

  REGISTRY_HOST: "registry.registry:5000"

  BASE_IMAGE: "$REGISTRY_HOST/$CI_PROJECT_PATH/$CI_COMMIT_REF_NAME"

  STACK: "cht-v$CI_COMMIT_REF_NAME"

  WEB_APP: "web"

  API_APP: "api"

before_script:

  - export WEB_IMAGE="$BASE_IMAGE/$WEB_APP:v$CI_PIPELINE_ID"

  - export WEB_IMAGE_LATEST="$BASE_IMAGE/$WEB_APP:latest"

  - export API_IMAGE="$BASE_IMAGE/$API_APP:v$CI_PIPELINE_ID"

  - export API_IMAGE_LATEST="$BASE_IMAGE/$API_APP:latest"

  - export TAG=$CI_COMMIT_REF_NAME

  - cp -rf ./config/*api.conf ./apps/backend/api/

  - cp -rf ./config/*web.conf ./apps/backend/web/

  - cp -rf ./apps/frontend/web/dist/ ./apps/backend/web/www

stages:

  - build

  - deploy

build_web:

  stage: build

  script:

    - docker build -t $WEB_IMAGE ./apps/backend/web/.

    - docker tag $WEB_IMAGE $WEB_IMAGE_LATEST

    - docker push $WEB_IMAGE

    - docker push $WEB_IMAGE_LATEST

  tags:

    - public-tag

  only:

    - schedules    # 不使用默認(rèn)的commit觸發(fā),該由定時任務(wù)觸發(fā)構(gòu)建,減少無意義的構(gòu)建

  except:

    - master

build_api:

  stage: build

  script:

    - docker build -t $API_IMAGE ./apps/backend/api/.

    - docker tag $API_IMAGE $API_IMAGE_LATEST

    - docker push $API_IMAGE

    - docker push $API_IMAGE_LATEST

  tags:

    - public-tag

  only:

    - schedules

  except:

    - master

deploy_test:

  stage: deploy

  script:

    - rancher up -d -u -p -c -s $STACK  # 調(diào)用rancher的命令部署

  tags:

    - public-tag

  only:

    - schedules

  except:

    - master

docker-compose.yml


version: '2'

services:

  web:

    image: "${WEB_IMAGE_LATEST}"    # 使用gitlab-ci.yml export的環(huán)境變量

    stdin_open: true

    tty: true

    restart: always

    links:

      - pgsql:pgsql

      - redis:redis

    volumes:

      - /data/${TAG}/static_file:/data/www/static_file

      - /data/${TAG}/dm_log:/data/log

    labels:

      io.rancher.container.pull_image: always

      io.rancher.scheduler.affinity:host_label: io.rancher.server.role=agent1

  api:

    image: "${API_IMAGE_LATEST}"

    stdin_open: true

    tty: true

    restart: always

    links:

      - pgsql:pgsql

      - redis:redis

    volumes:

      - /data/${TAG}/static_file:/data/www/static_file

      - /data/${TAG}/wx_log:/data/log

    labels:

      io.rancher.container.pull_image: always

      io.rancher.scheduler.affinity:host_label: io.rancher.server.role=agent1

  idgen:

    image: registry.registry:5000/cht2idgen

    stdin_open: true

    tty: true

    restart: always

    environment:

      PROJECT_NAME: 16youlu_cht2idgen

      SYSLOG_HOST: 10.10.0.63

      SYSLOG_PORT: 12201

      SYSLOG_LEVEL: DEBUG

    links:

      - redis:redis

    labels:

      io.rancher.container.pull_image: always

      io.rancher.scheduler.affinity:host_label: io.rancher.server.role=agent1

  pgsql:

    image: postgres

    environment:

      POSTGRES_DB: test

      POSTGRES_PASSWORD: test123456

      POSTGRES_USER: test

    stdin_open: true

    tty: true

    restart: always

    volumes:

      - /data/${TAG}/pgsql_data:/var/lib/postgresql/data

    labels:

      io.rancher.container.pull_image: always

      io.rancher.scheduler.affinity:host_label: io.rancher.server.role=agent1

  redis:

    image: redis

    stdin_open: true

    tty: true

    restart: always

    labels:

      io.rancher.container.pull_image: always

      io.rancher.scheduler.affinity:host_label: io.rancher.server.role=agent1

參考資料

https://docs.gitlab.com/runner/configuration/advanced-configuration.html

https://docs.gitlab.com/ce/ci/variables/README.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容