需要一个工作策略来在 Jenkins 管道脚本中执行 SQL 个脚本
Need a working strategy to execute SQL scripts in Jenkins pipeline script
作为 Jenkins 管道脚本的一部分,我需要执行一些 SQL 脚本来初始化数据库 (mariadb)。这项工作 运行 在我拥有的 Jenkins slave 上进行。我维护 Jenkins 主实例,但不维护它 运行 上的主机。
我的第一次尝试只是在脚本中使用内联代码来调用 "Sql.newInstance(...)" 和 "sql.execute(...)"。这失败了,因为 mariadb jar 不在类路径中。
然后我尝试为从服务器设置 CLASSPATH env var,将 mariadb 客户端 jar 添加到它,然后断开并重新连接从服务器。这似乎没有效果。
然后我尝试了@GrapeConfig/@Grab 方法。我使用@GrapeConfig 来设置"systemClassLoader=true"。这失败了 "Unable to find suitable classloader"。所以,然后我尝试删除@GrapeConfig,但失败了"RuntimeException: Provider for class javax.xml.parsers.SAXParserFactory cannot be created"。
接下来,我想我将尝试从 "sh" 命令直接 运行 "mysql" 并通过管道输入 sql 脚本的内容。这似乎是合理的,但我不确定这是否可行。
我看到过一些笔记,讨论了为此进行的各种尝试,但我从未听说过有人成功地做到了这一点。
虽然在 "java way" 中实现它似乎合乎逻辑,但我发现简单地 运行 'sh("mysql ... < file.sql")
' 更直接。它避免了所有棘手的类路径问题。它确实需要在从机上安装数据库客户端,并且它不允许数据库独立(不是那么重要)。实际上,我实际上做的是容器中的 运行 mariadb,所以生成的命令行更像是“docker exec -i container mysql ... < file.sql
”(注意“-i”,而不是通常的“-it”,因为如果管道在文件中,那将不起作用。
更新:
从 macg33zr 的角度来看,我发现将任务添加到我现有的 Gradle 构建脚本来操作数据库非常容易。我还没有完全实现我需要的东西,我只是验证了它可以用一个简单的 "select" 语句工作。
我已经在单独的 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 添加到类加载器。
作为 Jenkins 管道脚本的一部分,我需要执行一些 SQL 脚本来初始化数据库 (mariadb)。这项工作 运行 在我拥有的 Jenkins slave 上进行。我维护 Jenkins 主实例,但不维护它 运行 上的主机。
我的第一次尝试只是在脚本中使用内联代码来调用 "Sql.newInstance(...)" 和 "sql.execute(...)"。这失败了,因为 mariadb jar 不在类路径中。
然后我尝试为从服务器设置 CLASSPATH env var,将 mariadb 客户端 jar 添加到它,然后断开并重新连接从服务器。这似乎没有效果。
然后我尝试了@GrapeConfig/@Grab 方法。我使用@GrapeConfig 来设置"systemClassLoader=true"。这失败了 "Unable to find suitable classloader"。所以,然后我尝试删除@GrapeConfig,但失败了"RuntimeException: Provider for class javax.xml.parsers.SAXParserFactory cannot be created"。
接下来,我想我将尝试从 "sh" 命令直接 运行 "mysql" 并通过管道输入 sql 脚本的内容。这似乎是合理的,但我不确定这是否可行。
我看到过一些笔记,讨论了为此进行的各种尝试,但我从未听说过有人成功地做到了这一点。
虽然在 "java way" 中实现它似乎合乎逻辑,但我发现简单地 运行 'sh("mysql ... < file.sql")
' 更直接。它避免了所有棘手的类路径问题。它确实需要在从机上安装数据库客户端,并且它不允许数据库独立(不是那么重要)。实际上,我实际上做的是容器中的 运行 mariadb,所以生成的命令行更像是“docker exec -i container mysql ... < file.sql
”(注意“-i”,而不是通常的“-it”,因为如果管道在文件中,那将不起作用。
更新:
从 macg33zr 的角度来看,我发现将任务添加到我现有的 Gradle 构建脚本来操作数据库非常容易。我还没有完全实现我需要的东西,我只是验证了它可以用一个简单的 "select" 语句工作。
我已经在单独的 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 添加到类加载器。