# gitlab的runner实践

公司的项目有个特点:项目多。

这意味着每有一个新项目,就需要在gitlab,jenkins,k8s上新建对应的项目。

虽然每次配置只花10分钟,但这种重复的劳动终究不是我们想要的。

仔细一看,发现每次新建项目基本是改下名字,其他配置都没怎么改过,于是便有了改造思路:

  1. 去掉中间商jenkins(jenkins是很优秀的,这里不用它是为了偷懒)

  2. 利用gitlab的runner来做CI/CD

# CI/CD 流程

去掉jenkins后,代码的打包发布工作就交给了gitlab的Runner。

Runner是一个干活的,整个流程如下:

提交代码 -> 触发 gitlab Runner 
            -> 打包代码
                      -> 发布

代码提交后,Runner会根据.gitlab-ci.yml的配置来工作,该打包的打包,该发布的发布。

这里有个问题:怎么区分不同的环境呢?

我们的做法是把环境和分支结合在一起。

分支名 环境
dev 开发环境
test 测试环境
release 正式环境

在对应分支上提交代码,Runner会自动打包到对应的环境中。

# Runner使用示例

Runner的安装就不赘述了,可以用docker,可以放k8s里,也可以直接放某台服务器上。

我们的方案是:每个项目组都配置一个Runner,使用不同的.gitlab-ci.yml。

# 前端gitlab-ci.yml

cache:
  paths:
    - node_modules # 缓存 node_modules
stages:
  - install
  - build
  - deploy

install:
  stage: install
  only:
    - test
    - release 
  script:
    - yarn config set registry http://registry.npm.taobao.org/
    - yarn

build:
  stage: build
  only:
    - release
    - test
  script:
    - yarn build
  artifacts:
    paths:
      - dist

deploy:
  stage: deploy
  only:
    - release
    - test
  script:
    - python3 /opt/script/oss.py `pwd`/dist  ${CI_PROJECT_NAME} ${CI_COMMIT_REF_NAME}

说明:

  1. 在deploy阶段,脚本oss.py会根据变量CI_PROJECT_NAME和CI_COMMIT_REF_NAME,把代码发布到对应的环境中。

# 后端gitlab-ci.yml

variables:
  DOCKER_REGISTRY: 'registry.cn-shenzhen.aliyuncs.com' # docker镜像仓库地址
  DOCKER_NAMESAPCE: 'xxxxx' # docker镜像仓库名

stages:
  - build
  - deploy

build:
  stage: build
  only:
    - release
    - test
  script:
    - TAG=`python3 /opt/script/get_docker_tag.py ${CI_PROJECT_NAME}-${CI_COMMIT_REF_NAME}`
    - DOCKER_TAG=${CI_COMMIT_REF_NAME}${TAG}
    - echo "DOCKER_TAG=${DOCKER_TAG}" >> build.env
    - docker build -t ${CI_PROJECT_NAME}:${DOCKER_TAG} .
    - docker tag ${CI_PROJECT_NAME}:${DOCKER_TAG} ${DOCKER_REGISTRY}/${DOCKER_NAMESAPCE}/${CI_PROJECT_NAME}:${DOCKER_TAG}
    - docker push ${DOCKER_REGISTRY}/${DOCKER_NAMESAPCE}/${CI_PROJECT_NAME}:${DOCKER_TAG}
  artifacts:
    reports:
      dotenv: build.env

deploy:
  stage: deploy
  only:
    - release
    - test
  script:
    - python3 /opt/script/k8s.py ${CI_PROJECT_NAME} ${DOCKER_TAG}
  dependencies:
    - build

说明:

1.为了使docker镜像的tag好看一点,写了个get_docker_tag.py脚本来产生自增id,和变量CI_COMMIT_REF_NAME组合成一个tag变量DOCKER_TAG,比如会是test1, release2这样的。

2.在deploy阶段,脚本k8s.py会根据变量CI_PROJECT_NAME和DOCKER_TAG,在k8s上创建或更新应用。