gitlab的runner实践
公司的项目有个特点:项目多。
这意味着每有一个新项目,就需要在gitlab,jenkins,k8s上新建对应的项目。
虽然每次配置只花10分钟,但这种重复的劳动终究不是我们想要的。
仔细一看,发现每次新建项目基本是改下名字,其他配置都没怎么改过,于是便有了改造思路:
-
去掉中间商jenkins(jenkins是很优秀的,这里不用它是为了偷懒)
-
利用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}
说明:
- 在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上创建或更新应用。
上一篇: javascript怎么对数组求和
下一篇: Konga面板接入LDAP踩坑实战