以前項(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)目示例
- git-runner用戶需要執(zhí)行rancher config
- 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