当前位置: 首页 > news >正文

GitLab-CI/CD指南

由于公司没有运维,写go服务时各个环境编译部署还是略显麻烦,由于代码管理使用的是 gitlab,所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署,这样每次提交代码以后就可以自动部署到服务器上了。

gitlab 本身只有 CI/CD 的接口,真正执行 CI/CD 任务的是 gilab runner,它负责与 gitlab 通信,接受 CI/CD 任务,并交给 Executor 执行,Executor 有7种类型:

  • Docker
  • Shell
  • Kubernetes
  • SSH
  • VirtualBox
  • Parallels
  • Custom

Executor的类型在注册 Runner 的时候确定,比较常用的是 Docker 和 SSH。GitLab,Runner 和 Executor 之间的关系如下图所示(图片来自GitLab官方文档)。
在这里插入图片描述

安装gitlab-runner

gitlab 的CI/CD 任务是通过 runner 来运行的,runner 也是 go 语言实现的。我们需要单独安装 runner,而且可以在任意位置安装。

runner 有 docker 版和可执行程序版,这里我选择的是可执行程序版,安装方式可以参考官网。

我的服务器是 linux,使用官方提供的脚本安装:

curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh" | sudo bash

可执行程序名叫 gitlab-runner ,被放在 /usr/bin/ 目录下。

注册runner

runner 需要注册到 gitlab,其实就是把 runner 的信息告诉 gitlab,这样 gitlab 才知道把 CI/CD 任务交给谁运行。

注册 runner 的命令是 gitlab-runner register ,回车后会以交互式的方式注册 runner,其中比较重要的几个参数是:

  • executor:运行流水线的环境,也就是前面说的7种 Executor 类型,我使用本地 shell 运行流水线,所以输入 shell

  • url 和 registration-token:runner 和项目是挂钩的,所谓的注册,其实也就是把 runner 和某个项目关联起来。打开项目的 setting→CI/CD,找到 Runners 点击展开,在 Specific runners 栏下面就是我们需要的 url 和 token。如下图所示

    在这里插入图片描述

当然,为每个项目注册一个 runner 也不太合适,我们可以为一个组注册一个 runner,点开某个组,url 和 token 可以在同样的地方找到。这样组内每个项目就都能使用这个 runner 了。此外,也可以给整个 gitlab 注册 runner,但是这需要 root 账号。

另外,同样的 url 和 token 可以注册多个runner,然后通过 tag 来决定项目使用哪个 runner。
注册 runner 和安装 runner 是两个概念,也就是说即便我们只安装了一个 runner,也能注册多个 runner。安装 runner 是下载可执行程序,而注册只是往 gitlab 设置一些配置信息,它和 runner 本身其实没太大关系,注意此时我们的 runner 还没有开始运行。

除了使用交互式注册,还可以使用非交互方式,命令如下:

gitlab-runner register \--non-interactive \--url "https://gitlab.com/" \--registration-token "$PROJECT_REGISTRATION_TOKEN" \--executor "shell" \--description "share-runner" \--maintenance-note "Free-form maintainer notes about this runner" \--tag-list "shell,share" \--run-untagged="true" \--locked="false" \--access-level="not_protected"

注意到 --run-untagged 选项,它表示是否运行在没有标签的的分支上运行流水线。如果没有设置这个参数,也可以在 gitlab 页面上设置。就在我们查看 url 和 registration token 的地方,如果 runner 注册成功的话,可以看到下面的信息:

在这里插入图片描述

点击那个铅笔图标,可以设置 runner,在这里我们也可以勾选 run untagged jobs,如下图所示。

在这里插入图片描述

上面我的 runner 前面小圆点是绿色的,那是因为我的 runner 已经运行起来了。

注册完 runner 会生成配置文件 /etc/gitlab-runner/config.toml ,可以打开查看,我们配置的信息都在里面。

启动runner

在启动 runner 之前,我们可以先创建一个专门的用户来运行 runner,比如:

useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

这里我们添加的用户叫 gitlab-runner ,你也可以使用被的用户,甚至 root ,或者为了方便部署,使用部署的用户。
然后安装并启动 gitlab 服务:

gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
gitlab-runner start

