基于 Gitlab + Harbor + K8s + Kuboard 的 CI 实践
CI/CD 概念
CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一种面向开发和运维团队的解决方案,CI/CD 主要针对在集成新代码时所引发的问题(亦称:“集成地狱”)。
具体而言,CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署)。
下图展示了当前比较典型的持续构建集成的一种做法。

大概流程为我们研发工程师代码提交到 GitLab 之后,使用 GitLab 的流水线自动编译打包 docker 镜像,提交到 Harbor,然后通知 Kuboard 进行自动拉取镜像,部署最新代码。
废话不多说,我们进入实战环节。
先决条件
请注意,因为 k8s 在1.20.x(包含)版本以后弃用 docker 运行容器而采用containerd ,因此本案例采用的是 1.19.5 版本的 k8s 集群,安装时请留意。
安装注册 GitLab Runner
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash
# 搜索可用版本
yum list gitlab-runner --showuplicates | sort -r
# 指定版本安装
yum install gitlab-runner-10.8.2-1 -y --nogpgcheck
# 注册 runner,executor 选择使用 docker,表示在 docker 容器中执行我们的 ci 流程
sudo gitlab-runner register -n \
--url http://gitlab.example.com/ \
--registration-token YOUR-REGISTRATION-TOKEN \
--executor docker \
--docker-image "docker:20.10.16" \
--docker-privileged \
--docker-volumes "/certs/client" \
--docker-volumes "/var/run/docker.sock:/var/run/docker.sock"
如何查看 registration-token?管理员账户登录GitLab,进入“管理区域”页面,左侧“概述”菜单下选择“Runners”,即可看到 registration-token。如下图

项目配置 .gitlab-ci.yml
自定义 maven 镜像
因为我们的后端项目需要从 maven 私服拉取二方库,因此需要在将私服的 settings 配置文件加入到镜像中去,以便后续在 docker 容器中编译代码时可以访问 maven 私服拉取依赖。
创建Dockerfile 如下:
FROM maven:3.6.3-jdk-11-slim
ADD ./settings.xml /root/.m2/settings.xml
然后执行命令构建并推送 maven 镜像至镜像私服。
# 构建 maven 镜像
docker build -f /path/to/your/Dockerfile . -t harbor.example.com/respository/maven:3.6.3-jdk-11-slim
# 推送至私服,推送前记得使用 docker login 登录私服
docker push harbor.example.com/respository/maven:3.6.3-jdk-11-slim
获取 Kuboard CI 脚本
Kuboard 获取 CI 脚本非常简单,找到需要集成的项目,然后选择 "CI/CD 集成",根据提示选择(没有则创建)秘钥即可获得脚本,此脚本用于在将 docker 镜像推送私服后,通知 Kuboard 更新镜像。如下图所示。


