Gitlab的流水线任务【实现每小时自动测试 dev分支的更新】

背景

在现代软件开发实践中,持续集成(Continuous Integration, CI)是确保代码质量和快速响应软件缺陷的关键策略。GitLab 提供了强大的 CI/CD 功能,允许开发者自动化测试和部署流程。本文将介绍如何设置 GitLab 流水线计划任务,以实现对 dev 分支每小时的自动测试。

需求: GitLab 流水线计划任务(pipeline-schedules):实现每小时自动测试 dev 分支的更新

环境

Gitlab企业版本:v16.9.2-ee
在这里插入图片描述
GitLab 流水线是一系列作业(jobs)的集合,这些作业可以并行或顺序执行,以完成构建、测试、部署等任务。流水线可以由代码提交、定时计划或其他事件触发。

计划任务是 GitLab 流水线的一个特性,它允许你按计划执行流水线,而不需要代码提交或其他触发条件。这对于定期运行测试、备份或其他维护任务特别有用。

每小时自动测试 dev 分支的步骤

创建 .gitlab-ci.yml 配置文件

在项目的根目录下,创建或编辑 .gitlab-ci.yml 文件,这是 GitLab 流水线的配置文件。我们将定义两个作业:一个是常规的测试作业,另一个是计划任务作业。

stages:
  - test
  - alert
  - jar


before_script:
  - export PATH=/usr/lib/jvm/java-21/bin:${PATH}        # 将java路径添加到PATH路径中。如果是java 11,使用/usr/lib/jvm/java-11/bin。

ci_test:
  stage: test
  script:
    - |
      if [ "$(git log origin/dev --since='1 hour ago' --pretty=format:'%h')" != "" ]; then
        mvn clean test
      else
        echo "No changes in the last hour"
      fi
    - export
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_BRANCH == "dev"'

dingTalk_fail_alert:
  stage: alert
  script:
    - /bin/bash /opt/k8s/dingtalk/ding_ci_alert.sh fail
  when: on_failure
  allow_failure: true
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_BRANCH == "dev"'

dingTalk_succes_alert:
  stage: alert
  script:
    - /bin/bash /opt/k8s/dingtalk/ding_ci_alert.sh success
  when: on_success
  allow_failure: true
  rules:
    - if: '$CI_PIPELINE_SOURCE == "schedule" && $CI_COMMIT_BRANCH == "dev"'
  
