0
votes

I have a multi-project build, and want to run tests after starting two Docker containers. This is my custom task:

runTestsWithDocker := Def.taskDyn {
  startDirectoryServer.value
  val containerId = buildOrStartTestDatabase.value
  Def.task {
    (test in Test).value
    sLog.value.info("running inside dynamic task")
    containerId
  }
}.value

As you can see from the output below, the Docker containers are started, and the log message is written from the dynamic task. However, there's no test output (and the build executes far too quickly for the tests to have run).

> runTestsWithDocker
[info] logging into ECR registry 123456789012.dkr.ecr.us-east-1.amazonaws.com
[info] checking repository for image container1:1.2.3-1200
[info] successfully logged-in to ECR registry 123456789012.dkr.ecr.us-east-1.amazonaws.com
[info] DockerSupport: pulling 123456789012.dkr.ecr.us-east-1.amazonaws.com/container2:latest
[info] DockerSupport: docker run -d -p 389:389 123456789012.dkr.ecr.us-east-1.amazonaws.com/container2:latest
[info] container ID: 80d16a268c6e13dd810f8c271ca8778fc8eaa6835f2d0640fa62d032ff052345
[info] image already exists; no need to build
[info] DockerSupport: pulling 123456789012.dkr.ecr.us-east-1.amazonaws.com/container1:1.2.3-1200
[info] DockerSupport: docker run -d -p 5432:5432 123456789012.dkr.ecr.us-east-1.amazonaws.com/container1:1.2.3-1200
[info] container ID: 2de559b0737e69d61b1234567890123bd123456789012d382ba8ffa40e0480cf
[info] Updating {file:/home/ubuntu/Workspace/mybuild/}mybuild...
[info] Resolving jline#jline;2.12.1 ...
[info] Done updating.
[info] running inside dynamic task
[success] Total time: 2 s, completed Jun 5, 2019 9:05:20 PM

I'm assuming that my scope is incorrect, and that I need to refer to test in some other scope, but I have no idea what that might be (I've tried Compile and ThisBuild as random stabs in the dark).

I've also seen (test in Test).result.value from other questions in SO. Thinking that maybe the test task was doing something non-standard I tried it, but with the same (non) result.

Lastly, I'm running SBT 0.13.16, so any convincing argument (as in a bug report) that it's a problem with that version would make me upgrade sooner than planned (my current goal is to refactor the build then upgrade).


Update: here's the output from inspect. It doesn't show the dependency on test, but I'm assuming that's because it's invoked from a dynamic task.

> inspect runTestsWithDocker
[info] Task: java.lang.String
[info] Description:
[info]  Runs the test suite, after starting the LDAP server and running/initializing the test database
[info] Provided by:
[info]  {file:/home/ubuntu/Workspace/mybuild/}mybuild/*:runTestsWithDocker
[info] Defined at:
[info]  /home/ubuntu/Workspace/mybuild/build.sbt:597
[info] Dependencies:
[info]  mybuild/*:buildOrStartTestDatabase
[info]  mybuild/*:startDirectoryServer
[info]  mybuild/*:settingsData
[info] Reverse dependencies:
[info]  mybuild/*:publishTestDatabase
[info] Delegates:
[info]  mybuild/*:runTestsWithDocker
[info]  {.}/*:runTestsWithDocker
[info]  */*:runTestsWithDocker

Update: if I specify a single sub-project, it correctly runs the tasks in that sub-project.

runTestsWithDocker := Def.taskDyn {
  startDirectoryServer.value
  val containerId = buildOrStartTestDatabase.value
  Def.task {
    (test in (subproject,Test)).result.value
    containerId
  }
}.value

So it looks like maybe the root project isn't aggregating? We're relying on the "default root" project, so I think my next change will be to create an explicit root project.

1

1 Answers

0
votes

It turned out that the default root project was not in fact "aggregat[ing] all other projects in the build." Once I created this project and explicitly aggregated the other sub-projects under it, I was able to specify my task like so:

runTestsWithDocker := Def.taskDyn {
  startDirectoryServer.value
  val containerId = buildOrStartTestDatabase.value
  Def.task {
    (test in (root,Test)).result.value
    containerId
  }
}.value

:shrug: