一种DevOpts的实现方式:基于gitlab的CICD(一)
写在之前
笔者最近准备开始入坑CNCF毕业的开源项目,看到其中有一组开源项目的分类就是DevOpts。这个领域内比较出名的项目是Argocd,Argo CD 是一个用于 Kubernetes 的持续交付 (Continuous Delivery) 工具,它以声明式的方式实现了应用程序的自动化部署和持续集成。Argo CD 借助 Kubernetes 的资源对象来定义应用程序,提供了一个直观的 Web 用户界面以及一个命令行界面(CLI)来管理和监控 Kubernetes 上的应用。
Argo CD 是基于 GitOps 的持续交付工具。GitOps 是一种由 Weaveworks 发明的持续交付方法,它结合了 Git 和 Kubernetes,以实现一种强大的基础设施即代码(Infrastructure as Code,IaC)模式。
在 GitOps 中,对基础设施的任何更改都应该以 Git 上的代码提交的形式实现。Argo CD 能够与 Git 存储库进行集成,自动从Git 存储库拉取与预期状态相符的应用程序描述,并自动将该应用程序部署到 Kubernetes 中。Argo CD 还实现了自动同步和协调机制来确保应用程序的运行状态与 Git 中定义的期望状态保持一致。
通过 GitOps 和 Argo CD,用户可以快速构建、测试和管理他们的应用程序,并快速进行版本控制和回滚。以这种方式管理基础设施,可以大大提高应用程序的可靠性、安全性和可重复性。
基于github+argocd的这套流程中,其实有有一个东西没有闭环,那就是argocd本身是可以私有化部署的,但是github本身是不提供私有化部署版本的,这就导致我们在实际开发的时候,必须将代码托管到github上。好在gitlab提供了私有化部署的方式,且gitlab本身也具有cicd的完整解决方案。本文将围绕gitlab官网的描述,逐步阐述自己的实现过程,期望能够带给大家一定的启发。
gitlab的官方文档:https://docs.gitlab.com/ee/
概念
CICD:是持续集成与持续交付(Continuous Integration and Continuous Delivery)的简称。它是一种软件开发实践,通过自动化的构建、测试和部署过程,实现团队快速交付高质量的软件。持续集成(CI)指在代码开发过程中,频繁地将代码集成到共享代码仓库,并进行自动化的构建和测试。持续交付(CD)则是在持续集成的基础上,将经过测试的代码自动部署到生产环境中。
DevOps:是开发(Development)与运维(Operations)的组合词,它是一种软件开发文化和工作方式。DevOps的目标是通过开发团队和运维团队之间的合作与整合,提高软件开发和运维的效率和质量。通过自动化工具和流程,DevOps实践着持续集成、持续交付和持续部署,促进开发与运维之间的协作和沟通,加速软件开发和部署的速度,提高软件的稳定性和可靠性。
我的理解是:
ci的过程就是代码的集成、打包、将制品分发到不同的私有物料仓库
cd:将代码打包的镜像等物料,批量部署到指定的机器上
gitlab的版本许可
gitlab的版本即许可
建议大家在安装gitlab的时候能够正确辨别不同版本的权限边界;
ps:吐槽一下,官方文档非常详细,但是文章大多篇幅不大,数量太多了,文档中那个的链接层层嵌套,按理说版,笔者也是
gitlab的安装
官方文档中给出了多种安装方式(Helm、docker、二进制),本文选择使用docker安装gitlab的测试环境。
步骤一:初始化gitlab的工作目录
# 设置gitlab的工作目录
GITLAB_HOME=/srv/gitlab
mkdir -p $GITLAB_HOME
echo "export GITLAB_HOME=$GITLAB_HOME" >> ~/.bash_profile
source ~/.bash_profile
gitlab容器和宿主机的目录映射关系如下表所示:
| 宿主机目录 | 容器目录 | 备注 |
|---|---|---|
| $GITLAB_HOME/data | /var/opt/gitlab | 用于存储应用程序数据。 |
| $GITLAB_HOME/logs | /var/log/gitlab | 用于存储日志。 |
| $GITLAB_HOME/config | /etc/gitlab | 用于存储GitLab 配置文件 |
步骤二:启动gitlab容器
#运行如下命令启动gitlab的docker容器
sudo docker run --detach \--hostname gitlab.example.com \--publish 443:443 --publish 80:80 --publish 22:22 \--name gitlab \--restart always \--volume $GITLAB_HOME/config:/etc/gitlab \--volume $GITLAB_HOME/logs:/var/log/gitlab \--volume $GITLAB_HOME/data:/var/opt/gitlab \--shm-size 256m registry.gitlab.cn/omnibus/gitlab-jh:latest
上述命令有几点需要注意:
- 如果机器没有配置域名解析的话,建议hostname可以不用传递
- 如果机器的443或22、80端口被占用了可以仿照笔者执行如下步骤修改gitlab的端口
1)修改gitlab容器的启动命令
sudo docker run --detach \--publish 8000:8000 --publish 2200:22 \--name gitlab \--restart always \--volume $GITLAB_HOME/config:/etc/gitlab \--volume $GITLAB_HOME/logs:/var/log/gitlab \--volume $GITLAB_HOME/data:/var/opt/gitlab \--shm-size 256m gitlab/gitlab-ce:latest
2)进入容器内部
#进入容器
sudo docker exec -it gitlab /bin/bash
3)修改/etc/gitlab/gitlab.rb文件
vi /etc/gitlab
#修改值
external_url "http://gitlab.example.com:8000"
#添加值
gitlab_rails['gitlab_shell_ssh_port'] = 2200
- 重新启动gitlab
gitlab-ctl reconfigure
5)退出gitlab容器
exit
步骤三:获取root账户的初始密码
#在宿主机上执行
sudo docker exec -it gitlab grep 'Password:' /etc/gitlab/initial_root_password
此时,我们可以在ui界面上验证我们部署的gitlab程序了

