CI/CD 概念

CI/CD 是一种通过在应用开发阶段引入自动化来频繁向客户交付应用的方法。CI/CD 的核心概念是持续集成、持续交付和持续部署。作为一种面向开发和运维团队的解决方案,CI/CD 主要针对在集成新代码时所引发的问题(亦称:“集成地狱”)。

具体而言,CI/CD 可让持续自动化和持续监控贯穿于应用的整个生命周期(从集成和测试阶段,到交付和部署)。

下图展示了当前比较典型的持续构建集成的一种做法。

大概流程为我们研发工程师代码提交到 GitLab 之后,使用 GitLab 的流水线自动编译打包 docker 镜像,提交到 Harbor,然后通知 Kuboard 进行自动拉取镜像,部署最新代码。

废话不多说,我们进入实战环节。

先决条件

  1. 搭建 GitLab 服务
  2. 搭建 Harbor 服务
  3. 搭建 K8s 集群以及 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 实践的更多相关文章

  1. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作

    一.各个组件的功能描述: Docker 是一个开源的应用容器引擎. Jenkis 是一个开源自动化服务器. (1).负责监控gitlab代码.gitlab中配置文件的变动: (2).负责执行镜像文件的 ...

  2. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)---Harbor的安装

    前期安装文档:https://www.cnblogs.com/lq-93/p/11828626.html Harbor的作用:     开发提交代码至gitlab容器中,Jenkins拉取代码构建镜像 ...

  3. 基于docker搭建Jenkins+Gitlab+Harbor+Rancher架构实现CI/CD操作(续)

    说明:前期的安装,请转向https://www.cnblogs.com/lq-93/p/11824039.html (4).查看gitlab镜像是否启动成功 docker inspect  容器id  ...

  4. 部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了

    部署基于Gitlab+Docker+Rancher+Harbor的前端项目这一篇就够了 安大虎 ​ momenta 中台开发工程师 6 人赞同了该文章 就目前的形势看,一家公司的运维体系不承载在 Do ...

  5. [转] 基于Gitlab CI搭建持续集成环境

    [From] https://blog.csdn.net/wGL3k77y9fR1k61T1aS/article/details/78798577 前言 本文是在12月12号迅雷@赵兵在前端早读课第三 ...

  6. 基于GitLab CI搭建Golang自动构建环境

    基于GitLab CI搭建Golang自动构建环境 Golang发布遇到的问题 对于golang的发布,之前一直没有一套规范的发布流程,来看看之前发布流程: 方案一 开发者本地环境需要将环境变量文件改 ...

  7. QCon技术干货:个推基于Docker和Kubernetes的微服务实践

    2016年伊始,Docker无比兴盛,如今Kubernetes万人瞩目.在这个无比需要创新与速度的时代,由容器.微服务.DevOps构成的云原生席卷整个IT界.在近期举办的QCon全球软件开发大会上, ...

  8. gitlab在k8s上运行的一些优化

    由 林坤创建,最终由 林坤修改于七月02,2020 gitlab组件图 gitlab在k8s上占用资源 kubectl top pods -n default | grep git* gitlab-g ...

  9. Go Module实战:基于私有化仓库的GO模块使用实践

    新年开工近一月,2021 年第一期 Open Talk 定档 3 月 18 日晚 8 点,本期我们邀请到了又拍云资深后端开发工程师刘云鹏和我们一起聊聊 Go 最新特性 Go Module 实战. 刘云 ...

  10. 基于gitlab 15.1 pages 搭建内部博客一定行版本

    背景 基于 gitlab 15.1版 pages 搭建内部博客,参考官方文档,遇到一个又一个坑.之前看到别人吐槽说 gitlab 官方文档很差,我算是理解了.下面一个个说. 开始 按照官方文档的说法, ...

随机推荐

  1. demo----日常报错

    yolov5:报错1:OMP: Error #15: Initializing libiomp5md.dll, but found libiomp5md.dll already initialized ...

  2. 小凡的Python之路——启航

    小凡,经过自己的努力考上了一所普通的二本大学.高考填写志愿的时候,根本不知道选择什么专业,稀里糊涂的被调剂到"应用统计学". 老师和同学都说,现在是大数据时代,数据分析现在是热门岗 ...

  3. WEB攻击与防御技术 pikachu——关于暴力破解

    首先打开XAMPP 然后在网上下载pikachu平台压缩包 解压缩即可.之后进入到XAMPP的文件夹 将pikachu文件夹放到htdoces内就完成了pikachu平台的搭建~ 之后在xampp中点 ...

  4. shell中产生随机字符串的方法

    random变量 echo $RANDOM 8746 生成0-32767之间的整数随机数,若超过5位可以加个固定10位整数,然后进行求余. 再结合md5生成字符串 echo $RANDOM |md5s ...

  5. 西瓜书6.2 matlab的libsvm使用

    因为python的教程没有找到详细的所以就改用matlab了 使用的是matlab r2016a,libsvm3-24,具体的安装配置教程就直接参考谦恭大大的了: https://blog.csdn. ...

  6. PLC入门笔记9

    梯形图电路之电机控制 电机直接启动控制电路 电机正反停控制电路 我的图.. 但愿最后说的不要发生吧 例如下错了程序 导致... 最好外部电路互锁一下.. 电机故障判断电路 我的图.. 电机故障转换电路 ...

  7. Day3 准备步入入门.ok

    安装开发环境(6.21周一) 卸载JDK 删除Java的安装目录 打开我的电脑-->属性-->高级系统设置-->环境变量 删除JAVA_HOME 删除path下添加的JAVA目录 安 ...

  8. vue项目如何配置路由

    vue3项目中如何配置路由 1.下载vue-router,在路由文件中引入相关依赖 import {createRouter,createWebHashHistory} from 'vue-route ...

  9. nodejs mongo数据库连接、查询、显示

    初学nodejs,涉及内容太多,总找不到如何能处理数据之间的交换.提取,显示.查找众多资料,终于调试成功,为免遗忘,特记录如下: 安装nodejs,mongo数据库在这里不做记录了. 1.编写serv ...

  10. Matlab字体设置中找不到字体的解决方法(转载)

    Matlab字体设置中找不到字体 Matlab默认的字体实在不好看,一般都需要重新设置字体. 在其字体设置中有些字体不能同时支持中文和英文,我在之前的博客中说过,如何为Matlab设置一款好看的同时兼 ...