Как я могу запустить сборку Docker как зависимость подпроекта sbt?

У меня есть проект с подпроектами в sbt. Я создаю и модульно тестирую каждый подпроект. Я хочу иметь отдельный подпроект «интеграция», в котором я буду проводить интеграционные тесты. Перед запуском этих тестов я хочу принудительно собрать образ Docker для каждого подпроекта.

Используя только один подпроект в качестве примера, я попробовал это:

lazy val msg = project.in(file("msg"))
    .settings(basicSettings: _*)
    .settings(dockerStuff:_*)
    .settings(libraryDependencies ++=
        dep_compile(microcore, akka_cluster, akka_cluster_tools, opencmis, apns, handlebars) ++
        dep_test(scalatest)
    )

lazy val integration = project.in(file("integration"))
    .settings(basicSettings: _*)
    .settings(libraryDependencies ++=
        dep_test(microcore, scalatest)
    )
    .dependsOn(msg % "publishLocal in Docker")

Это вызывает эту ошибку:

[trace] Stack trace suppressed: run last integration/*:clean for the full output.
[error] (integration/*:clean) java.lang.IllegalArgumentException: Cannot add dependency 'com.cof#msg_2.11;0.1_SNAPSHOT' to configuration 'publishLocal in Docker' of module com.cof#integration_2.11;9c2539_SNAPSHOT because this configuration doesn't exist!
[error] Total time: 0 s, completed Feb 16, 2016 3:35:18 PM

Что мне не хватает? Это правильный способ для моего подпроекта интеграции запустить/принудить сборку Docker к подпроекту msg?


person Greg    schedule 16.02.2016    source источник


Ответы (1)


Это сработало для меня: создайте задачу, определенную в msg, которая создает образы Docker. Затем подключите эту задачу к запуску testOnly (или test или что-то еще) в интеграции. Пришлось немного повозиться, чтобы заставить его работать, но, похоже, это работает.

lazy val buildDocker = taskKey[Unit]("Build Dockers")

lazy val msg = project.in(file("msg"))
    .settings(basicSettings: _*)
    .settings(dockerStuff:_*)
        .settings(
            buildDocker in ThisBuild := (publishLocal in Docker).value // ThisBuild exposes dockz to the entire build
            )
    .settings(libraryDependencies ++=
        dep_compile(microcore, akka_cluster, akka_cluster_tools, opencmis, apns, handlebars) ++
        dep_test(scalatest)
    )

lazy val integration = project.in(file("integration"))
    .settings(basicSettings: _*)
    .settings(libraryDependencies ++=
        dep_test(microcore, scalatest)
    )
    .settings((Keys.testOnly in Test) <<= (Keys.testOnly in Test) dependsOn (buildDocker)) // wire testOnly to buildDocker
person Greg    schedule 17.02.2016