先週のことでした。
久しぶりにJavaの「コンソール・アプリケーション」をメンテナンスすることになりました。
コードを書き終え、まずはローカル開発環境でのgradleビルドを実施。
まったく問題なく成功!!
メンバーによるプル・リクエストも合格し、Jenkinsでのビルドを行ったところ、ビルドに失敗してしまいました。
いったい、なぜ???
開発環境
- Windows10 2004
- JDK8
- IntelliJ IDEA 2019.2
- Gradle 5.6.1
Jenkins環境, 本番環境
- CentOS7.6
- JDK8
- Jenkins ver.2.195
- Gradle 5.6.1
環境は、OSの違いのみ。
JDK、GradleのVersionは、もちろん同一です。
ログ確認
Jenkinsの「コンソール出力」を確認してみると、testでエラーになっていました。
どうやら、RDBへのアクセステストでの接続が全滅しているようでした。ネットワークは正常だし、RDBへのアクセスも問題無いのになぜなのでしょう??
[Pipeline] sh + gradle clean test checkstyleMain findbugsMain javadoc jar Starting a Gradle Daemon (subsequent builds will be faster) > Task :clean UP-TO-DATE > Task :compileJava > Task :processResources > Task :classes > Task :compileTestJava > Task :processTestResources NO-SOURCE > Task :testClasses > Task :test FAILED <<<<<<<< :
Jenkinsのコンソール出力では詳細までわからないので、Jenkins内に書き出されたテスト結果フォルダを根こそぎ取得して、内容を確認することにしました。
「/var/lib/jenkins/workspace/Pipeline_JavaAppName_Build/build/reports/tests/test」フォルダを取得して、index.htmlをブラウザで確認してみると、ログには次のように書かれていました。
Caused by: org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ### The error may exist in sqls/MonthlyBacklog.xml ### The error occurred while processing mapper_resultMap[monthlyPayablesMap] ### Cause: org.apache.ibatis.builder.BuilderException: Error parsing SQL Mapper Configuration. Cause: java.io.IOException: Could not find resource sqls/MonthlyBacklog.xml at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80) at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:72) :
「sqls/MonthlyBacklog.xml」が存在しない!?
そんなはずはありません。実際、Windowsのローカル環境ではgradle Buildもまったく問題無いわけですし・・・
ちなみに、DBアクセスするすべてのテストがエラーになっていました。
原因
IDEAを立ち上げ、じっくり確認してみると、原因がわかりました。
このアプリでは、mybatisを使っているのですが、「mybatis-config.xml」で定義しているmapperファイルの名前と、実際に配備したxmlファイルの名前が異なっているじゃないですか!!
<!-- mybatis-config.xml --> <mappers> <mapper resource="sqls/MonthlyBacklog.xml"/> </mappers>
<!-- 実際のリソース --> sql/MonthlyBackLog.xml
MonthlyBacklog.xml と MonthlyBackLog.xml !!!
たしかにWindowsでは多くの場合大文字小文字を区別しませんが、Linuxでは区別するのでした。
なんとまあ、基本的なチョンボをしてしまったのでしょう・・・。
まとめ
いずれにしましても、本番環境での運用前に、LinuxのJenkinsで動作テストをしていて正解でした。
mybatisは、mybatisのconfigで正常に認識できないと、すべてのDBアクセスができないということもわかりました。
本来ならば、記事にするほどの内容でも無いのですが、自分への戒めとして書くことにしました。
何事も「原理・原則」が大事ということですね。