Чтение базы данных H2 (jenkins-jobs.mv.db) для подключаемого модуля Maven - PullRequest
0 голосов
/ 02 июля 2018

Я использую Pipeline Maven Plugin 3.5.5 с Jenkins 2.89.2.

Из-за большого количества зависимостей между проектами Maven мы в основном полагаемся на snapshotDependencies(), чтобы гарантировать, что задания Jenkins запускаются в правильном порядке. Я хочу повторно использовать данные, хранящиеся в базе данных $JENKINS_HOME/jenkins-jobs/jenkins-jobs.mv.db H2, для построения графика зависимости между заданиями, а не только полагаться на характеристики, доступные в графическом интерфейсе Jenkins.

Если я скопирую файл H2 db из JENKINS_HOME и попытаюсь подключиться, я получу это:

@Grapes([
    @Grab(group = 'com.h2database', module = 'h2', version = '1.4.196'),
    @GrabConfig(systemClassLoader=true)
])

import groovy.sql.Sql

def url = "jdbc:h2:file:/jenkins/jenkins-jobs/jenkins-jobs;AUTO_SERVER=TRUE;MULTI_THREADED=1"

def user = "sa"
def password = "sa"
def driver = "org.h2.Driver"
def sql = Sql.newInstance(url, user, password, driver)

println(sql.executeQuery("SHOW TABLES"))
println(sql.executeQuery("SELECT * FROM INFORMATION_SCHEMA.TABLES"))

Результат:

rs0: null

Если вместо этого я попытаюсь использовать просто jdbc:h2:file:/jenkins/jenkins-jobs/jenkins-jobs.mv.db (с расширением mv.db) в качестве URL, результат будет:

Caught: org.h2.jdbc.JdbcSQLException: Wrong user name or password [28000-196]
org.h2.jdbc.JdbcSQLException: Wrong user name or password [28000-196]

но мне неясно, откуда этот пароль. Попытка выше без имени пользователя и пароля дает следующее:

def user = ""
def password = ""

снова заканчивается пустым набором результатов rs0: null

Мне не понятно, как происходит доступ и чтение этой базы данных - и если для нее требуется пароль, то откуда он взялся?

Есть подсказки?

1 Ответ

0 голосов
/ 31 декабря 2018

В ретроспективе похоже, что проблема не была связана конкретно с базой данных Jenkins.

Вместо этого, это было из-за неправильного использования Groovy Sql. Этот вопрос помог получить ответ org.h2.jdbc.JdbcSQLException: объект уже закрыт .

Использование createQueryCommand вместо executeQuery сработало:

query = sql.createQueryCommand("SHOW TABLES")
rs = query.execute()

while(rs.next()) {
    result = rs.getString(1)
    println(result)
}

Или самым простым способом:

println(sql.rows("SHOW TABLES"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...