后端配置模板
在项目根目录创建 .gitlab-ci.yml 文件,以 Java 项目为例,配置文件内容模板如下:
image: docker:20.10.16
variables:
DOCKER_TLS_CERTDIR: "/certs"
MAVEN_OPTS: "-Dmaven.repo.local=$CI_PROJECT_DIR/.m2/repository"
# maven 缓存,不必每次打包都从远程仓库下载 jar 包
cache:
paths:
- .m2/repository
- target/*.jar
stages:
- build
- package
- deploy
build-jar:
# 流程节点使用的基础镜像,使用该镜像创建容器,在容器中执行 script 中所配置的命令
# 如果你是前端项目,可以变更改镜像,例如使用 node:latest,script 配置为 npm install build:prod
image: harbor.mgdaas-int.com/arch/maven:3.6.3-jdk-11-slim
stage: build
script:
- mvn clean package -DskipTests=true
artifacts:
paths:
- target/*.jar
cache:
paths:
- .m2/repository
build-docker-image:
stage: package
services:
- name: docker:dind
entrypoint: [ "dockerd-entrypoint.sh", "--tls=false" ]
before_script:
- docker login harbor.mgdaas-int.com --username admin --password Harbor123
script:
- docker build . -t harbor.mgdaas-int.com/mgdaas-gateway/mgdaas-gateway:latest
- docker push harbor.mgdaas-int.com/mgdaas-gateway/mgdaas-gateway:latest
notify-k8s:
stage: deploy
image: alpine:latest
script:
- sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories
- apk add --update curl
# 此处为我们在 Kuboard 获取到的 CI 脚本
- |
curl -X PUT \
-H "Content-Type: application/yaml" \
-H "Cookie: KuboardUsername=zhangzangqian; KuboardAccessKey=zcsee8ax35nx.53p74dj4zpstx5t8fs7p2722z76564xt" \
-d '{"kind":"deployments","namespace":"oa","name":"mgdaas-gateway"}' \
"http://kuboard.mgdaas-int.com/kuboard-api/cluster/default/kind/CICDApi/zhangzangqian/resource/restartWorkload"
如此提交代码之后便可以看到 GitLab CI/CD 的流水线开始自动运行了。


基于 Gitlab + Harbor + K8s + Kuboard 的 CI 实践的更多相关文章
- 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作
一.各个组件的功能描述: Docker 是一个开源的应用容器引擎. Jenkis 是一个开源自动化服务器. (1).负责监控gitlab代码.gitlab中配置文件的变动: (2).负责执行镜像文件的 ...
- 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)---Harbor的安装
前期安装文档:https://www.cnblogs.com/lq-93/p/11828626.html Harbor的作用: 开发提交代码至gitlab容器中,Jenkins拉取代码构建镜像 ...
- 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)
说明:前期的安装,请转向https://www.cnblogs.com/lq-93/p/11824039.html (4).查看gitlab镜像是否启动成功 docker inspect 容器id ...
- 部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了
部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了 安大虎 momenta 中台开发工程师 6 人赞同了该文章 就目前的形势看,一家公司的运维体系不承载在 Do ...
- [转] 基于Gitlab CI搭建持续集成环境
[From] https://blog.csdn.net/wGL3k77y9fR1k61T1aS/article/details/78798577 前言 本文是在12月12号迅雷@赵兵在前端早读课第三 ...
- 基于GitLab CI搭建Golang自动构建环境
基于GitLab CI搭建Golang自动构建环境 Golang发布遇到的问题 对于golang的发布,之前一直没有一套规范的发布流程,来看看之前发布流程: 方案一 开发者本地环境需要将环境变量文件改 ...
- QCon技术干货:个推基于Docker和Kubernetes的微服务实践
2016年伊始,Docker无比兴盛,如今Kubernetes万人瞩目.在这个无比需要创新与速度的时代,由容器.微服务.DevOps构成的云原生席卷整个IT界.在近期举办的QCon全球软件开发大会上, ...
- gitlab在k8s上运行的一些优化
由 林坤创建,最终由 林坤修改于七月02,2020 gitlab组件图 gitlab在k8s上占用资源 kubectl top pods -n default | grep git* gitlab-g ...
- Go Module实战:基于私有化仓库的GO模块使用实践
新年开工近一月,2021 年第一期 Open Talk 定档 3 月 18 日晚 8 点,本期我们邀请到了又拍云资深后端开发工程师刘云鹏和我们一起聊聊 Go 最新特性 Go Module 实战. 刘云 ...
- 基于gitlab 15.1 pages 搭建内部博客一定行版本
背景 基于 gitlab 15.1版 pages 搭建内部博客,参考官方文档,遇到一个又一个坑.之前看到别人吐槽说 gitlab 官方文档很差,我算是理解了.下面一个个说. 开始 按照官方文档的说法, ...
随机推荐
- yii 自定义form样式适应现成模板
需求:想使用下边的样式但是使用yii中的表单样式会 <?= $form->field($model, 'attribute_code')->textInput()->label ...
- 2022-07-10 第一小组 张明旭 前端CSS学习记录
今天是正式学习的第二天,昨天那个作业项目真的难,自己做一会就得问这问那,还有大神带一带(?_?)... 今天学习的内容是前端中的CSS,男上加男..... 知识点: Css层叠式表(网页美化) 1.定 ...
- 【LeetCode_15】——三数之和
今天做了力扣中的一道经典题:三数之和.这题思路倒是很快想到,调逻辑可把我调得够呛,这也正说明我的刷题思维远远不够,比起我室友半个月刷300多题的思维差远了...革命尚未成功,同志仍需努力. 原题链接: ...
- <c:forEach>循环获取下一次循环数据
<c:forEach>循环获取下一次循环数据 实现案例类似于多级导航栏下拉.双循环便利ul.li,利用外层循环的index获取数据.动态id设置. varLista[vs.index][l ...
- 枚举类list序列化与反序列化
//序列化 public class AuthTypeEnumListJsonSerializer extends JsonSerializer<List> { @Override pub ...
- python学习笔记5--正则表达式
正则表达式: 语法: import re #导入模块名 p = re.compile("^[0-9]") #生成要匹配的正则对象 , ^代表从开头匹配,[0-9]代表匹配0至9的任 ...
- HBuilder uniapp手机定位
// 获取当前位置 getPosition: function() { this.GetLocation(function(res) { if (res) { this.longitude = res ...
- c#控制台使用WebBrowser获取html问题
在主线程上打上 [STAThread]标记就行 在main()最后一句 添加Application.Run(); 就能使控制台像窗体一样持久运行而不是阻塞啥也不干 [STAThread]stati ...
- JAVA - 判断两个浮点数相等
JAVA - 判断两个浮点数相等 背景知识 float型和double型是JAVA的基本类型,用于浮点数表示,在JAVA中float型占4个字节32位,double型占8个字节64位,一般比较适合用于 ...
- Navicat 通过ssh链接远程数据库
首先需要下载一个Navicat数据库管理工具,有了Navicat工具需要完成一下步骤就可以实现本地链接远程数据库了 一.打开Navicat,点击连接按钮,找到MySQL并点击 二.点击"常规 ...