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. vagrant用密码连接ssh

    1通过 ssh address连接 1:进去linux 2:修改配置文件信息 vi /etc/ssh/sshd_config 修改 passwordAuthentication no 改为 passw ...

  2. 「SOL」NOI2017Day2 T1T2

    就当我没做过这套题 而且 T3 也不会 Day2 A. 游戏 > Link 游戏 - LOJ 做过 2-sat 的读者应该能够一眼秒出这道题的正解 -- \(\mathcal O(2^d)\) ...

  3. Linux 第三节(重定向符,通配符,管道符,转义符,VIM编辑器)

    1.输入重定向符 < 2.输出重定向符 将我们的命令原本要输出到屏幕的内容,输出到文件里面 标准信息 >  覆盖>  追加>> 错误信息 2>  覆盖2>  ...

  4. 48. Rotate Image via java

    need to use scratch to find the pattern class Solution { public void rotate(int[][] matrix) { int n= ...

  5. php相关知识总结

    class Father{ public static function getStatic(){ return new static(); } public static function getS ...

  6. HTTP身份认证

    1.HTTP Basic认证 用户每次发送请求的时候,在请求头中携带能通过认证的身份信息:Authorization: <username>:<password> 1.1 交互 ...

  7. Educational Codeforces Round 3 个人总结A-D

    Educational Codeforces Round 3 A. USB Flash Drives 降序排序后,贪心,甚至不会爆longlong void solve() { int n,m; ci ...

  8. Merge Overlapping Intervals

    refer to: https://www.algoexpert.io/questions/Merge%20Overlapping%20Intervals Problem Statement Samp ...

  9. [api自动化]快速导出接口到jmeter脚本

    [场景]在项目做接口自动化的时候,大家一般找接口文档或者其他接口资料,逐一编写脚本.这样效率低,且容易由于文档未更新导致接口调试不通 [解决方案]页面上操作对应功能,直接捕获用到的接口,导出到jmet ...

  10. linux 离线安装mysql 配置开机自启动

    系统版本:centos7.8 | mysql版本:5.7.35 安装配置mysql数据库 mysql数据库配置开机自启动 1. 安装配置mysql数据库 mysql版本:5.7.35 点击下载 提取码 ...