2017-03-15 52 views
1

Jenkinsパイプラインスクリプトの一部として、データベース(mariadb)を初期化するためにSQLスクリプトを実行する必要があります。この仕事は、私が所有するジェンキンスの奴隷の上で動く。私はJenkinsのマスターインスタンスを維持しますが、実行されるホストは維持しません。JenkinsパイプラインスクリプトでSQLスクリプトを実行するための戦略が必要

私の最初の試みは、単に "Sql.newInstance(...)"と "sql.execute(...)"を呼び出すためのインラインコードを持つことでした。これは、mariadb jarがクラスパスにないために失敗します。

次に、スレーブのCLASSPATH env varを設定してmariadbクライアントjarを追加してから、スレーブを切断して再接続しました。これは効果がないように思われた。

その後、@ GrapeConfig/@ Grabアプローチを試しました。 @GrapeConfigを使って "systemClassLoader = true"を設定しました。これは、 "適切なクラスローダーを見つけることができません"と失敗します。だから、私は@GrapeConfigを削除しようとしましたが、これは "RuntimeException:クラスjavax.xml.parsers.SAXParserFactoryのプロバイダを作成できません"で失敗します。

次に、「sh」コマンドから「mysql」を直接実行して、SQLスクリプトの内容をパイプしてみようと思います。これは妥当と思われますが、これがうまくいくかどうかはわかりません。

私はこれを行う様々な試みについて話してきましたが、これを成功裏に実行した人は誰も聞いたことがありません。

+0

Sql.newInstance(...)を使用してJenkins JDK/jre/lib/extとtryにmariadb jarを配置できますか? –

+0

Groovyコードを使用してGradleプロジェクトでSQLスクリプトを実行し、Jenkinsを使用してパイプラインのグラデルビルドステップを使用して、必要なa Gradleタスクを実行します。これは、プロジェクトCIビルドでテストを実行するためにDBをセットアップする前に行ったことです。その後、Jenkins外でオフラインで作業することができます。 – macg33zr

+0

興味深いアイデアは、特にこれらのSQLスクリプトを実行する直前に、私はGradleビルドスクリプトで自分のコードを構築しました。もちろん、これを答えとして追加する必要があります。 –

答えて

1

"javaの方法"でこれを実装するのは理にかなっているようですが、私は単純に 'sh("mysql ... < file.sql")'を実行する方が簡単だと分かりました。これは、ぎこちないクラスパスの問題をすべて回避します。それは、データベースクライアントがスレーブボックスにインストールされていることを必要とし、データベースの独立性を保証しません(本当に重要ではありません)。実際には、実際にはmariadbをコンテナ内で実行していたので、結果として得られるコマンドラインは、 "docker exec -i container mysql ... < file.sql"のようになりました(通常の "-it"ではなく "-i"に注意してください)。ファイル)。

更新

macg33zrから肘から、私はデータベースを操作するためのスクリプトを作成私の既存のGradleにタスクを追加するためにはかなり簡単だった見つけました。私が必要とするものを完全に実装していないので、単純な「選択」ステートメントで動作することが確認されました。

これらの成果物をコンテナのlibディレクトリに格納する必要があったため、別のグラードコンフィグレーションにすでにJDBCドライバジャーがありました。

以下は、必要な部分の概要です:https://discuss.gradle.org/t/jdbc-driver-class-cannot-be-loaded-with-gradle-2-0-but-worked-with-1-12/2277。重要な微妙なことは、JDBCドライバ・ジャーをクラスローダーに追加することです。

+0

私はここの答えから私のGradleビルドに似たものを追加しました:http://stackoverflow.com/questions/6329872/how-to-add-external-jar-files-to-gradle-build-script別のアプローチは、Liquibaseチェンジセットを使用してDBアップデートを実装することです - http://www.liquibase.org/を参照してください。 LiquibaseはJavaのツールで、私はGradleから使用したラッパークラスを作成しました。 DBスキーマ/データのきめ細かな変更制御を実行しているときに、SQLスクリプトを実行するだけです。Lo-beholdには、これに対応するGradleプラグインがあります:https://github.com/liquibase/liquibase-gradle-plugin – macg33zr

関連する問題