gitlab-runner安装
gitLab Runner 是一个与 GitLab CI/CD 集成的开源项目,用于执行自动化构建和部署任务。它允许您在 GitLab上创建管道 (pipeline),并使用配置文件定义和管理不同的阶段和任务。GitLab Runner 可以安装在各种操作系统上,并作为一个代理程序运行,负责执行 GitLab CI/CD 中定义的作业。它可以与 GitLab服务器进行通信,接收要执行的作业,并将结果返回给 GitLab。
下面给出两中安装方式:
- 一种是二进制安装方式,该方式主要是利用gitlab-runner的宿主机环境执行cicd的工作流程
- 一种是docker安装方式,该方式主要是采用了类似于docker in docker的形式,gitlab-runner被包装在docker容器内,整个工作流程是在docker容器内执行的,其中每一个作业都可以定制的在不同的容器镜像环境下执行。该方式后文演示demo的时候会详细解读。
- 官方文档不建议gitlab和gitlab-runner部署在同一台机器上,所以后文的gitlab-runner是部署在另一台机器上的。
二进制安装方式
下面给出ubuntu下的安装脚本,其余操作系统可以从下面的链接中找到对应的二进制包进行安装
# 选择合适的deb包
curl -LJO "https://gitlab-runner-downloads.s3.amazonaws.com/latest/deb/gitlab-runner_amd64.deb"
# 安装deb文件
dpkg -i gitlab-runner_amd64.deb
docker安装方式
此设置将对 Docker 守护进程的完全控制权委托给每个 GitLab Runner 容器。其效果是,如果你在还运行其他有效负载的 Docker 守护进程中运行 GitLab Runner,隔离保证会中断。所以不能在有k8s纳管的机器上部署docker版本的gitlab-runner容器。
docker run -d --name gitlab-runner --restart always \-v /var/run/docker.sock:/var/run/docker.sock \-v gitlab-runner-config:/etc/gitlab-runner \gitlab/gitlab-runner:latest
gitlab-runner的注册
上文中我们安装了gitlab-runner,但是有一个问题我们一直没有解决:gitlab-runner和gitlab部署在不同的机器上,两者是怎么建立关联的。
在UI界面上创建分组后找到runner的入口

创建runners
tags可以选择Run untagged jobs

点击create runner会跳转都runner注册的引导页面

我们在部署gitlab-runner的机器上依次执行上述命令。我们以docker容器启动的gitlab-runner为例,详细展示注册流程,二进制安装的gitlab-runner的注册流程一致
step1:注册gitlab-runner
#首先我们需要先进入到容器内部
docker exec -it gitlab-runnner /bin/bash
#执行注册命令,该命令从UI界面上copy
gitlab-runner register --url http://XXX --token xxx

这里有两点需要注意,首先是runner executor的类别,我们选择的是docker模式的gitlab runner,后续是gitlab-runner所在容器的基础镜像,我们选择centos
#注册成功后退出容器
exit
#重启容器
docker restart gitlab-runner
只是我们可以点击界面上的按钮,跳转到runner界面


基于gitlab的简单实践
官方文档给出的demo:https://docs.gitlab.com/ee/ci/quick_start/
前置条件: 基于前文描述,诸位如果已经搭建好gitlab+gitlab-runner的环境后,可基于此来验证gitlab cicd的完整执行流程
步骤一: 从UI界面上已经绑定runner的group分组中创建一个项目,并在项目的根目录下创建.gitlab-ci.yml文件,文件内容如下:
build-job:stage: buildscript:- echo "Hello, $GITLAB_USER_LOGIN!"test-job1:stage: testscript:- echo "This job tests something"test-job2:stage: testscript:- echo "This job tests something, but takes more time than test-job1."- echo "After the echo commands complete, it runs the sleep command for 20 seconds"- echo "which simulates a test that runs 20 seconds longer than test-job1"- sleep 20deploy-prod:stage: deployscript:- echo "This job deploys something from the $CI_COMMIT_BRANCH branch."environment: production
步骤二:点击pipelines,查看执行结果



