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 关键字只是对部署任务做一个记录和分类,方便管理和查询部署任务,并无实际区分部署环境的功能。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32第十二节(中级篇):串口通信(第一节)——功能框图讲解

前言 我们在51单片机中就已经学习过了串口通信的相关知识点,那么我们现在在32单片机上进一步学习通信的原理。我们主要讲解串口功能框图以及串口初始化结构体以及固件库讲解。 STM32第十二节(中级篇):串口通信(第一节…

Python绘图入门:使用Matplotlib绘制柱状图

Python绘图入门:使用Matplotlib绘制柱状图 柱状图是一种常见的数据可视化方式,能够直观地展示不同类别之间的数据差异。在Python中,Matplotlib是一个非常强大且灵活的绘图库,它不仅能绘制简单的图表,还能创建复杂的多…

远程命令行控制SSH

第一次接触SSH是ROS小车作为服务端,通过ubuntu电脑客户端访问。因为机器人接键盘和屏幕操作起来不方便,所以使用SSH进行连接,方便对小车的操作。 1.服务端安装 打开终端查看ssh是否安装 sudo service ssh status 如果未安装 sudo apt upd…

【网络】私有IP和公网IP的转换——NAT技术

目录 引言 NAT工作机制​编辑 NAT技术的优缺点 优点 缺点 个人主页:东洛的克莱斯韦克-CSDN博客 引言 公网被子网掩码划分为层状结构,一个公网IP的机器又可以用很多私有IP搭建内网。在日常生活场景中用的都是私有IP,例如手机,…

目标检测算法,Yolov7本地化部署使用(一)

安全帽检测、口罩检测、行为检测、目标物体检测,随着深度学习和计算机视觉技术的不断发展,目标检测成为了研究热点之一。YOLOv7作为YOLO系列的新成员,以其高效和准确的性能受到了广泛关注。本文将介绍如何在本地部署并利用YOLOv7完成目标检测…

OpenCV图像处理——按最小外接矩形剪切图像

引言 在图像处理过程中,提取感兴趣区域(ROI)并在其上进行处理后,往往需要将处理后的结果映射回原图像。这一步通常涉及以下几个步骤: 找到最小外接矩形:使用 cv::boundingRect 或 cv::minAreaRect 提取感兴…

计算机毕业设计 助农产品采购平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

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

C# 中 Tuple 与 ValueTuples 之间的区别

在 C# 中,元组和值元组都用于在单个变量中存储多个值。但它们在语法、功能和性能方面存在一些关键差异。 一.Tuples(元组) 元组是一种引用类型,长期以来一直是 .NET 的一部分。它们是使用 System.Tuple 类创建的。 例子 using System; class Program…

07 STM32ADC

AD单通道和AD多通道 使用ADC可以对高电平和低电平之间的任意电压进行量化,最终用一个变量来表示,读取这个变量。所以ADC就是一个电压表,把引脚电压值测出来,放在一个变量里。 数字到模拟的桥梁,PWM来控制电机的速度&a…

springboot家校共育平台-计算机毕业设计源码54235

摘 要 采用高效的SpringBoot框架,家校共育平台为家长与教师提供了便捷的沟通渠道。该平台整合了丰富的教育资源,实现了家校之间的即时信息互通,从而助力协同教育。 为进一步方便用户访问和使用,平台与微信小程序进行了深度整合。家…

SPAW7000高精度功率分析记录仪,测试方案

测试目标 评估双电机四驱系统中前后电机的性能。 分析前后电机之间的实时联动情况。 测量并分析电机控制器的输入与输出功率。 计算功率转换效率和损耗。 验证电机系统的谐波特性。 测试设备 SPAW7000高精度功率分析记录仪:用于测量功率、电压、电流等参数&am…

【LeetCode Cookbook(C++ 描述)】一刷二叉树综合(上)

目录 LeetCode #226:Invert Binary Tree 翻转二叉树「遍历」「分而治之」广度优先搜索:层序遍历 LeetCode #101:Symmetric Tree 对称二叉树递归法迭代法 LeetCode #100:Same Tree 相同的树递归法迭代法 LeetCode #559:…

八种排序算法的复杂度(C语言)

归并排序(递归与非递归实现,C语言)-CSDN博客 快速排序(三种方法,非递归快排,C语言)-CSDN博客 堆排序(C语言)-CSDN博客 选择排序(C语言)以及选择排序优化-CSDN博客 冒泡排序(C语言)-CSDN博客 直接插入排序(C语言)-CSDN博客 希尔排序( 缩小增量排序 )(C语言)-CSDN博客 计数…

赋能基层,融合创新:EasyCVR视频汇聚平台构建平安城市视频共享系统

一、雪亮工程建设的意义 雪亮工程的核心在于通过高清视频监控、环境监测和智能预警等先进技术手段,构建一个高效、智能、安全、便捷的社会安全防控体系。这一工程的建设不仅代表了现代化科技手段在城市治安管理中的应用,更是提升社会安全保障能力、推动…

LeetCode.3152.特殊数组II

题目描述: 如果数组的每一对相邻元素都是两个奇偶性不同的数字,则该数组被认为是一个 特殊数组 。 你有一个整数数组 nums 和一个二维整数矩阵 queries,对于 queries[i] [fromi, toi],请你帮助你检查 子数组 nums[fromi..toi…

纷享销客CRM AI产品架构概览、产品特色

一、纷享销客CRM AI产品架构概览 纷享AI平台架构分为三个主要层次:AI基础设施层、AI平台层和AI应用层。每个层次都由一系列功能模块组成,旨在为客户提供强大的技术支持和灵活的解决方案。 1.Al基础设施层 AI基础设施层是整个AI平台的底层支撑&#xff…

使用WooCommerce订阅续订进行货到付款:自定义订单状态

WooCommerce订阅插件允许商店设置周期性的订阅产品。客户购买订阅后,系统会自动根据设定周期进行续订。但对于货到付款的场景,自动续订就面临挑战。 自定义订单状态 为了实现货到付款的续订流程,我们需要创建一个自定义订单状态。以下是具体…

牛客刷题总结——Python入门07:内置函数

🤵‍♂️ 个人主页: @北极的三哈 个人主页 👨‍💻 作者简介:Python领域优质创作者。 📒 系列专栏:《牛客题库-Python篇》 🌐推荐《牛客网》——找工作神器|笔试题库|面试经验|实习经验内推,求职就业一站解决 👉 点击链接进行注册学习 文章目录 010 内置函…

鸿蒙开发入门day06-ArkUI简介

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,还请三连支持一波哇ヾ(@^∇^@)ノ) 目录 ArkUI简介 基本概念 两种开发范式 不同应用类型支持的开发范式 …

Linux--应用层协议HTTP协议(http服务器构建)

目录 1.HTTP 协议 2.认识 URL 3.urlencode 和 urldecode(编码) urlencode(URL编码) urldecode(URL解码) 4.HTTP 协议请求与响应格式 4.1HTTP 常见方法(三种) 5.HTTP 的状态码…