Я пытаюсь заставить Docker настроить полную тестовую среду, в которой я могу запускать интеграционные тесты, но пока это не работает, и у меня даже возникают проблемы с получением журналов.
Итак, я хочу запустить его как конвейер и использовать jenkinsfile. Это то, что я получил до сих пор:
pipeline {
agent any
stages {
stage('build war') {
agent {
docker {
image 'gradle:latest'
reuseNode true
}
}
steps {
sh 'gradle war -b oven/build.gradle'
}
}
stage('test') {
steps {
script {
docker.image('mysql:latest').withRun('-e "MYSQL_ROOT_PASSWORD=password" -e "MYSQL_USER=root" -e "MYSQL_DATABASE=highlygroceries"') { c ->
docker.image('munhunger/highly-oven').withRun('-e "test=test"') { h ->
docker.image('mysql:latest').inside("--link ${c.id}:db") {
sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
}
docker.image('munhunger/highly-oven').inside("--link ${c.id}:db -e 'DB_URL=db:3306' -e 'DB_PASS=password' -e 'DB_USER=root'") {
sh 'sleep 5'
}
docker.image('gradle:latest').inside("--link ${h.id}:backend -e 'OVEN_URL=http://backend:8080'") {
sh 'gradle test -b oven/build.gradle'
}
sh "docker logs ${h.id}"
}
}
}
}
}
stage('build dockerimage') {
steps {
script {
dir('oven') {
def image = docker.build("munhunger/highly-oven")
docker.withRegistry('https://registry.hub.docker.com', 'docker-hub-credentials') {
image.push("${env.BUILD_NUMBER}")
image.push("latest")
}
}
}
}
}
}
}
Но, похоже, проблема с соединением между моим бэкэндом и базой данных...
Все, что я получаю из журналов сборки, это:
se.munhunger.oven.rest.UserTest > System is up and running, Creating a user, it returns 204 upon creation FAILED
java.lang.AssertionError at UserTest.java:38
что указывает на:
Assert.assertEquals("non 204 from backend", 204,
client.target(baseURL + "/api/user")
.request()
.header("email", "[email protected]")
.post(Entity.json(null))
.getStatus());
Я считаю, что связь между тестером и серверной частью работает, потому что следующий тест прошел успешно
Assert.assertEquals(200,
client.target(baseURL + "/swagger")
.request()
.get()
.getStatus());
Это приводит меня к тому, что я думаю, главный вопрос о том, как мне получить журналы из моего внутреннего образа докера? Я чувствую, что без этого практически невозможно отладить, что происходит не так.
Изменить Я получил несколько журналов, но не в то время. Если я изменю на следующее:
docker.image('mysql:latest').withRun('-e "MYSQL_ROOT_PASSWORD=password" -e "MYSQL_USER=root" -e "MYSQL_DATABASE=highlygroceries"') { c ->
docker.image('munhunger/highly-oven').withRun('-e "test=test"') { h ->
docker.image('mysql:latest').inside("--link ${c.id}:db") {
sh 'while ! mysqladmin ping -hdb --silent; do sleep 1; done'
}
docker.image('munhunger/highly-oven').inside("--link ${c.id}:db -e 'DB_URL=db:3306' -e 'DB_PASS=password' -e 'DB_USER=root'") {
sh 'sleep 5'
}
sh "docker logs ${h.id}"
docker.image('gradle:latest').inside("--link ${h.id}:backend -e 'OVEN_URL=http://backend:8080'") {
sh 'gradle test -b oven/build.gradle'
}
sh "docker logs ${h.id}"
}
}
Я получаю все журналы с запуска. но он не распечатывает журналы после сбоя теста