CI服务器上的SBT测试运行速度非常慢

时间:2017-07-26 02:33:14

标签: docker sbt

我在Bitbucket上设置了CI管道并运行

sbt "project api" "testOnly core.entities.UserSpec"

它在我的笔记本电脑上运行顺畅,耗时约2秒。但是当我尝试在CI服务器上运行它时,花了大约4分钟来运行一半的测试。

UserSpec是用Spec2编写的,它没有任何数据库或繁重的计算。以下是大多数测试的样子:

def addCredential_nonConfirmedEmail_notAllowed = {
    val emailAddress: EmailAddress = Fixture.emailAddress("unconfirmed")
    val user: User = Fixture.user().copy(emailAddresses = Set(emailAddress))
    val result = user.addCredential(emailAddress, Fixture.password())

    val exception = result.failed.get.asInstanceOf[DomainException]
    exception.code mustEqual DomainExceptionType.Validation
    exception.message mustEqual "Email address must be confirmed before it can be used as part of credential"
}

CI使用" bigtruedata / sbt:0.13.15-2.11.11"在docker上运行图片。 为了解决这个问题,我在墙上撞了两天。首先,我责备CI并尝试:

  • gitlab ci
  • wercker

但仍然没有运气。

你能帮我解决这个问题吗?这就是我的sbt设置的样子

val projectSettings = Seq(
version := "1.0-SNAPSHOT",
scalaVersion := "2.11.11",
resolvers ++= Dependencies.resolvers,
fork in Test := false,
parallelExecution in Test := false)

1 个答案:

答案 0 :(得分:1)

最后,我找到了罪魁祸首!这是我,而不是CI,码头工人或SBT。

我在测试中使用了Fixture.password()方法,该方法使用val salt = BCrypt.gensalt(10, SecureRandom.getInstanceStrong)中的SecureRandom.getInstanceStrong。如果根据this reference没有足够的随机性,它将阻塞线程。删除SecureRandom.getInstanceStrong后,它就像往常一样正常工作。

我应该在使用之前了解Random和SecureRandom之间的差异,并因此浪费了3天。学习它很难:-D