需要一个工作策略来执行Jenkins管道脚本中的SQL脚本

需要一个工作策略来执行Jenkins管道脚本中的SQL脚本,jenkins,jdbc,groovy,mariadb,jenkins-pipeline,Jenkins,Jdbc,Groovy,Mariadb,Jenkins Pipeline,作为Jenkins管道脚本的一部分,我需要执行一些SQL脚本来初始化数据库(mariadb)。这项工作由我自己的詹金斯奴隶负责。我维护Jenkins主实例,但不维护它运行的主机 我的第一次尝试只是在脚本中使用内联代码来调用“Sql.newInstance(…)”和“Sql.execute(…)”。这会失败,因为mariadbjar不在类路径中 然后,我尝试为从机设置CLASSPATH env var,向其中添加mariadb客户机jar,然后断开并重新连接从机。这似乎没有效果 然后我尝试了@Gr

作为Jenkins管道脚本的一部分,我需要执行一些SQL脚本来初始化数据库(mariadb)。这项工作由我自己的詹金斯奴隶负责。我维护Jenkins主实例,但不维护它运行的主机

我的第一次尝试只是在脚本中使用内联代码来调用“Sql.newInstance(…)”和“Sql.execute(…)”。这会失败,因为mariadbjar不在类路径中

然后,我尝试为从机设置CLASSPATH env var,向其中添加mariadb客户机jar,然后断开并重新连接从机。这似乎没有效果

然后我尝试了@GrapeConfig/@Grab方法。我使用@GrapeConfig设置“systemClassLoader=true”。此操作失败,原因是“找不到合适的类加载器”。因此,我随后尝试删除@GrapeConfig,但由于“RuntimeException:无法创建类javax.xml.parsers.SAXParserFactory的提供程序”而失败

接下来,我想我将尝试从一个“sh”命令直接运行“mysql”,并在我的sql脚本的内容中使用管道。这似乎有道理,但我不确定这是否可行


我曾看到notes讨论过各种尝试,但我从未听说过有人成功地做到这一点。

虽然以“java方式”实现这一点似乎是合乎逻辑的,但我发现只需运行“
sh”(“mysql…
”更简单。它避免了所有粗糙的类路径问题。它确实要求将数据库客户端安装在从属设备上,并且不允许数据库独立性(其实并不那么重要)。实际上,我实际上是在一个容器中运行mariadb,因此生成的命令行更像“
docker exec-I container mysql…
”(注意“-I”,而不是通常的“-it”,因为如果在一个文件中进行管道传输,这将不起作用)

更新

从macg33zr开始,我发现将任务添加到现有的Gradle构建脚本中以操作数据库非常容易。我还没有用它完全实现我需要的功能,我只是验证了它可以用一个简单的“select”语句工作

我已经在一个单独的Gradle配置中使用了JDBC驱动程序JAR,因为我需要将这些工件存储在容器的lib目录中


以下是对所需部分的良好总结:。关键的微妙之处在于将JDBC驱动程序jar添加到类加载器中。

您可以将mariadb jar放入Jenkins JDK/jre/lib/ext中,并尝试使用Sql.newInstance(…)将Groovy代码放入Gradle项目中运行Sql脚本,然后使用Jenkins在管道中使用Gradle构建步骤运行所需的Gradle任务。这是我以前为在项目CI构建上运行测试而设置DB所做的事情。有趣的想法,尤其是在我运行这些sql脚本之前,我已经用Gradle构建脚本构建了我的代码。当然,您应该添加这个作为答案,并进行详细说明。我在我的Gradle构建中添加了类似的内容,答案如下:。另一种方法是使用Liquibase变更集实现DB更新-请参阅。Liquibase是一个Java工具,我为它编写了一个包装器类,我从Gradle使用它。这是在对DB模式/数据进行细粒度更改控制时运行.SQL脚本的下一个级别。瞧,现在有一个Gradle插件: