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. holiday08

    第八天 管道 linux允许将 一个命令的输出 可以 通过管道 作为 另一个命令的输入 ls -lh | more 可以理解现实生活中的管子,管子一头塞东西进去,另一头取出来,这里 | 的左右分为两端 ...

  2. 记录[极客大挑战2019]http

    打开网站源码--找到secret.php,要从www.Sycsecret.com访问--加上Referer 注:HTTP Referer是header的一部分,当浏览器发送请求的时候带上Referer ...

  3. vue接口

    前端的接口与后端进行对接,根据后台的接口字段与前端的字段对应 这是前端的定义方法,下面是一个方法定义的默认值下标 接下来就是提交的方法里面进行对接,再将ruleForm重新定义,然后进入接口进行存储 ...

  4. APP性能测试——首次启动耗时测试

    首次启动耗时: 即第一次安装(清除数据也可以),打开软件,直到进入到首页activity页面,并计算耗时. 示例代码: import os import time # 测试首次启动时间 # 创建App ...

  5. 注释中的Unicode编码也会被转义

    现象 public class Unicode { public static void main(String[] args) { // \u000d System.out.println(&quo ...

  6. 数论之GCD+LCM+扩展欧几里得

    最大公约数GCD 整数a和b的最大公约数记为gcd(a,b) <1 经典的欧几里得算法,辗转相除法 int gcd(int a, int b){ return b == 0 ? a : gcd( ...

  7. Vue-数据代理

    Vue中的数据代理 数据代理定义 所谓数据代理,就是通过一个对象代理对另一个对象中的属性的操作(读/写).说白了就是操作一个对象上的属性可以读取和修改另一个对象上的属性,这种关系就叫做数据代理. 在V ...

  8. windows 10 的VMware workstation Pro突然变成英文界面

    电脑的VMware虚拟机界面是中文版的,后来在捣弄些电脑配置,突然变成英文版界面了. 后面发现原来是区域格式选错了:正确的格式是下图红框

  9. Windows系统更改/迁移用户目录

    系统盘为C盘,C盘空间不足,C盘太满了,C盘清理时查看发现C:\Users目录占用几十个GB,以下方法可将Users目录大部分空间转移. 1. 准备工作 更改/迁移用户目录之前先自行备份当前用户的资料 ...

  10. 【python】第一模块 步骤四 第二课、实现飞机大战(未完待续)

    第二课.实现飞机大战 一.项目介绍 项目实战:飞机大战 课程目标 掌握面向对象分析和开发的思想 能对项目进行拆分,进行模块化开发 了解项目开发的基本流程 理解并运用python的包.模块相关知识 理解 ...