欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

gitlab的runner实践

程序员文章站 2022-03-04 13:01:09
...

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

这意味着每有一个新项目,就需要在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上创建或更新应用。