是什么
随着容器化技术的发展。开发运维一体化越来越重要,开发人员除了自己开发应用,还需要自己将应用发布,快速迭代。
gitlabCI 是 gitlab 自带的持续集成系统,配合 gitlab-runner 可以满足很多 CICD 的需求。
为什么(要用 gitlab-runner )
互联网企业大都使用gitlab来托管自己的代码,gitlabCI 为 gitlab 自带,可以很好的和 gitlab 交互;
与其他构建工具如 Jenkins 相比:
- gitlabCI 不需要额外安装其他软件;
- 使用 YAML 语言来配置;
- web 应用构建较为简洁;
怎么做
前置条件
devOps 基础概念,CICD 基本流程,linux 基本操作,了解 docker 镜像
开发需求
- gitlab 服务(内存要求4G以上,不然会卡顿,甚至不能启动)
- gitlab-runner 服务
- nginx 服务 有条件可以多台机器部署,也可以安装到一台服务器,容器化部署 本次我使用了三台服务器(不是必须) | 配置 | 应用名称 | 目的 | |------|------------|------------| | 2u4g | gitlab | 提供gitlab服务(不能继续启动其他服务,gitlab会卡顿)| | 1u2g | gitlab-runner、nginx | 1、gitlab-runner注册到gitlabCI中心,提供作业服务;2、nginx为一个节点 |
如果服务器资源紧张,可以借助 github 提供的 action 功能
执行环境
- centos7;
- gitlab.13.5.4;
- gitlab-runner13.6.0;(gitlab-runner 与 gitlab 大版本需要一样)
- 镜像仓库:阿里云镜像仓库个人版(免费)(可以用其他如 nexus 等)
基本流程
开发完成,触发 webhook(push, tag, pr等),gitlabCI 接听到 webhook 请求,根据 gitlab-ci.yml 配置,调用 gitlab-runner 来执行相应操作;gitlab-runner 拉取代码后,npm run build 生成dist文件,然后在将 dist 文件打包成一个以 nginx 为基底的镜像,同时将它上传至镜像仓库;同时前端服务器拉取新版镜像直接启动容器;
开发过程
1、安装好 gitlab;
2、安装 gitlab-runner; 本方案使用的docker安装
因为本实例 gitlab-runner 安装在docker中,容器内部要使用 docker 的功能,此处需要将宿主机的 docker.sock,bind 到容器内部,同时,因为要在里面构建镜像,我们需要拥有 docker 命令,我们将 usr/bin/docker:/usr/bin/docker 文件也挂载到容器内部
docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
gitlab/gitlab-runner:latest
安装好 gitlab-runner之后,我们通过指令进入到 gitlab-runner 容器内部,使用 gitlab-runner -h是否正确安装
正确安装之后,我们开始注册 gitlab-runner 注意事项,我们需要给 runner 绑定 docker.sock 到内部的 docker容 器里面 --docker-image 设置的是基础镜像,此处看自己要求可以自由填写,也可以填 node:12-alpine
gitlab-runner register -n --url 自己的url --registration-token 自己的token --executor docker --description "web-e-commerce " --tag-list "build,deploy" --docker-image "docker:latest" --docker-volumes /var/run/docker.sock:/var/run/docker.sock
3、项目中注册号 gitlab-runner,登录 gitlab ,用管理员身份,查看 runner 情况,如下图
4、在项目根目录添加 gitlab-ci.yml 文件;
stages:
- build
- deploy
cache: # 缓存
paths:
- dist
develop:
stage: build
tags:
- build
image: node:12-alpine
only:
refs:
- develop
script:
- node -v
- npm config set registry ="https://registry.npm.taobao.org"
- npm i && npm run build
- echo ' develop npm run build'
deploy:
stage: deploy
when: on_success
image: docker:latest
tags:
- deploy
before_script:
- "command -v ssh-agent >/dev/null || ( apt-get update -y && apt-get install openssh-client -y )"
- eval $(ssh-agent -s)
# 此处SSH_PRIVATE_KEY定义在gitlab的cicd常量中
- echo "$SSH_PRIVATE_KEY" | tr -d '\r' | ssh-add -
- mkdir -p ~/.ssh
- chmod 700 ~/.ssh
- touch ~/.ssh/config
script:
- TIME=$(date "+%Y%m%d%H%M%S")
- echo "${TIME}"
- docker -v
# 此处DOCKER_HUB_PWD定义在gitlab的cicd常量中
- echo "$DOCKER_HUB_PWD" | docker login --username=1037796421@qq.com registry.cn-hangzhou.aliyuncs.com --password-stdin
- docker build -t registry.cn-hangzhou.aliyuncs.com/lidy-web/lidy-web/web-e-commerce-${TIME} .
- docker push registry.cn-hangzhou.aliyuncs.com/lidy-web/lidy-web/web-e-commerce-${TIME}
- echo "publish image success"
- chmod a+x bin/start.sh
- scp -o StrictHostKeyChecking=no bin/start.sh root@47.94.238.36:~
- ssh -o StrictHostKeyChecking=no root@47.94.238.36 "sh /root/start.sh $TIME"
- echo 'deploy success'
此处注意事项:
- 要想 login 到镜像仓库,需要提前将镜像仓库地址注册到 docker 中,在宿主机中添加 insecure-registries ,如下图:
- 新版本镜像仓库不支持 -u:u -p:p 明文登录方式;
- 推送镜像之前,需要打 tag,tag 的前缀为当前镜像仓库的地址,此处为阿里云镜像仓库,具体配置如下:
- 由于本次构建依赖的基础镜像为 docker:latest ,其底层镜像为 alpine ,包括ssh,curl在内的一些工具是没有的,我们需要预先安装好;
- gitlab 中,项目可以配置 CI/CD 常量,建议将密码,私钥等隐私信息配置在里面; *此处的 shart.sh 可以简单的写几句脚本,也可以直接写在 ym l文件中,如下:
#!/bin/sh
TIME="$1"
IMAGE_NAME="registry.cn-hangzhou.aliyuncs.com/lidy-web/lidy-web/web-e-commerce-${TIME}"
if [ "docker ps -a | grep gitlab-ci-test " ]
then echo 'yes, have gitlab-ci-test' && docker stop gitlab-ci-test && docker rm gitlab-ci-test
else echo 'not, you do not have gitlab-ci-test'
fi
docker run -p 80:80 -itd --name gitlab-ci-test --restart always ${IMAGE_NAME}
后期会实现用版本工具管理镜像发布,按照版本发布,可以方便实现回滚管理;后期会实现用 asible 组成集群或者 k8s 管理发布,希望能帮助到大家。