所谓安装就是设置为系统服务,它会在 /etc/systemd/system/ 目录下生成 gitlab-runner.service 文件。
其他命令:

  • gitlab-runner stop 停止 gitlab-runner 服务。
  • gitlab-runner start 启动 gitlab-runner 服务。
  • gitlab-runner restart 重启 gitlab-runner 服务。
  • gitlab-runner status 查看 gitlab-runner 服务状态。
  • gitlab-runner uninstall 卸载 gitlab-runner 服务。
  • gitlab-runner list 列出所有注册的 runner。

编写流水线

我们通过在项目根目录下创建一个叫 .gitlab-ci.yml 的文件来定义流水线,也就是 CI/CD 如何执行。

流水线分为阶段和作业,阶段通过 stages 关键字定义,阶段是作业的容器,每个阶段内可以定义多个作业。阶段之间是串行执行的,阶段内的多个作业是并行执行的。

关于流水线的编写,可以参看官方文档,或者《GitLab CI/CD 从入门到实战》这本书。当然 gitlab 官方也提供了很多示例,各种语言都有,如果不知到如何开始,可以参考官方示例。

基本结构如下:

stages: # 定义阶段- test    # 阶段名- build   # 阶段名- deploy  # 阶段名unit_test:    # 作业名stage: test # 作业属于 test 阶段script:     # 作业执行的命令- echo "unit test"compile:        # 作业名stage: build  # 作业属于 build 阶段script:       # 作业执行的命令- echo "build"deploy_test:     # 作业名stage: deploy  # 作业属于 deploy 阶段secipt:        # 作业执行的命令- echo "deploy test"

我用的是 go 语言,使用 shell 运行和部署,只有测试环境和正式环境。

default:interruptible: true # 允许打断流水线variables:GOBIN: "/usr/local/go/bin/go"GOINSECURE: git.i****d.comGOPRIVATE: git.i****d.comGOPROXY: https://goproxy.cn,directimage: golang:lateststages:- test- build- deployformat:stage: testscript:- echo "单元测试"- pwd- echo ~- echo $CI_COMMIT_BRANCH- echo $CI_DEFAULT_BRANCE- export GOINSECURE=$GOINSECURE- export GOPRIVATE=$GOPRIVATE- export GOPROXY=$GOPROXY- $GOBIN version- $GOBIN mod tidy- $GOBIN test -v 2>&1 | go-junit-report -set-exit-code > report.xmlartifacts:when: alwaysreports:junit: report.xmlcompile:stage: buildscript:- echo "编译"- pwd- echo ~- export GOINSECURE=$GOINSECURE- export GOPRIVATE=$GOPRIVATE- export GOPROXY=$GOPROXY- $GOBIN version- $GOBIN mod tidy- mkdir -p _build- $GOBIN build -o _build/$CI_PROJECT_NAME main.goartifacts:expire_in: 1 hourpaths:- _build# 部署生产环境(仅release分支)
deploy_prod:stage: deployvariables:SERVER_IP: "1**.**.**.*"script: - echo "部署生产环境"- ssh z**j@$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME # 创建项目文件夹- ssh z**j@$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME/config # 创建配置文件夹- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && [ -f run.sh ] && ./run.sh stop || :" # 停止服务- scp _build/$CI_PROJECT_NAME z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷贝可执行文件- scp run.sh z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷贝run.sh- scp config/application.prod.toml z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/config/application.toml # 拷贝配置文件- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && chmod +x run.sh"- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && ./run.sh start" # 重启服务only:- release # 仅release分支部署到生产环境environment: production# 部署测试环境(非main和release分支)
deplog_test:stage: deployvariables:SERVER_IP: "1**.**.**.*"script:- echo "部署测试环境"- ssh z**j@$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME # 创建项目文件夹- ssh z**j@$SERVER_IP mkdir -p /data/z**j/$CI_PROJECT_NAME/config # 创建配置文件夹- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && [ -f run.sh ] && ./run.sh stop || :" # 停止服务- scp _build/$CI_PROJECT_NAME z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷贝可执行文件- scp run.sh z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/ # 拷贝run.sh- scp config/application.test.toml z**j@$SERVER_IP:/data/z**j/$CI_PROJECT_NAME/config/application.toml # 拷贝配置文件- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && chmod +x run.sh"- ssh z**j@$SERVER_IP "cd /data/z**j/$CI_PROJECT_NAME/ && ./run.sh start" # 重启服务except:- $CI_DEFAULT_BRANCH- releaseenvironment: test

多环境部署通过不同的分支来实现, .gitlab-ci.yml 中的 environment 关键字只是对部署任务做一个记录和分类,方便管理和查询部署任务,并无实际区分部署环境的功能。

相关文章:

GitLab-CI/CD指南

由于公司没有运维,写go服务时各个环境编译部署还是略显麻烦,由于代码管理使用的是 gitlab,所以决定使用 gitlab 自带的 CI/CD 来做自动编译和部署,这样每次提交代码以后就可以自动部署到服务器上了。 gitlab 本身只有 CI/CD 的接…...

io目录操作学习

1、基本概念 目录也是一种文件,因此操作流程与普通文件类似,有诸如打开、关闭、定位等概念,但目录是一种特殊的文件,目录存储的数据的最小单位并不是字符,而是目录项。这使得目录跟普通文件又有区别。 在Linux中&…...

Ant-Design-Vue

Ant-Design-Vue是蚂蚁金服Ant Design官方推荐的Vue版UI组件库,它继承了Ant Design的设计语言和Vue.js的易用性,为开发者提供了丰富、高质量的Vue组件,极大地简化了前端开发流程。以下是一份详细的Ant-Design-Vue快速上手指南及排坑建议&#…...

2024互联网暑期实习面经和流程记录分享

2024互联网暑期实习面经和流程记录分享 面试经验和流程需要注意的点 面试经验和流程 因为敏感信息的原因,这里涉及到公司名字的全部进行打码 笔者投递和面试了很多公司,具体有包括算法和开发岗,下面的公司一律用字母代替。 O公司&#xff0…...

风云崛起之拉氏变换和拉式逆变换

图像的分割写出来了,但是写的不好,暂时先不发了。这两天小y想在把拉式变换的内容写出来,小y最近再看信号和电路,需要复习数学,所以把这点写出来。 首先要推出分布积分的公式,我们知道积分和微分为逆运算&am…...

1、.Net UI框架:WinUI - .Net宣传系列文章

WinUI(Windows UI Library)是微软提供的一个用于构建Windows应用程序的本机UI平台组件。它与Windows应用SDK紧密相关,允许开发者创建适用于Windows 10及更高版本的应用程序,并且可以发布到Microsoft Store。WinUI 3是最新的一代,它提供了与操…...

计算机的错误计算(五十九)

摘要 讨论用 Go语言实现的 函数的计算精度问题。 由计算机的错误计算(五十五)知,国际 IEEE 754 标准中, 函数具有定义域 . 那么,在常规编程模式下用 Go语言实现这个函数,其输出的精度如何? …...

【数学分析笔记】第1章第1节:集合(1)

作为一个计算机专业的人,想自学一下数学专业的专业课补一补AI基础,顺带写个笔记,听的课是陈纪修版本的数学分析: 1. 集合与映射 1.1 集合 1.1.1 基本概念 集合:由某种特定性质的具体的或抽象的对象汇集的总体。 集…...

计算机毕业设计 校园失物招领网站 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

GIT指令大全详解

目录 GIT指令详解 拉取 提交 分支操作(假设分支为a) 版本回退 主分支拉取到分支 常用的Git指令 一、初始化配置 二、初始化仓库 三、检查当前文件状态 四、添加 五、查看提交历史 六、撤销更改 七、查询 八、分支 九、标签管理 十、其他常用指令 GIT指令详解 Git是一个开源的分…...

ECCV2024,清华百度提出ReSyncer:可实现音频同步嘴唇动作视频生成。

清华&百度等联合提出了ReSyncer,可以实现更高稳定性和质量的口型同步,而且还支持创建虚拟表演者所必需的各种有趣属性,包括快速个性化微调、视频驱动的口型同步、说话风格的转换,甚至换脸。 ReSyncer的工作原理可以简单理解为…...

论文笔记:YOLOv8-QSD 自动驾驶场景小目标检测算法

摘要 YOLOv8-QSD网络是一种新型的无锚点驾驶场景检测网络,建立在YOLOv8的基础上,在保证检测精度的同时保持效率。该网络的骨干网采用结构重参数化技术来转换基于多样化分支块 (DBB) 的模型。 为了准确检测小目标,它集…...

Vue.js状态管理:Vuex与Pinia的比较