写在之后
期望本文可以为大家揭开基于gitlab的cicd的神秘面纱。笔者没有详细介绍gitlab-ci.yaml的语法规范,也没有部署高可用的gitlab和gitlab-runner,这些在gitlab官网中均有详细的介绍。笔者实践后的是:基于gitlab的cicd流程能够很好的契合小团队的并行开发和部署。后续文章将介绍官网的一个前端部署实例
相关文章:
一种DevOpts的实现方式:基于gitlab的CICD(一)
写在之前 笔者最近准备开始入坑CNCF毕业的开源项目,看到其中有一组开源项目的分类就是DevOpts。这个领域内比较出名的项目是Argocd,Argo CD 是一个用于 Kubernetes 的持续交付 (Continuous Delivery) 工具,它以声明式的方式实现了应用程序的…...
nodejs和vuejs的区别
一、vue项目开发中,两个经常混合使用。 不同: 1、概念不同: 一个是前端框架,一个是服务端语言。 Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使…...
16、Kubernetes核心技术 - 节点选择器、亲和和反亲和
目录 一、概述 二、节点名称 - nodeName 二、节点选择器 - nodeSelector 三、节点亲和性和反亲和性 3.1、亲和性和反亲和性 3.2、节点硬亲和性 3.3、节点软亲和性 3.4、节点反亲和性 3.5、注意点 四、Pod亲和性和反亲和性 4.1、亲和性和反亲和性 4.2、Pod亲和性/反…...
面试算法96:字符串交织
题目 输入3个字符串s1、s2和s3,请判断字符串s3能不能由字符串s1和s2交织而成,即字符串s3的所有字符都是字符串s1或s2中的字符,字符串s1和s2中的字符都将出现在字符串s3中且相对位置不变。例如,字符串"aadbbcbcac"可以由…...
什么是Vue.js的响应式系统(reactivity system)?如何实现数据的双向绑定?
Vue.js的响应式系统是指一种能够跟踪数据变化并实时更新相关界面的机制。它是Vue.js框架的核心特性之一。 在Vue.js中,你可以使用数据绑定语法将数据绑定到DOM元素上。当绑定的数据发生变化时,Vue.js会自动监听这些变化并更新相关的DOM元素。 Vue.js实…...
力扣labuladong一刷day52天LRU算法
力扣labuladong一刷day52天LRU算法 文章目录 力扣labuladong一刷day52天LRU算法概念一、146. LRU 缓存思路一:使用双向链表加map来手动实现。思路二:使用LinkedHashMap 概念 LRU的全称为Least Recently Used,翻译出来就是最近最少使用的意思…...
CCNP课程实验-06-EIGRP-Trouble-Shooting
目录 实验条件网络拓朴 环境配置开始排错错误1:没有配置IP地址,IP地址宣告有误错误2:R3配置了与R1不同的K值报错了。错误3:R4上的AS号配置错,不是1234错误4:R2上配置的Key-chain的R4上配置的Key-chain不一致…...
判断完全数-第11届蓝桥杯省赛Python真题精选
[导读]:超平老师的Scratch蓝桥杯真题解读系列在推出之后,受到了广大老师和家长的好评,非常感谢各位的认可和厚爱。作为回馈,超平老师计划推出《Python蓝桥杯真题解析100讲》,这是解读系列的第27讲。 判断完全数&#…...
【Bootstrap5学习 day12】
Bootstrap5 导航 Bootstrap5提供了一种简单快捷的方法来创建基本导航,它提供了非常灵活和优雅的选项卡和Pills等组件。Bootstrap5的所有导航组件,包括选项卡和Pillss,都通过基本的.nav类共享相同的基本标记和样式。 创建基本导航 要创建简单…...
算法训练第五十九天|503. 下一个更大元素 II、42. 接雨水
503. 下一个更大元素 II: 题目链接 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之…...
mysql之数据类型、建表以及约束
目录 一. CRUD 1.1 什么是crud 1.2 select(查询) 1.3 INSERT(新增) 1.4 UPDATE(修改) 1.5 DELETE(删除) 二. 函数 2.1 常见函数 2.2 流程控制函数 2.3聚合函数 三. union与union all 3.1 union 3.2 union all 3.3 具体不同 3.4 结论 四、思维导图 一. CRUD 1.1…...
复试 || 就业day04(2024.01.05)项目一
文章目录 前言线性回归房价预测加载数据数据查看数据拆分数据建模模型的验证、应用模型的评估 总结 前言 💫你好,我是辰chen,本文旨在准备考研复试或就业 💫本文内容来自某机构网课,是我为复试准备的第一个项目 &#…...
华为机试真题实战应用【赛题代码篇】-最小传输时延(附python、C++和JAVA代码实现)
目录 问题描述 输入描述: 输出描述: 知识储备 解题思路 思路一...
C++ 运算符重载
(Operator) 加分 减法 []的重载 #include <iostream> using namespace std;class time1 {public:time1(){shi0;fen0;miao0;}time1(int shi, int fen, int miao){this->shi shi;this->fen fen;this->miao miao;}time1 operator (ti…...
vue3学习 【2】vite起步和开发工具基本配置
vite的简介 官方文档 刚起步学习,所以我们只需要按照官方文档的入门流程即可。推荐阅读一下官网的为什么使用vite vite目前需要的node版本是18,可以参考上一篇文章的安装nvm,用来进行多版本的node管理。 vite安装与使用 npm create vitela…...
计算机创新协会冬令营——暴力枚举题目06
我给大家第一阶段的最后一道题就到这里了,下次得过段时间了。所以这道题简单一点。但是足够经典 下述题目描述和示例均来自力扣:两数之和 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target …...
单片机快速入门
参考连接: 安装MinGW-64(在win10上搭建C/C开发环境)https://zhuanlan.zhihu.com/p/85429160MinGW-64; 链接:https://pan.baidu.com/s/1oE1FmjyK7aJPnDC8vASmCg?pwdy1mz 提取码:y1mz --来自百度网盘超级会员V7的分享C…...
Eureka相关问题及答案(2024)
1、什么是Eureka? Eureka是一个由Netflix开发的服务发现(Service Discovery)工具,它是Spring Cloud生态系统中的一个关键组件。服务发现是微服务架构中的一个重要概念,它允许服务实例在启动时注册自己,以便…...
Django 7 实现Web便签
一、效果图 二、会用到的知识 目录结构与URL路由注册request与response对象模板基础与模板继承ORM查询后台管理 三、实现步骤 1. terminal 输入 django-admin startapp the_10回车 2. 注册, 在 tutorial子文件夹settings.py INSTALLED_APPS 中括号添加 "the…...
Jenkins集成部署java项目
文章目录 Jenkins简介安装 Jenkins简介 Jenkins能实时监控集成中存在的错误,提供详细的日志文件和提醒功能,还能用图表的形式形象的展示项目构建的趋势和稳定性。 官网 安装 在官网下载windows版本的Jenkins 但是我点击这里浏览器没有反应࿰…...
AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...
