jjzjj

Trino源码Gitlab CICD单测环境搭建

书忆江南 2024-05-14 原文

在中大型公司,由于对Trino源码的定制魔改量越来越大,会随着时间推移而增大出现冷门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://dockerproxy.com",
    "https://hub-mirror.c.163.com",
    "https://mirror.baidubce.com",
    "https://ccr.ccs.tencentyun.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执行时返回的日志信息:

可以ctrl+f搜索日志中“test failure”的字样来查看单测失败的报错,针对报错再修改源码修复就行。

五、适当修改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

有关Trino源码Gitlab CICD单测环境搭建的更多相关文章

  1. ruby-on-rails - 在 Rails 开发环境中为 .ogv 文件设置 Mime 类型 - 2

    我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain

  2. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  3. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

    之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

  4. ruby-on-rails - ruby gem如何在rails环境下工作 - 2

    我试图在rails中了解rubygems是如何变得可以自动使用的,而不是在使用required的文件中gem? 最佳答案 这是通过bundler/setup完成的:http://bundler.io/v1.3/bundler_setup.html.它在您的config/boot.rb文件中是必需的。简而言之,它首先将环境变量设置为指向您的Gemfile:ENV['BUNDLE_GEMFILE']||=File.expand_path('../../Gemfile',__FILE__)然后它通过要求bundler/setup将所有ge

  5. ruby-on-rails - 我需要一个真正的 UNIX RoR 开发环境 - 2

    从一开始,我就是一个Windows高手。我从MS-DOS开始。我安装了Windows2.1以及此后的所有Windows。现在,我家里有10台不同的Windows机器在运行,从Windows7Ultimate到各种版本的WindowsServer。我还没有完成Windows8,也不想去那里。我在服务器和各种软件方面都有UNIX经验,但它并不是我的首选环境。但是,我想我正在转换。我试图假装使用Cygwin和MSYS在Windows下运行UNIX。我的目的是搭建一个开发环境。两者都让我失望了。我花了比开发更多的时间来解决一系列技术问题。这是NotAcceptable。到目前为止,我的Ruby

  6. ruby-on-rails - 如果特定语言环境中缺少翻译,如何配置 i18n 以使用 en 语言环境? - 2

    如果特定语言环境中缺少翻译,如何配置i18n以使用en语言环境翻译?当前已插入翻译缺失消息。我正在使用RoR3.1。 最佳答案 找到相似的question这里是答案:#application.rb#railswillfallbacktoconfig.i18n.default_localetranslationconfig.i18n.fallbacks=true#railswillfallbacktoen,nomatterwhatissetasconfig.i18n.default_localeconfig.i18n.fallback

  7. ruby-on-rails - 可移植 Ruby on Rails 环境 - 2

    我给自己买了一个新的8gigUSBkey,我正在寻找一个合适的解决方案来拥有一个可移植RoR环境来学习。我在谷歌上搜索了一下,发现了一些可能性,但我很想听听一些现实生活中的经历和意见。谢谢! 最佳答案 我喜欢InstantRails,非常容易使用,无需安装程序,也不会修改您的系统环境。 关于ruby-on-rails-可移植RubyonRails环境,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/q

  8. ruby-on-rails - 如何通过 URL 更改语言环境? - 2

    在我的双语Rails4应用程序中,我有一个像这样的LocalesController:classLocalesController用户可以通过此表单更改其语言环境:deflocale_switcherform_tagurl_for(:controller=>'locales',:action=>'change_locale'),:method=>'get',:id=>'locale_switcher'doselect_tag'set_locale',options_for_select(LANGUAGES,I18n.locale.to_s)end这有效。但是,目前用户无法通过URL更改

  9. ruby - 从 FaSTLane 将环境变量传递给 shell 脚本 - 2

    我在跑Fastlane(适用于iOS的持续构建工具)以执行用于解密文件的自定义shell脚本。这是命令。sh"./decrypt.shENV['ENCRYPTION_P12']"我想不出将环境变量传递给该脚本的方法。显然,如果我将密码硬编码到脚本中,它就可以正常工作。sh"./decrypt.shmypwd"有什么建议吗? 最佳答案 从直接Shell中扩展假设这里的sh是一个faSTLane命令,它以给定的参数作为脚本文本调用shell命令:#asafastlanedirectivesh'./decrypt.sh"$ENCRYPTI

  10. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

随机推荐