sbt:在其他任务之后调用测试

时间:2019-06-05 21:11:16

标签: sbt

我有一个多项目构建,并且想要在启动两个Docker容器后运行测试。这是我的自定义任务:

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

从下面的输出中可以看到,启动了Docker容器,并从动态任务中写入了日志消息。但是,没有测试输出(并且构建执行得太快,无法运行测试)。

> 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

我假设我的范围是错误的,并且我需要在其他范围中引用test,但是我不知道那是什么(我尝试过CompileThisBuild作为黑暗中的随机刺伤。

我还从SO中的其他问题中看到了(test in Test).result.value。认为test任务正在做我尝试过的非标准操作,但结果相同(非)。

最后,我正在运行SBT 0.13.16,因此任何令人信服的论点(如错误报告中的问题)都表明该版本存在问题会使我升级得比计划的要早(我目前的目标是重构构建然后升级)。


更新:这是inspect的输出。它没有显示对test的依赖性,但是我认为这是因为它是从动态任务中调用的。

> 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

更新:如果我指定一个子项目,它将正确运行该子项目中的任务。

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

所以看来根项目没有聚集?我们依靠“默认根”项目,因此我认为下一个更改将是创建一个显式的根项目。

1 个答案:

答案 0 :(得分:0)

事实证明,default root project实际上不是“聚集构建中的所有其他项目”。创建该项目并明确汇总其下的其他子项目后,便可以这样指定我的任务:

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

:耸耸肩: