一种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

  1. 重新启动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: build
  script:
    - echo "Hello, $GITLAB_USER_LOGIN!"

test-job1:
  stage: test
  script:
    - echo "This job tests something"

test-job2:
  stage: test
  script:
    - 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 20

deploy-prod:
  stage: deploy
  script:
    - 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流程能够很好的契合小团队的并行开发和部署。后续文章将介绍官网的一个前端部署实例

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/304751.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

scipy-interpolate整理

文章目录 scipy-interpolate整理Univariate interpolation 单变量插值Multivariate interpolation 多元插值Unstructured data 非结构化数据::For data on a grid 对于网格上的数据::Tensor product polynomials 张量积多项式:: 1-D Splines …

Windows更新 遇到错误 你的设备中缺少重要的安全和质量修复 0x80070643问题解决

一、原因 日常Windows更新时,突然出现以下错误: 二、最简单的方法 官方网址windows10升级工具进行更新:https://www.microsoft.com/zh-cn/software-download/windows10/   更新助手可以帮助你更新到 Windows 10 的最新版本&#xff0c…

【刷题日记】青少年CTF-Misc(三)A1-Misc部分完结!撒花!

StegoTXT 题目难度:★ 题目编号:QSNCTF-2023-T-MISC-20230228003 题目描述:今天维护网站的时候出了一道这样的题目,上传上来看看大家怎么解,flag格式为:qsnctf{xxx}。 下载解压文件,得到一个…

海淘注意事项科普

关税和税费: 在海淘过程中,您可能需要支付关税和其他税费。了解目标国家的相关规定,预先了解可能的费用,并确保考虑到这些额外成本。 货币汇率: 注意货币汇率的波动,以避免因兑换率变化导致支付更多费用。…

嵌入式-C语言-江科大-指针的详解与应用

文章目录 一:计算机存储机制二:定义指针三:指针的操作四:数组与指针五:指针的应用道友:最清晰的脚印,踩在最泥泞的道路上。 推荐视频配合我的笔记使用 [C语言] 指针的详解与应用-理论结合实践&a…

Flask修改Response Headers中的Server值

Headers中的Server会暴露出Python版本,导致的结果就是方便被渗透快速定位Python版本后找到对应版本的漏洞,因此导致网络安全问题 伪方法: 像这个马上就暴露出Python版本,如何解决这个网络上有说直接用response.headers.remove(Ser…

Windows内存管理(二):内存架构 浅谈一二

《Windows内存管理(一):Windows性能监视器(PerfMon)》 Windows内存管理是一个复杂的主题,涉及多个层次和组件。以下是一个分层的概述。 1、虚拟内存管理 Windows使用虚拟内存来给每个进程提供一个看似连续的内存空间&#xff0c…

Java学习笔记-day01-Flowable工作流入门

课程来源B站大佬波哥的课程 本文仅做笔记,课件需要的联系B站大佬获取 0.前置 相关话术 流程定义(Process Definition): 描述业务流程的定义,通常使用BPMN(Business Process Model and Notation&#xff09…

没有货源是不是就没办法在家做抖店?打包发货怎么完成?解答如下

我是王路飞。 有人问了我一个问题:无货源模式的抖店,自己一个人在家里做不了是吧?毕竟打包发货这些问题怎么解决呢? 店铺要是发货不及时被平台罚款怎么办?产品有质量问题怎么解决呢?店铺一直不出单怎么办…

并发程序设计--D5~D7线程的创建、回收和取消清理

一个进程中的多个线程共享以下资源 可执行指令 静态数据 进程中打开的文件描述符 当前工作目录 用户ID 用户组ID 每个线程私有的资源 线程ID PC(程序计数器)和相关寄存器 堆区和栈区 错误号(errno) 优先级 执行状态和属性 线程的…

2024阿里云服务器ECS实例全方位介绍_优缺点大全

阿里云服务器ECS英文全程Elastic Compute Service,云服务器ECS是一种安全可靠、弹性可伸缩的云计算服务,阿里云提供多种云服务器ECS实例规格,如经济型e实例、通用算力型u1、ECS计算型c7、通用型g7、GPU实例等,阿里云服务器网aliyu…

uniapp微信小程序投票系统实战 (SpringBoot2+vue3.2+element plus ) -用户信息修改实现

锋哥原创的uniapp微信小程序投票系统实战: uniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )_哔哩哔哩_bilibiliuniapp微信小程序投票系统实战课程 (SpringBoot2vue3.2element plus ) ( 火爆连载更新中... )共计21条视频…

数字化解决方案在市政交通大显身手

Bentley 应用程序促进了创新设计解决方案,预计可在 25 年内节省 3,200 万美元 大规模现代化计划 大学大道位于爱荷华州锡达福尔斯市繁忙的社区,是一条重要的六车道高速公路,长约两英里,每天通行的车辆有 2 万多辆。该道路已有 60…

java编程中,保证接口幂等性的实现方案讨论

一、什么是幂等性 数学中的幂等是指f(x) f(f(x)),编程领域的术语是指同一个操作,在重复提交的情况下,最终产生的影响是不变的。举例说: 提交订单时,用户在购物车界面,重复点击“下单”,服务端…

vxe-树形结构层级过多横向滚动条设置

一. 问题 在使用vxe-table中的树形结构的时候,如果树形结构的层级过多的话的会导致层级很深的层级,鼠标点击无法选中,对应的内容显示不完全。 层级过多后 二. 解决 方法1:动态的计算所占行的宽度,选取最大宽度给表格列…

统信UOS虚拟机安装VirtualBox扩展使用USB功能

为什么要安装VirtualBox扩展包? 安装 Oracle VM VirtualBox 扩展包的原因是,它提供了对 USB 2.0、USB 3.0、远程桌面协议 VRDP(VirtualBox Remote Desktop Protocol)等实用功能的支持,以增强 VirtualBox 的功能。这些…

MIT_线性代数笔记:第 25 讲 对称矩阵和正定性

目录 对称矩阵 Symmetric matrices实特征值 Real eigenvalues正定矩阵 Positive definite matrices 对称矩阵是最重要的矩阵之一,其特征值为实数并且拥有一套正交特征向量。正定矩阵的性质则更好。 对称矩阵 Symmetric matrices 包含特殊性质的矩阵,例如…

CCF模拟题 202309-1 坐标变换(其一)

问题描述 试题编号: 202309-1 试题名称: 坐标变换(其一) 时间限制: 1.0s 内存限制: 512.0MB 问题描述: 对于平面直角坐标系上的坐标(x,y),小P定义了一个包含…

【Flutter 开发实战】Dart 基础篇:常用运算符

在Dart中,运算符是编写任何程序的基本构建块之一。本文将详细介绍Dart中常用的运算符,以帮助初学者更好地理解和运用这些概念。 1. 算术运算符 算术运算符用于执行基本的数学运算。Dart支持常见的加、减、乘、除、整除以及取余运算。常见的算数运算符如…

从虚拟到现实:数字孪生驱动智慧城市可持续发展

随着科技的飞速发展,智慧城市已经成为未来城市发展的重要趋势。数字孪生技术作为智慧城市建设中的关键技术之一,正在发挥着越来越重要的作用。本文将探讨数字孪生如何从虚拟走向现实,驱动智慧城市的可持续发展。 一、数字孪生技术&#xff1…