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

时间:2017-03-15 16:21:01

标签: jenkins jdbc groovy mariadb jenkins-pipeline

作为Jenkins管道脚本的一部分,我需要执行一些SQL脚本来初始化数据库(mariadb)。这个工作是在我拥有的Jenkins奴隶上运行的。我维护Jenkins主实例,但不是它运行的主机。

我的第一次尝试就是在脚本中使用内联代码调用" Sql.newInstance(...)"和" sql.execute(...)"。这失败了,因为mariadb jar不在类路径中。

然后我尝试为slave设置CLASSPATH env var,将mariadb客户端jar添加到它,然后断开连接并重新连接slave。这似乎没有效果。

然后我尝试了@ GrapeConfig / @ Grab方法。我使用@GrapeConfig来设置" systemClassLoader = true"。这失败了"无法找到合适的类加载器"。所以,然后我尝试删除了@GrapeConfig,这失败了" RuntimeException:类javax.xml.parsers.SAXParserFactory的Provider无法创建"。

接下来,我想我会尝试直接运行" mysql"来自" sh"命令和管道在我的sql脚本的内容中。这似乎是合理的,但我不确定这是否有效。

我已经看过各种尝试做到这一点的笔记,但我从来没有听说有人成功地做过这件事。

1 个答案:

答案 0 :(得分:1)

虽然以“java方式”实现这一点似乎合乎逻辑,但我发现简单地运行“sh("mysql ... < file.sql")”更为直接。它避免了所有粗糙的类路径问题。它确实要求数据库客户端安装在从属盒上,并且它不允许数据库独立(实际上并不那么重要)。实际上,我实际上做的是在容器中运行mariadb,因此生成的命令行更像是“docker exec -i container mysql ... < file.sql”(注意“-i”,而不是通常的“-it”,因为它不会如果在文件中滚动,则工作。)

<强>更新

从macg33zr的肘部,我发现将任务添加到现有的Gradle构建脚本来操作数据库非常容易。我还没有完全实现我需要的东西,我刚刚验证它可以使用简单的“选择”语句。

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

以下是所需部分的完美摘要:https://discuss.gradle.org/t/jdbc-driver-class-cannot-be-loaded-with-gradle-2-0-but-worked-with-1-12/2277。关键的微妙之处在于将JDBC驱动程序jar添加到类加载器中。