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. python学习笔记-初始python(1)

    1.运行程序 python 使用cmd.exe 运行程序.  例子: python +[文件路径] 2.注释 当行注释:# 被注释内容 多行注释:'''被注释内容''',或者""& ...

  2. openSUSE 播放使用VLC播放视频

    openSUSE 使用VLC播放视频 linux视频播放 为什么 通常我们在安装号vlc后,由于版权的原因,是无法获取视频的解码器的.我们需要下载第三方的解码器帮助我们进行解码. 过程如下: 添加pa ...

  3. ethcat开发记录 一

    一.方案 1.移植开源方案SOEM 2.专用芯片 二.SOEM移植 (一)硬件 stm32f407,168M PHY:LAN8720A (ii) Points to note 1, the PHY a ...

  4. Loadrunner录制时弹出Microsoft Visual C++ Runtime Library解决方案

    这段时间用loadrunner测试工具,录制脚本的时候老是出现这个弹窗,刚开始就以为是软件错误,就用的软件修复,也解决了,后来还是出现这样的错误,修复也没有用 原因:可能是代理服务器在调用VC库的时候 ...

  5. javaweb链接到数据库(mysql)操作

    准备:配置好数据库,下好mysql connect 第一步:将my connec文件和commons-dbutil(,jar)复制到webapp文件下WEB-INF的lib文件中,然后右键构建路径. ...

  6. xml与DataSet互转

    //将DataSet转换为xml字符串   public static string ConvertDataSetToXMLFile(DataSet xmlDS, Encoding encoding) ...

  7. spring cloud alibaiba的POM引入

    POM添加spring cloud alibaba相关jar包 1 <dependency> 2 <groupId>org.springframework.boot</g ...

  8. layui中文离线文档PDF下载

    失效链接处理 layui中文离线文档 PDF 下载 本站整理下载: 链接:https://pan.baidu.com/s/18FbllhLEezXTn-y1eiiNKg  提取码:nuqz      ...

  9. JMeter参数化(一)--CSV参数化

    一.CSV Data Set Config 1.添加配置元件-CSV Data Set Config 其中,分隔符不能是参数化的值中的符号,否则会被截断. 2.调用 3.循环读取文件中数据 假设数据内 ...

  10. Vue3 向window注入方法 TS警告 元素隐式具有 "any" 类型,因为索引表达式的类型不为 "number" 问题解决。

    window['funcName'] = function(){}; // 'funcName'会标红警告 (window as any).funcName = function(){}; // 正确 ...