jar:
  stage: jar
  tags:
    - pdd
  cache:
    paths:
      - manage-analysis/target/*.jar
      - manage-listener/target/*.jar
      - manage-backend/target/*.jar
    policy: push
    key: ${CI_BUILD_REF_NAME}
  script:
    - mvn clean install -Dmaven.test.skip=true
  rules:
    - if: '$CI_PIPELINE_SOURCE != "schedule" && $CI_COMMIT_BRANCH == "dev"'

配置钉钉告警机器人

配置钉钉告警机器人:关键字认证 “告警”
在这里插入图片描述

配置告警脚本脚本模板

在GitLab CI/CD 管道中,我们设计了一个名为 ding_ci_alert.sh 的Shell脚本,用于对接钉钉机器人发送构建状态的通知。针对不同的构建结果,我们有如下需求:

  1. 当Maven测试任务失败时,我们会向脚本传递一个参数 "fail",表示构建失败。此时,脚本不仅会调用钉钉机器人发送一条包含失败详情的告警消息,还会将此次失败的构建ID写入一个专门记录失败构建的文件中。
  2. 当后续的Maven测试任务成功时,我们将向脚本传递一个参数 "success",以标识构建成功。这时,脚本首先会检查记录失败构建的文件中是否存在当前构建ID。如果存在,则调用钉钉机器人发送一条成功恢复的消息,并从记录文件中移除此构建ID;反之,若当前构建ID未在文件中找到,则不发送成功告警信息。

这样,我们通过灵活调用和智能判断,确保了在构建失败时及时通知相关人员,并在问题得到解决后发送成功通知,既避免了不必要的通知干扰,又保证了团队能够及时了解到构建状态的变化。在实际的博客文章中,您可以插入示例代码和详细说明,让读者更直观地理解这一过程。

vim /opt/k8s/dingtalk/ding_ci_alert.sh

#!/bin/bash

WEBHOOK_URL="https://oapi.dingtalk.com/robot/send?access_token=xxxxx"
# 检查是否提供了参数
if [ "$#" -ne 1 ]; then
  echo "Usage: $0 <success|fail>"
  exit 1
fi

# 定义记录文件路径
RECORD_FILE="/tmp/build_records.txt"

# 根据传入的参数执行相应操作
case $1 in
  fail)
    # 构建失败,发送告警并记录
    echo "构建失败,发送告警..."

    # 准备告警消息
    JSON_DATA=$(printf '{
      "msgtype": "markdown",
      "markdown": {
        "title": "告警:构建失败通知",
        "text": "#### **[%s 的 Maven 测试未通过构建失败](%s/pipelines/%s)**\n\n> - **提交信息**: %s\n> - **提交者名称**: %s\n> - **提交时间**: %s\n\n请及时处理,更多详情可点击项目名称。"
      },
      "at": {
        "isAtAll": false
      }
    }' "$CI_PROJECT_NAME" "$CI_PROJECT_URL" "$CI_PIPELINE_ID" "$CI_COMMIT_MESSAGE" "$CI_COMMIT_AUTHOR" "$CI_COMMIT_TIMESTAMP")

    # 发送告警
    curl "$WEBHOOK_URL" -X POST -H 'Content-Type: application/json;charset=utf-8' -d "$JSON_DATA"

    # 记录失败的构建
    echo "$CI_PROJECT_NAME failed" >> "$RECORD_FILE"
    ;;
  success)
    # 构建成功,检查记录文件
    if grep -q "$CI_PROJECT_NAME failed" "$RECORD_FILE"; then
      echo "构建成功,发送告警..."

      # 准备成功告警消息
      SUCCESS_JSON_DATA=$(printf '{
        "msgtype": "markdown",
        "markdown": {
          "title": "告警:构建成功通知",
          "text": "#### **[%s 的 Maven 测试已通过构建成功]**\n\n> - **提交信息**: %s\n> - **提交者名称**: %s\n> - **提交时间**: %s\n\n构建成功,可以进行下一步操作。"
        },
        "at": {
          "isAtAll": false
        }
      }' "$CI_PROJECT_NAME" "$CI_COMMIT_MESSAGE" "$CI_COMMIT_AUTHOR" "$CI_COMMIT_TIMESTAMP")

      # 发送成功告警
      curl "$WEBHOOK_URL" -X POST -H 'Content-Type: application/json;charset=utf-8' -d "$SUCCESS_JSON_DATA"

      # 清除记录
      sed -i "/$CI_PROJECT_NAME failed/d" "$RECORD_FILE"
    else
      echo "没有找到构建失败的记录,不发送成功告警。"
    fi
    ;;
  *)
    echo "Invalid argument: $1. Expected 'success' or 'fail'."
    exit 1
    ;;
esac

exit 0

设置流水线计划

步骤1:登录GitLab并进入项目

  1. 登录到您的GitLab账号。
  2. 导航到您想要设置流水线计划的项目。

步骤2:进入CI/CD设置

  1. 在项目主页,点击左侧面板中的“CI/CD”选项卡。
  2. 在CI/CD设置区域,点击“Schedules”(调度)。

步骤3:创建新的流水线计划

  1. 在“Schedules”页面,点击“New schedule”按钮以创建一个新的流水线计划。

步骤4:配置流水线计划详细信息

  1. 描述:为您的流水线计划提供一个易于理解的描述,以便日后识别。
  2. CRON 表达式:输入一个cron表达式来定义计划执行的时间规律。例如,每天凌晨1点执行,可以输入0 1 * * *。请参考cron表达式文档以获取更多信息。
  3. 分支/标签:可以选择流水线将在哪个分支或标签上执行,默认通常是当前项目的默认分支(如master/main)。
  4. 额外变量(可选):如果需要,您可以为流水线提供额外的环境变量,这将在计划执行时注入到环境中。
  5. 保护(可选):如有必要,您可以勾选“Protect this pipeline”,这样只有具有适当权限的用户才能执行或修改该流水线计划。

步骤5:保存流水线计划

  1. 配置完所有选项后,滚动到底部并点击“Save changes”。

步骤6:验证流水线计划

  1. 在指定的时间,GitLab将根据您设置的cron表达式自动触发流水线。您可以在项目的历史流水线记录中查看流水线计划的执行情况。

注意事项

  • 确保您的项目中有.gitlab-ci.yml文件,并且文件中定义了适当的CI/CD流水线配置,这样才能在计划时间到来时执行预定的任务。
  • 如果流水线涉及到敏感信息,您可能需要预先配置好变量并通过密钥管理或GitLab的受保护变量功能来安全地传递这些信息。
  • 某些高级设置,如运行特定job,需要在.gitlab-ci.yml文件中通过rulesonly/except关键字进行定义。
    在这里插入图片描述
    在这里插入图片描述

验证流水线自动化

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Linux centos7安装nginx-1.24.0并且实现自启动

1.安装之前的操作 ps -ef|grep nginx 查看是否有运行 如果有就杀掉 kill -9 pid find / -name nginx 查看nginx文件 rm -rf file /usr/local/nginx* 通通删掉删掉 yum remove nginx 限载一下服务 1.2.下载安装包 地址 nginx: download 2.减压文件 tar…

浮点二分(求一个数的平方根)

问题&#xff1a;求一个浮点数的平方根&#xff0c;要求保留两位小数。 #include<iostream> #include<iomanip> using namespace std;int main(){double x;cin>>x;double L0,Rx;while(R-L>1e-4){//保留两位小数的精度&#xff0c;若要保留3位小数&#…

蓝桥杯十四届 试题E接龙数列

思路&#xff1a; 做题要想到用对立面解题&#xff0c;要求最短的&#xff0c;就可以先求最长的 //先求最长的接龙序列的长度maxx&#xff0c;再用长度n减去maxx //先声明dp数组&#xff0c;记录以0-9结尾的最长的接龙数列的长度 //以字符串的形式输入 //更新以b结尾的最大接…

Zabbix与Prometheus区别简述

Zabbix与Prometheus区别简述 历史沿革 一、监控工具简介 1、Zabbix https://www.zabbix.com/cn/download Zabbix是传统的监控系统&#xff0c;出现比云原生早&#xff0c;使用的是SQL关系型数据库&#xff1b;开源监控软件&#xff0c;遵守 GPLv2开源协议&#xff0c;起源于…

【Android】【Bluetooth Stack】蓝牙电话协议分析(超详细)

1. 精讲蓝牙协议栈&#xff08;Bluetooth Stack&#xff09;&#xff1a;SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论 2. 欢迎大家关注和订阅&#xff0c;【蓝牙协议栈】和【Android Bluetooth Stack】专栏会持续更新中.....敬请期待&#xff01…

linux -- I2C设备驱动 -- MS32006(低压5V多通道电机驱动器)

产品简述 MS32006 是一款多通道电机驱动芯片, 其中包含两路步进电机驱动, 一路直流电机驱动; 每个通道的电流最高电流1.0A; 支持两相四线与四相五线步进电机。芯片采用 I2C 的通信接口控制模式, 兼容 3.3V/5V 的标准工业接口。 MS32006 总共集成了两路步进电机驱动器与一…

mysql置事务隔离级

隔离级别脏读&#xff08;Dirty Read&#xff09;不可重复读&#xff08;Non-Repeatable Read&#xff09;幻读&#xff08;Phantom Read&#xff09;读未提交是是是读已提交否是是可重复读否否是序列化否否否 这个表格以可读性的方式总结了四种隔离级别下可能发生的并发问题。…

【数据结构】——栈与队列(附加oj题详解)深度理解

栈 1.栈的定义 栈&#xff1a;栈是仅限与在表尾进行插入或者删除的线性表 我们把允许一端插入和删除的一端叫做栈顶&#xff0c;另一端叫栈底&#xff0c;不含任何元素的栈叫做空栈&#xff0c;栈又叫做后进先出的线性表&#xff0c;简称LIFO结构 2.栈的理解 对于定义里面…

Medium 级别反射型 XSS 攻击演示(附链接)

环境准备 如何搭建 DVWA 靶场保姆级教程&#xff08;附链接&#xff09;https://eclecticism.blog.csdn.net/article/details/135834194?spm1001.2014.3001.5502 测试 打开靶场找到该漏洞页面 先右键检查输入框属性 跟 Low 级别是一样的&#xff0c;所以咱们直接输入带 HTM…

不要看这些影视作品

这些电影/电视剧很不好看&#xff0c;虽然它评分很高&#xff0c;但是很容易误导人。我帮大家挑出来&#xff0c;以免浪费大家时间。 1. 假如我是真的 导演&#xff1a;王童 主演&#xff1a;谭咏麟、胡冠珍 不推荐理由&#xff1a;情节夸张&#xff0c;毒害青少年 2. 桃源…

JDBC综合练习

文章目录 1.需求2.环境搭建3.查询所有数据4.添加5.修改6.删除 1.需求 完成商品品牌数据的增删改查操作。 • 查询&#xff1a;查询所有数据 • 添加&#xff1a;添加品牌 • 修改&#xff1a;根据 id修改 • 删除&#xff1a;根据 id删除 2.环境搭建 •准备环境&#xf…

CISP 4.2备考之《物理与网络通信安全》知识点总结

文章目录 第 1 节 物理与环境安全第 2 节 网络安全基础第 3 节 网络安全技术与设备第 1 部分 防火墙第 2 部分 入侵检测系统第 3 部分 其他安全产品 第 4 节 网络安全设计规划 第 1 节 物理与环境安全 1.场地选择 1.1 场地选择:自然条件、社会条件、其他条件。1.2 抗震和承重&…

Set系列集合:Hashset、LinkedHashset、TreeSet --java学习笔记

Set系列集合 Set系列集合特点:无序、不重复、无索引添加数据的顺序和获取出的数据顺序不一致;Hashset:无序、不重复、无索引LinkedHashset:有序、不重复、无索引TreeSet:排序、不重复、无索引 代码演示&#xff1a; import java.util.*;public class ListTest5 {public stati…

c语言食堂就餐排队问题290行

定制魏&#xff1a;QTWZPW&#xff0c;获取更多源码等 目录 题目 数据结构 函数设计 结构设计 总结 效果截图 ​ 主函数代码 题目 设计一个程序来模拟食堂就餐排队问题&#xff0c;通过输入学生人数和面包数量&#xff0c;计算有多少学生能够吃到午餐。 数据结构 该…

【链表】Leetcode 2. 两数相加【中等】

两数相加 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c; 并且每个节点只能存储 一位 数字。请你将两个数相加&#xff0c;并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外&#xff0c;这两个数都不…

Python核心编程 --- 高级数据类型

Python核心编程 — 高级数据类型 字符串 列表 元组 字典 1.序列 序列&#xff1a;一组按顺序排列的数据集合。 在Python中存在三种内置的序列类型&#xff1a;字符串、列表、元组 优点&#xff1a;可支持索引和切片操作 特点&#xff1a;第一个正索引为0&#xff0c;指…

web学习笔记(四十三)ajax

目录 1.相关基础概念 1.1客户端与服务器 1.2URL地址 1.3 客户端和服务器端通信的过程 1.4 一个URL地址放入浏览器&#xff0c;到页面渲染发生了什么事情 1.5 数据 1.6资源的请求方式 2.Ajax 2.1什么是Ajax 2.2 jQuery 中的Ajax 2.2.1 $.get()的语法 2.2.2$.post()…

Spring Cloud Alibaba Sentinel 使用详解

一、Sentinel 介绍 随着微服务的流行&#xff0c;服务和服务之间的稳定性变得越来越重要。 Sentinel 以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征: 丰富的应用场景&#xff1a; Sentinel 承接了阿里巴…

Linux-Arm环境下配置编译qt-everywhere及交叉编译环境

前言 最近在搞交叉编译的事&#xff0c;手上拿了个同事的香橙派玩交叉编译&#xff0c;现在来到了第一步&#xff0c;就是先在arm上配置qt的开发环境。当然了Qt没有直接提供qt on arm&#xff0c;而是需要自行在arm环境下编译一个qt环境出来&#xff0c;所以这里需要使用到qt提…

集简云新增“文本语音转换”功能,实现智能语音交互

为丰富人工智能领域的应用集成&#xff0c;为用户提供更便捷和智能化的信息获取和视觉创作方式&#xff0c;本周集简云上线了内置应用—文本语音转换。目前支持OpenAI TTS和TTS HD模型&#xff0c;实现文本语音高效智能转换&#xff0c;也可根据你的产品或品牌创建独特的神经网…