Trino源码Gitlab CICD单测环境建设

news2025/5/10 8:13:07

在中大型公司,由于对Presto源码的定制魔改量越来越大,会随着时间推移而增大出现冷门bug的概率,所以建立一套自动测试机制,在魔改源码合入主分支时可以自动触发test case,通过特定单测的执行失败,来更清晰的判断是否过去的魔改涉及到了不符合社区源码原本假设的部分,并对魔改后的情况不一致进行修正。 

Gitlab Runner正好可以提供这样的机制,提升更早发现源码改动问题的效率。

一、安装并注册Gitlab Runner

Gitlab Runner相当于Gitlab服务在另一个机器上的分布式slave节点,用于接收Gitlab主服务所在机器的任务并执行,并将执行结果汇报回Gitlab主服务节点。首先需要部署服务器在8核CPU、32G内存以上,并且看下已有Gitlab服务的版本,安装Runner的版本要尽量和主服务版本一致,以免出现冷门bug:

确定版本后,去主服务可网络连通的另一台机器上安装Gitlab Runner:

# 添加官方仓库
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh | sudo bash
# 查看版本列表
yum list gitlab-runner --showduplicates | sort -r
# 安装指定版本
yum install gitlab-runner-12.6.0-1
# 安装完成后查看版本
gitlab-runner -v

安装和Gitlab主服务版本一致的Runner后,还需要反向注册回Gitlab主服务,让主服务知道它的存在,先看一下Gitlab主服务里Trino仓库中的Runner所需要信息,包括主服务的url以及registration token:

复制下来之后,在后续的Runner注册过程中贴到接下来的命令的输入中:

# 开始向Gitlab主服务注册自己
gitlab-runner register
                          
