使用GitLab实现CICD gitlab-ci
liuian 2024-12-24 14:18 46 浏览
GitLab CI/CD 是一个内置在GitLab中的工具,用于通过持续方法进行软件开发:
- Continuous Integration (CI) 持续集成
- Continuous Delivery (CD) 持续交付
- Continuous Deployment (CD) 持续部署
持续集成的工作原理是将小的代码块推送到Git仓库中托管的应用程序代码库中,并且每次推送时,都要运行一系列脚本来构建、测试和验证代码更改,然后再将其合并到主分支中。
持续交付和部署相当于更进一步的CI,可以在每次推送到仓库默认分支的同时将应用程序部署到生产环境。
这些方法使得可以在开发周期的早期发现bugs和errors,从而确保部署到生产环境的所有代码都符合为应用程序建立的代码标准。
GitLab CI/CD 由一个名为 .gitlab-ci.yml 的文件进行配置,该文件位于仓库的根目录下。文件中指定的脚本由GitLab Runner执行。
GitLab CI/CD 介绍
软件开发的持续方法基于自动执行脚本,以最大程度地减少在开发应用程序时引入错误的机会。从开发新代码到部署新代码,他们几乎不需要人工干预,甚至根本不需要干预。
它涉及到在每次小的迭代中就不断地构建、测试和部署代码更改,从而减少了基于已经存在bug或失败的先前版本开发新代码的机会。
Continuous Integration(持续集成)
假设一个应用程序,其代码存储在GitLab的Git仓库中。开发人员每天都要多次推送代码更改。对于每次向仓库的推送,你都可以创建一组脚本来自动构建和测试你的应用程序,从而减少了向应用程序引入错误的机会。这种做法称为持续集成,对于提交给应用程序(甚至是开发分支)的每项更改,它都会自动连续进行构建和测试,以确保所引入的更改通过你为应用程序建立的所有测试,准则和代码合规性标准。
Continuous Delivery(持续交付)
持续交付是超越持续集成的更进一步的操作。应用程序不仅会在推送到代码库的每次代码更改时进行构建和测试,而且,尽管部署是手动触发的,但作为一个附加步骤,它也可以连续部署。此方法可确保自动检查代码,但需要人工干预才能从策略上手动触发以避免此次变更。
Continuous Deployment(持续部署)
与持续交付类似,但不同之处在于,你无需将其手动部署,而是将其设置为自动部署。完全不需要人工干预即可部署你的应用程序。
1.1. GitLab CI/CD 是如何工作的
为了使用GitLab CI/CD,你需要一个托管在GitLab上的应用程序代码库,并且在根目录中的.gitlab-ci.yml文件中指定构建、测试和部署的脚本。
在这个文件中,你可以定义要运行的脚本,定义包含的依赖项,选择要按顺序运行的命令和要并行运行的命令,定义要在何处部署应用程序,以及指定是否 要自动运行脚本或手动触发脚本。
为了可视化处理过程,假设添加到配置文件中的所有脚本与在计算机的终端上运行的命令相同。
一旦你已经添加了.gitlab-ci.yml到仓库中,GitLab将检测到该文件,并使用名为GitLab Runner的工具运行你的脚本。该工具的操作与终端类似。
这些脚本被分组到jobs,它们共同组成一个pipeline。一个最简单的.gitlab-ci.yml文件可能是这样的:
before_script: - apt-get install rubygems ruby-dev -yrun-test: script: - ruby --version 6
before_script属性将在运行任何内容之前为你的应用安装依赖,一个名为run-test的job(作业)将打印当前系统的Ruby版本。二者共同构成了在每次推送到仓库的任何分支时都会被触发的pipeline(管道)。
GitLab CI/CD不仅可以执行你设置的job,还可以显示执行期间发生的情况,正如你在终端看到的那样:
为你的应用创建策略,GitLab会根据你的定义来运行pipeline。你的管道状态也会由GitLab显示:
最后,如果出现任何问题,可以轻松地回滚所有更改:
1.2. 基本 CI/CD 工作流程
一旦你将提交推送到远程仓库的分支上,那么你为该项目设置的CI/CD管道将会被触发。GitLab CI/CD 通过这样做:
- 运行自动化脚本(串行或并行) 代码Review并获得批准
- 构建并测试你的应用
- 就像在你本机中看到的那样,使用Review Apps预览每个合并请求的更改
- 代码Review并获得批准
- 合并feature分支到默认分支,同时自动将此次更改部署到生产环境
- 如果出现问题,可以轻松回滚
通过GitLab UI所有的步骤都是可视化的
1.3. 深入了解CI/CD基本工作流程
如果我们深入研究基本工作流程,则可以在DevOps生命周期的每个阶段看到GitLab中可用的功能,如下图所示:
1. Verify
- 通过持续集成自动构建和测试你的应用程序
- 使用GitLab代码质量(GitLab Code Quality)分析你的源代码质量
- 通过浏览器性能测试(Browser Performance Testing)确定代码更改对性能的影响
- 执行一系列测试,比如Container Scanning , Dependency Scanning , JUnit tests
- 用Review Apps部署更改,以预览每个分支上的应用程序更改
2. Package
- 用Container Registry存储Docker镜像
- 用NPM Registry存储NPM包
- 用Maven Repository存储Maven artifacts
- 用Conan Repository存储Conan包
3. Release
- 持续部署,自动将你的应用程序部署到生产环境
- 持续交付,手动点击以将你的应用程序部署到生产环境
- 用GitLab Pages部署静态网站
- 仅将功能部署到一个Pod上,并让一定比例的用户群通过Canary Deployments访问临时部署的功能(PS:即灰度发布)
- 在Feature Flags之后部署功能
- 用GitLab Releases将发布说明添加到任意Git tag
- 使用Deploy Boards查看在Kubernetes上运行的每个CI环境的当前运行状况和状态
- 使用Auto Deploy将应用程序部署到Kubernetes集群中的生产环境
使用GitLab CI/CD,还可以:
- 通过Auto DevOps轻松设置应用的整个生命周期
- 将应用程序部署到不同的环境
- 安装你自己的GitLab Runner
- Schedule pipelines
- 使用安全测试报告(Security Test reports)检查应用程序漏洞
GitLab CI/CD 快速开始
.gitlab-ci.yml文件告诉GitLab Runner要做什么。一个简单的管道通常包括三个阶段:build、test、deploy
管道在 CI/CD > Pipelines 页面
2.1. 创建一个 .gitlab-ci.yml 文件
通过配置.gitlab-ci.yml文件来告诉CI要对你的项目做什么。它位于仓库的根目录下。
仓库一旦收到任何推送,GitLab将立即查找.gitlab-ci.yml文件,并根据文件的内容在Runner上启动作业。
下面是一个Ruby项目配置例子:
image: "ruby:2.5" before_script: - apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs - ruby -v - which ruby - gem install bundler --no-document - bundle install --jobs $(nproc) "${FLAGS[@]}" rspec: script: - bundle exec rspec rubocop: script: - bundle exec rubocop
上面的例子中,定义里两个作业,分别是 rspec 和 rubocop,在每个作业开始执行前,要先执行before_script下的命令
2.2. 推送 .gitlab-ci.yml 到 GitLab
git add .gitlab-ci.ymlgit commit -m "Add .gitlab-ci.yml"git push origin master2.3. 配置一个Runner
在GitLab中,Runner运行你定义在.gitlab-ci.yml中的作业(job)
一个Runner可以是一个虚拟机、物理机、docker容器,或者一个容器集群
GitLab与Runner之间通过API进行通信,因此只需要Runner所在的机器有网络并且可以访问GitLab服务器即可
你可以去 Settings ? CI/CD 看是否已经有Runner关联到你的项目,设置Runner简单又直接
2.4. 查看 pipeline 和 jobs的状态
在成功配置Runner以后,你应该可以看到你最近的提交的状态
为了查看所有jobs,你可以去 Pipelines ? Jobs 页面
通过点击作业的状态,你可以看到作业运行的日志
回顾一下:
1、首先,定义.gitlab-ci.yml文件。在这个文件中就定义了要执行的job和命令
2、接着,将文件推送至远程仓库
3、最后,配置Runner,用于运行job
3. Auto DevOps
Auto DevOps 提供了预定义的CI/CD配置,使你可以自动检测,构建,测试,部署和监视应用程序。借助CI/CD最佳实践和工具,Auto DevOps旨在简化成熟和现代软件开发生命周期的设置和执行。
借助Auto DevOps,软件开发过程的设置变得更加容易,因为每个项目都可以使用最少的配置来完成从验证到监视的完整工作流程。只需推送你的代码,GitLab就会处理其他所有事情。这使得启动新项目更加容易,并使整个公司的应用程序设置方式保持一致。
下面这个例子展示了如何使用Auto DevOps将GitLab.com上托管的项目部署到Google Kubernetes Engine
示例中会使用GitLab原生的Kubernetes集成,因此不需要再单独手动创建Kubernetes集群
本例将创建并部署一个从GitLab模板创建的应用
3.1. 从GitLab模板创建项目
在创建Kubernetes集群并将其连接到GitLab项目之前,你需要一个Google Cloud Platform帐户
下面使用GitLab的项目模板来创建一个新项目
给项目起一个名字,并确保它是公有的
3.2. 从GitLab模板创建Kubernetes集群
点击 Add Kubernetes cluster 按钮,或者 Operations > Kubernetes
安装Helm, Ingress, 和 Prometheus
3.3. 启用Auto DevOps (可选)
Auto DevOps 默认是启用的。
导航栏 Settings > CI/CD > Auto DevOps
勾选 Default to Auto DevOps pipeline
最后选择部署策略
一旦你已经完成了以上所有的操作,那么一个新的 pipeline 将会被自动创建。为了查看pipeline,可以去 CI/CD > Pipelines
3.4. 部署应用
到目前为止,你应该看到管道正在运行,但是它到底在运行什么呢?
管道内部分为4个阶段,我们可以查看每个阶段有几个作业在运行,如下图:
构建 -> 测试 -> 部署 -> 性能测试
现在,应用已经成功部署,让我们通过浏览器查看。
首先,导航到 Operations > Environments
在Environments中,可以看到部署的应用的详细信息。在最右边有三个按钮,我们依次来看一下:
第一个图标将打开在生产环境中部署的应用程序的URL。这是一个非常简单的页面,但重要的是它可以正常工作!
紧挨着第二个是一个带小图像的图标,Prometheus将在其中收集有关Kubernetes集群以及应用程序如何影响它的数据(在内存/ CPU使用率,延迟等方面)
第三个图标是Web终端,它将在运行应用程序的容器内打开终端会话。
4. Examples
使用GitLab CI/CD部署一个Spring Boot应用
示例 .gitlab-ci.yml
image: java:8 stages: - build - deploy before_script: - chmod +x mvnw build: stage: build script: ./mvnw package artifacts: paths: - target/demo-0.0.1-SNAPSHOT.jar production: stage: deploy script: - curl --location "https://cli.run.pivotal.io/stable?release=linux64-binary&source=github" | tar zx - ./cf login -u $CF_USERNAME -p $CF_PASSWORD -a api.run.pivotal.io - ./cf push only: - master5. Docs
https://about.gitlab.com/solutions/kubernetes/
https://docs.gitlab.com/ee/ci/README.html
https://docs.gitlab.com/ee/ci/introduction/
https://docs.gitlab.com/ee/topics/autodevops/
https://docs.gitlab.com/ee/ci/examples/README.html
来源链接:
https://www.cnblogs.com/cjsblog/p/12256843.html
☆ END ☆
相关推荐
- 赶紧收藏!编程python基础知识,本文给你全部整理好了
-
想一起学习编程Python的同学,趁我粉丝少,可以留言、私信领编程资料~Python基础入门既然学习Python,那么至少得了解下这门编程语言,知道Python代码执行过程吧。Python的历...
- 创建绩效改进计划 (PIP) 的6个步骤
-
每个经理都必须与未能达到期望的员工抗衡,也许他们的表现下降了,他们被分配了新的任务并且无法处理它们,或者他们处理了自己的任务,但他们的行为对他人造成了破坏。许多公司转向警告系统,然后在这些情况下终止。...
- PI3K/AKT信号通路全解析:核心分子、上游激活与下游效应分子
-
PI3K/AKT/mTOR(PAM)信号通路是真核细胞中高度保守的信号转导网络,作用于促进细胞存活、生长和细胞周期进程。PAM轴上生长因子向转录因子的信号传导受到与其他多条信号通路的多重交叉相互作用的...
- 互联网公司要求签PIP,裁员连N+1都没了?
-
2021年刚画上句号,令无数互联网公司从业者闻风丧胆的绩效公布时间就到了,脉脉上已然炸了锅。阿里3.25、腾讯二星、百度四挡、美团绩效C,虽然名称五花八门,实际上都代表了差绩效。拿到差绩效,非但不能晋...
- Python自动化办公应用学习笔记3—— pip工具安装
-
3.1pip工具安装最常用且最高效的Python第三方库安装方式是采用pip工具安装。pip是Python包管理工具,提供了对Python包的查找、下载、安装、卸载的功能。pip是Python官方提...
- 单片机都是相通的_单片机是串行还是并行
-
作为一个七年的从业者,单片机对于我个人而言它是一种可编程的器件,现在长见到的电子产品中几乎都有单片机的身影,它们是以单片机为核心,根据不同的功能需求,搭建不同的电路,从8位的单片机到32位的单片机,甚...
- STM32F0单片机快速入门八 聊聊 Coolie DMA
-
1.苦力DMA世上本没有路,走的人多了,便成了路。世上本没有DMA,需要搬运的数据多了,便有了DMA。大多数同学应该没有在项目中用过这个东西,因为一般情况下也真不需要这个东西。在早期的单片机中...
- 放弃51单片机,直接学习STM32开发可能会面临的问题
-
学习51单片机并非仅仅是为了学习51本身,而是通过它学习一种方法,即如何仅仅依靠Datasheet和例程来学习一种新的芯片。51单片机相对较简单,是这个过程中最容易上手的选择,而AVR单片机则更为复杂...
- STM32串口通信基本原理_stm32串口原理图
-
通信接口背景知识设备之间通信的方式一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。并行与串行通信的区别如下表所示。串行通信的分类1、按照数据传送方向,分为:单工:数据传输只支持数据在一个...
- 单片机的程序有多大?_单片机的程序有多大内存
-
之前一直很奇怪一个问题,每次写好单片机程序之后,用烧录软件进行烧录时,能看到烧录文件也就是hex的文件大小:我用的单片机芯片是STM32F103C8T6,程序储存器(flash)只有64K。从...
- 解析STM32单片机定时器编码器模式及其应用场景
-
本文将对STM32单片机定时器编码器模式进行详细解析,包括介绍不同的编码器模式、各自的优缺点以及相同点和不同点的应用场景。通过阅读本文,读者将对STM32单片机定时器编码器模式有全面的了解。一、引言...
- 两STM32单片机串口通讯实验_两个32单片机间串口通信
-
一、实验思路连接两个STM32单片机的串口引脚,单片机A进行发送,单片机B进行接收。单片机B根据接收到单片机A的指令来点亮或熄灭板载LED灯,通过实验现象来验证是否通讯成功。二、实验器材两套STM32...
- 基于单片机的智能考勤机设计_基于51单片机的指纹考勤机
-
一、设计背景随着科技水平的不断发展,在这么一个信息化的时代,智能化信息处理已是提高效率、规范管理和客观审查的最有效途径。近几年来,国内很多公司都在加强对企业人员的管理,考勤作为企业的基础管理,是公司...
- STM32单片机详细教学(二):STM32系列单片机的介绍
-
大家好,今天给大家介绍STM32系列单片机,文章末尾附有本毕业设计的论文和源码的获取方式,可进群免费领取。前言STM32系列芯片是为要求高性能、低成本、低功耗的嵌入式应用设计的ARMCortexM...
- STM32单片机的 Hard-Fault 硬件错误问题追踪与分析
-
有过单片机开发经验的人应该都会遇到过硬件错误(Hard-Fault)的问题,对于这样的问题,有些问题比较容易查找,有些就查找起来很麻烦,甚至可能很久都找不到问题到底是出在哪里。特别是有时候出现一次,后...
- 一周热门
-
-
【验证码逆向专栏】vaptcha 手势验证码逆向分析
-
Python实现人事自动打卡,再也不会被批评
-
Psutil + Flask + Pyecharts + Bootstrap 开发动态可视化系统监控
-
一个解决支持HTML/CSS/JS网页转PDF(高质量)的终极解决方案
-
再见Swagger UI 国人开源了一款超好用的 API 文档生成框架,真香
-
网页转成pdf文件的经验分享 网页转成pdf文件的经验分享怎么弄
-
C++ std::vector 简介
-
飞牛OS入门安装遇到问题,如何解决?
-
系统C盘清理:微信PC端文件清理,扩大C盘可用空间步骤
-
10款高性能NAS丨双十一必看,轻松搞定虚拟机、Docker、软路由
-
- 最近发表
- 标签列表
-
- python判断字典是否为空 (50)
- crontab每周一执行 (48)
- aes和des区别 (43)
- bash脚本和shell脚本的区别 (35)
- canvas库 (33)
- dataframe筛选满足条件的行 (35)
- gitlab日志 (33)
- lua xpcall (36)
- blob转json (33)
- python判断是否在列表中 (34)
- python html转pdf (36)
- 安装指定版本npm (37)
- idea搜索jar包内容 (33)
- css鼠标悬停出现隐藏的文字 (34)
- linux nacos启动命令 (33)
- gitlab 日志 (36)
- adb pull (37)
- python判断元素在不在列表里 (34)
- python 字典删除元素 (34)
- vscode切换git分支 (35)
- python bytes转16进制 (35)
- grep前后几行 (34)
- hashmap转list (35)
- c++ 字符串查找 (35)
- mysql刷新权限 (34)