在 Vue.js 生态系统中,状态管理是构建复杂应用时的重要组成部分。Vue.js 提供了两种流行的状态管理库:Vuex 和 Pinia。虽然两者都旨在简化状态管理,但它们在设计哲学、API、性能和易用性方面有所不同。本文将深入探讨 Vuex 和 Pinia 的异同&a…...

OJ题目【栈和队列】

目录 有效的括号 有效的括号【代码】 用队列实现栈 用队列实现栈【代码】 用栈实现队列 用栈实现队列【代码】 设计循环队列 有效的括号 https://leetcode.cn/problems/valid-parentheses/submissions/551394950/ 思路:把左括号放到栈里,取出来栈…...

[shell][git]git将当前分支的HEAD指针重置到最后一次提交的状态

在Git中,git reset --hard HEAD 命令用于将当前分支的HEAD指针重置到最后一次提交的状态,并且会丢弃当前工作目录中的所有更改。这个命令的意思是: git reset:重置命令,用于将HEAD指针移动到指定的状态。--hard&#…...

高翔【自动驾驶与机器人中的SLAM技术】学习笔记(六)卡尔曼滤波器二:图解卡尔曼滤波器;卡尔曼滤波器公式理解;面试答法;

上一篇卡尔曼滤波器一中,从整体上认识了,卡尔曼滤波器整体是在做一件什么事。 知道了,协方差就可以理解为偏差,或者误差。 这一篇主要讲卡尔曼滤波器中的公式,理解公式,就能知道如何实现卡尔曼滤波器。 上一篇:卡尔曼滤波器在做一件什么事,这一篇,卡尔曼滤波器怎么…...

高性能日志系统 日志输出模块逻辑

概述 该模块主要实现了一个日志系统的输出模块,通过多态、工厂模式等设计模式,构建灵活的日志输出架构。 功能:格式化完成的标准日志消息,输出到指定为止拓展:支持同时将日志落地到不同的位置,也就是输出日…...

haproxy基础

目录 1 HAProxy介绍 1.1 版本对比 1.2 HAProxy功能 2 参数介绍与实践 2.1 global参数说明 2.2 真实代码格式实例 2.3 常用全局参数 2.3.1 nbproc -- 开启几个进程 2.3.2 cpu-map(CUP绑定) 2.3.3 nbthread 2 --开启2个线程 3 Proxies配置 3.1 Proxies配置-defaults 3.2 Proxi…...

C++ 面试题常用总结 详解(满足c++ 岗位必备,不定时更新)

📚 本文主要总结了一些常见的C面试题,主要涉及到语法基础、STL标准库、内存相关、类相关和其他辅助技能,掌握这些内容,基本上就满足C的岗位技能(红色标记为重点内容),欢迎大家前来学习指正&…...

LVS实验——部署DR模式集群

目录 一、实验环境 二、配置 1、LVS 2、router 3、client 4、RS 三、配置策略 四、测试 1.Director服务器采用双IP桥接网络,一个是VPP,一个DIP 2.Web服务器采用和DIP相同的网段和Director连接 3.每个Web服务器配置VIP 4.每个web服务器可以出外网…...

【机器视觉】单目测距——运动结构恢复

ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛&#xf…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

linux 下常用变更-8

1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行&#xff0c;YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID&#xff1a; YW3…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

Android第十三次面试总结(四大 组件基础)

Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成&#xff0c;用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机&#xff1a; ​onCreate()​​ ​调用时机​&#xff1a;Activity 首次创建时调用。​…...

uniapp 字符包含的相关方法

在uniapp中&#xff0c;如果你想检查一个字符串是否包含另一个子字符串&#xff0c;你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的&#xff0c;但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

什么是VR全景技术

VR全景技术&#xff0c;全称为虚拟现实全景技术&#xff0c;是通过计算机图像模拟生成三维空间中的虚拟世界&#xff0c;使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验&#xff0c;结合图文、3D、音视频等多媒体元素…...

在树莓派上添加音频输入设备的几种方法

在树莓派上添加音频输入设备可以通过以下步骤完成&#xff0c;具体方法取决于设备类型&#xff08;如USB麦克风、3.5mm接口麦克风或HDMI音频输入&#xff09;。以下是详细指南&#xff1a; 1. 连接音频输入设备 USB麦克风/声卡&#xff1a;直接插入树莓派的USB接口。3.5mm麦克…...