# 在这里粘贴Gitlab主服务的url后回车
Please enter the gitlab-ci coordinator URL (e.g. https://gitlab.com/):
http://xxx.xxx.xxx.xxx:xxxx/

# 在这里粘贴前面看到的registration token后回车
Please enter the gitlab-ci token for this runner:
Bb1aWAr8Cn_HpN_y76o1

# 这里写一点描述并回车
Please enter the gitlab-ci description for this runner:
test服务器

# 这里给runner打标签并回车,可以控制是否只有带特定标签的Gitlab项目才能使用这个runner
Please enter the gitlab-ci tags for this runner (comma separated):
presto

# 指定以哪种方式启动runner的任务,shell即利用当前linux物理机环境起个进程,docker则每次启动一个容器
Please enter the executor: custom, parallels, ssh, virtualbox, kubernetes, docker, docker-ssh, shell, docker+machine, docker-ssh+machine:
shell

上述环节结束后,gitlab runner服务就会以gitlab-runner用户身份来启动,并且在Gitlab主服务界面也可以看到了,如下图所示:

 刚启动时圆形灯是绿色的,我这里灰色是因为正在执行任务(连不上的时候也会显示灰色)。

上述部分更详细的教程可参考:

CI/CD 系列 | 一文让你掌握 Gitlab Runner - 掘金文本讲述了 Gitlab Runner 的设计结构,描述了Executor 的类型与选择方案,以及它的安装,注册,配置流程。https://juejin.cn/post/7134644436192985095一键安装gitlab runner - 简书概述 GitLab Runner是一个开源项目,用于运行作业并将结果发送到GitLab。GitLab Runner是Go编写,可以在Linux、Windows以及Mac OS...https://www.jianshu.com/p/0aa64d6b4638

二、修改Gitlab Runner默认配置

默认参数配置在执行CICD任务的时候可能会遇到一些坑,所以针对Trino还是要修改一部分,首先修改gitlab-runner的配置文件:

vim /etc/gitlab-runner/config.toml

#以下为配置文件中的内容
concurrent = 1
check_interval = 0

[session_server]
  session_timeout = 1800

[[runners]]
  name = "test服务器"
  url = "http://xxx.xxx.xxx.xxx:xxxx/"
  token = "xxxxx"
  executor = "shell"
  # 出于磁盘空间考虑可以把Gitlab主服务传来的project代码放在其他位置
  builds_dir = "/data/app/gitlab-runner/"
  # 单位为KB,Trino日志量很大,默认1M限制超出就直接失败,可以适当调大到50M以上
  output_limit = 1024000
  [runners.custom_build_dir]
  [runners.cache]
    [runners.cache.s3]
    [runners.cache.gcs]

在部分目录下需要root用户权限的话,也可以修改一下systemd中相关配置:

vim /etc/systemd/system/gitlab-runner.service

# 以下为配置内容
[Unit]
Description=GitLab Runner
After=syslog.target network.target
ConditionFileIsExecutable=/usr/lib/gitlab-runner/gitlab-runner

[Service]
StartLimitInterval=5
StartLimitBurst=10
ExecStart=/usr/lib/gitlab-runner/gitlab-runner "run" "--working-directory" "/home/gitlab-runner" "--config" "/etc/gitlab-runner/config.toml" "--service" "gitlab-runner" "--syslog" "--user" "root"
# 在上面这里更换--user参数

Restart=always
RestartSec=120

[Install]
WantedBy=multi-user.target

修改之后生效配置,重新启动一下gitlab-runner服务:

systemctl daemon-reload
 
systemctl restart gitlab-runner

接着还需要去Gitlab网页端修改一下关于该runner的一些配置,如下图所示:

三、安装Docker

Trino源码的部分单测会自动通过docker下载一些其他组件服务的容器下来进行联合测试,所以还需要安装一下docker,详细步骤可以参考:

centos7安装Docker详细步骤(无坑版教程) - 腾讯云开发者社区-腾讯云在安装 Docker 之前,先说一下配置,我这里是Centos7 Linux 内核:官方建议 3.10 以上,3.8以上貌似也可。https://cloud.tencent.com/developer/article/1701451这里需要注意的是,安装好的docker默认镜像仓库是国外中央仓库,下载速度很慢,容易导致Trino单测过久超时失败,所以要修改一下国内镜像源:

vim /etc/docker/daemon.json

# 以下为配置内容
{
  "registry-mirrors": [
    "https://dockerhub.azk8s.cn",
    "https://hub-mirror.c.163.com"
  ]
}

保存后刷新配置并重启docker服务:

systemctl daemon-reload

service docker restart

这样前置环境就基本准备好了。

四、Trino源码中增加.gitlab-ci.yml配置

Gitlab可以自动识别项目根目录下的.gitlab-ci.yml配置文件,所以源码project中加入该文件push上去,并且Gitlab网页里开一个merge request即可自动触发:

stages:
  - test

variables:
  TESTCONTAINERS_PULL_PAUSE_TIMEOUT: 1800
  TEST_REPORT_RETENTION_DAYS: 5

test:
  stage: test
  only:
    - merge_requests
  script:
    - export JAVA_HOME=/usr/java/zulu17.36.17-ca-jdk17.0.4.1-linux_x64
    - export PATH=$JAVA_HOME/bin:$PATH
    - export MAVEN_OPTS="$MAVEN_OPTS -XX:+CrashOnOutOfMemoryError -Dmaven.wagon.rto=180000 -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/tmp/gitlab-runner/dump/mvn.hprof"
    - ./mvnw -pl '!:trino-docs,!:trino-server-rpm' clean install -DskipTests
    - ./mvnw -pl '!:trino-accumulo,!:trino-atop,!:trino-bigquery,!:trino-cassandra,!:trino-clickhouse,!:trino-delta-lake,!:trino-docs,!:trino-server,!:trino-server-rpm,!:trino-druid,!:trino-elasticsearch,!:trino-geospatial,!:trino-google-sheets,!:trino-faulttolerant-tests,!:trino-hudi,!:trino-thrift,!:trino-memory,!:trino-kafka,!:trino-kinesis,!:trino-mariadb,!:trino-ml,!:trino-mongodb,!:trino-mysql,!:trino-oracle,!:trino-password-authenticators,!:trino-phoenix5,!:trino-pinot,!:trino-postgresql,!:trino-prometheus,!:trino-raptor-legacy,!:trino-redis,!:trino-redshift,!:trino-singlestore,!:trino-sqlserver,!:trino-teradata-functions,!:trino-test-jdbc-compatibility-old-server,!:trino-tpcds,!:trino-tpch' -DreuseForks=false -Dsurefire.exitTimeout=1800 -Dsurefire.useSystemClassLoader=false -Djdk.net.URLClassPath.disableClassPathURLCheck=true -Djdk.attach.allowAttachSelf -Djava.io.tmpdir=/data/tmp/gitlab-runner --fail-at-end -e -B -Dmaven.source.skip=true -Dair.check.skip-all verify
  timeout: 1d

上述配置也可以参考Trino源码中的.github/workflows/ci.yml文件来编写,可以参考-pl参数的写法酌情跳过一些不太需要的maven模块。

通过merge request触发Gitlab CICD pipeline任务后,就可以在如下界面里看到单测执行历史,可以点进去查看或下载Gitlab Runner执行时返回的日志信息:

日志中出现单测失败的内容,针对报错再修改源码修复就行。

五、适当修改Trino源码

由于该单测跑一轮花费的时间很长,消耗机器资源较大,而且中间可能会有docker下载慢等偶发因素导致执行到一半就挂了,所以可以酌情修改一下源码中的配置,例如pom.xml里的测试堆大小,如果观察到GC慢等问题的话:

还可以酌情选择在有单测报错时不直接结束任务,而是继续执行下去,或者跳过一些不太重要的单测类,如下所示:

 在中间出现单测任务资源扛不住挂了的问题,也可以参考:

java - The forked VM terminated without saying properly goodbye. VM crash or System.exit called - Stack Overflowhttps://stackoverflow.com/questions/23260057/the-forked-vm-terminated-without-saying-properly-goodbye-vm-crash-or-system-exi?page=1&tab=modifieddesc#tab-top

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多云管理产品组合VMware Aria,开启多云管理新篇章

今年8月份,VMware Explore美国大会上宣布了多云管理产品组合VMware Aria,宣布之后,市场上关注度非常高,而且受到了热捧。Aria这个名字动听且贴切,中文意思是 “咏叹调”,也就是说要用统一的、一致的曲调来歌…

big.LITTLEDynamIQ

最近看到了DynamIQ,于是来了解一下什么是DynamIQ? 前言 首先要知道DynamIQ,那么你肯定得知道big.LITTLE。因为DynamIQ可以说是big.LITTLE新一代或者是升级版。 那么在这之前你肯定得知道什么是big.LITTLE? 然后知道了后你就会…

旋转框目标检测mmrotate v0.3.1 训练DOTA数据集(三)——配置文件优化技巧

1、 目标检测比赛中的tricks DOTAv2遥感图像旋转目标检测竞赛经验分享(Swin Transformer Anchor free/based方案) 目标检测比赛中的tricks(已更新更多代码解析) 水下目标检测算法赛解决方案分享 | 2020年全国水下机器人&#xf…

基于布谷鸟搜索混合灰狼优化算法求解单目标优化问题(AGWOCS)

👨‍🎓个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜…

【工具】typora的一些配置

文章目录1. 自动编号1.1 大纲编号1.2 目录编号3. 正文部分2. 自定义快捷键1. 自动编号 我们在查看文档时候,希望编译器能够自动根据标题样式按顺序编号,不需要用户自行添加相应标题。这样也方便用户随时更新文档时候不会因为修改了某个编号而要去修改其…

分享3个文字配音软件,帮助你们轻松制作短视频

有没有刚踏入自媒体行业的小伙伴呀?那你们是不是为视频的后期工作所困惑着呢? 大家平时刷到的视频虽然看起来简短又有趣,但其实后期制作并没那么简单,是由许多道工序环环相扣而成的,其中比较重要的,就是为视…

JavaEE进阶:Spring 更简单的读取和存储对象

文章目录前言一、存储 Bean 对象1、前置⼯作:配置扫描路径(重要)2、添加注解存储 Bean 对象① Controller(控制器存储)② Service(服务存储)③ Repository(仓库存储)④ C…

栈的实现.

文章目录1.栈的概念及结构2.栈的实现(数组实现)2.1栈头文件2.2函数实现3.栈的习题3.1有效的括号3.1.1思路分析3.1.2代码实现1.栈的概念及结构 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删…

Qt第二十一章:Qt Designer 之 布局

简单场景:页面上放一个QTextEdit控件 预览后发现,拖拽放大窗口,QTextEdit控件不会进行缩放,就像下边自适应缩放 我们看到了QTextEdit控件撑满了整个界面:在控件sizePolicy属性的允许范围中尽可能的撑满界面。 如果换成…

基于h5的风云网球网站的设计

目 录 1绪 论 1 1.1 选题背景及意义 1 1.2 国内外研究现状 2 1.3本章小结 2 2 前端开发及相关技术 4 2.1 HTML5前端开发环境 4 2.2 HTML5前端开发工具 4 2.3 HTML5前端开发相关技术 5 2.3.1 javascript简介 5 2.3.2 javascript基本特点 5 2.3.3 css简介 6 2.3.4 jQuery 7 2.4 本…

Python精髓之括号家族:方括号、花括号和圆括号,你真的会用吗?

Python独一无二的特色除了缩进还有哪些特色呢?大多数的回答一定是 语法简洁、简单易学、代码高效、功能强大四项。那究竟是Python的哪些语言特性使得人们普遍认为Python具有这些特点呢?其实很大程度上,这要归功于列表(list&#x…

公众号免费题库使用方法

公众号免费题库使用方法 本平台优点: 多题库查题、独立后台、响应速度快、全网平台可查、功能最全! 1.想要给自己的公众号获得查题接口,只需要两步! 2.题库: 题库:题库后台(点击跳转&#xf…

haoop启动正常,但上不去网页hadoop102:9870

haoop启动正常,但上不去网页hadoop102:9870 症状如下: hadoop启动正常,jps正常 网页上不去 查下cmd,ping不通 解决方法 一、 先查hdfs 命令:vim /opt/module/hadoop-3.1.3/etc/hadoop/hdfs.site.xml 二、查hosts,我就是…

Redis实战篇(五)好友关注

1、点赞 ------------ Set 2、点赞排行 ------SortedSet 3、共同关注 -------set sinter 一、共同关注 Overridepublic Result followCommons(Long id) {// 1.获取当前用户Long userId UserHolder.getUser().getId();String key "follows:" userId;// 2.求交集St…

Gradle (史上最全): 5W字文

Gradle是绕不开的一个构建工具 对于用惯了 maven的人来说, Graddle不好用, 非常不好用, 主要是环境 会遇到各种各样的问题 但是,越来越多的 场景使用到了 Graddle,但是 spring 的源码,使用 Gradle 构建 …

【Fiddler】安卓7.0以上添加Fiddler/Charles证书到系统根证书(模拟器-雷电)

目录 一、安装工具 1、安装open-ssl 2、配置环境变量 3、验证安装 二、Fiddler 1、导出证书 2、转化cer格式变成PEM 3、查看PEM的哈希值 三、Charles 1、导出证书 2、查看PEM的哈希值 四、证书安装到安卓模拟器 (雷电) 1、使用模拟器的adb命令 2、…

【实战案例】——实战渗透某不法网站

作者名:Demo不是emo 主页面链接:主页传送门 创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座…

RPA-机器人流程自动化

RPA-机器人流程自动化RPA-机器人流程自动化简介RPA是什么?RPA历史上的演变RPA原理RPA特点RPA技术框架及功能1.TagUI2.RPA for Python3.Robot Framework4.Automagica5.Taskt6.OpenRPARPA部署模式1 环境配置的参数调整2 将自动化程序整体打包部署3 版本的管理和控制机…

【微服务】SpringCloud的OpenFeign与Ribbon配置

💖 Spring家族及微服务系列文章 ✨【微服务】SpringCloud轮询拉取注册表及服务发现源码解析 ✨ 【微服务】SpringCloud微服务续约源码解析 ✨ ✨【微服务】SpringCloud微服务注册源码解析 ✨【微服务】Nacos2.x服务发现?RPC调用?重试机制&…

token的使用

一:什么是token及token的作用? 1.什么是token? Token是首次登录时,由服务器下发,作为客户端进行请求时的一个令牌。当请求后台方法时,用于身份验证 当第一次登录后,服务器生成一个Token便将此…