Bamboo 服务器中的 Gradle 构建缓慢

Posted

技术标签:

【中文标题】Bamboo 服务器中的 Gradle 构建缓慢【英文标题】:Gradle build slow in Bamboo server 【发布时间】:2015-08-21 10:10:39 【问题描述】:

使用 gradle 脚本构建的项目。有一些测试需要启动应用程序上下文。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = ExceptionTestApplication.class)
@ActiveProfiles("headerCheck")
@WebIntegrationTest( "server.port=0", "management.port=0" )
public class ExceptionTest 

这个项目在本地可以在1分钟内完成,但在服务器上需要几十分钟。打印了构建的调试信息后,发现这一步很吃时间。

使用 [SHA1PRNG] 为会话 ID 生成创建 SecureRandom 实例花费了 [447,031] 毫秒。

09:25:01.630 [DEBUG] [TestEventLogger]     2015-06-06 09:25:01.628  INFO 27681 --- [ost-startStop-1] o.a.c.util.SessionIdGeneratorBase        : Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [447,031] milliseconds.

奇怪的是,这一步在本地构建时从来没有出现过,所以我真的很困惑。

在服务器上构建时如何以及为何调用 SecureRandom? 如何配置服务器,才能达到和本地一样的构建速度?

【问题讨论】:

【参考方案1】:

在服务器上构建时如何以及为何调用 SecureRandom?

这很难猜测,并且取决于您构建的细节,但请参阅下面的一些提示。

如何配置服务器,才能达到和本地一样的构建速度?

缓慢的原因是服务器上缺少entropy,这是加密功能的重要要求:

熵会影响服务器的cryptography (TLS/SSL):如果它太低,则代码的重新生成可能需要很长时间才能完成。

一般的服务器,尤其是云服务器,都会受到缺乏用户输入和其他常见随机熵源的影响,因此需要相应地进行补偿。

背景

这里有一些链接,其中包含更多信息以及如何处理它的各种方法(但请参阅下面的可能的即时解决方案):

Low Entropy on EC2 instances - Problem for anything related to security How can you securely generate keys on AWS? Helping The Random Number Generator To Gain Enough Entropy With rng-tools (Debian Lenny) Entropy, or Lack Thereof, in OpenStack Instances (and how to improve that)

解决方案

您只需要确保您的服务器有足够的可用熵。如何实现这一点当然取决于您的运行时环境,尤其是操作系统。就我个人而言,我正在为我们的Amazon Linux AMI (CentOS based) Bamboo 代理使用类似以下内容:

# Seed entropy
sudo yum install rng-utils -y
sudo rngd -r /dev/urandom -o /dev/random

像这样播种后的熵应该比以前高很多 - 测试如下:

cat /proc/sys/kernel/random/entropy_avail

亚马逊网络服务 (AWS) 随机生成器

如果您碰巧使用 AWS,您还可以使用 AWS Key Management Service (KMS) 提供的专用 GenerateRandom API 操作,声称(在其他地方,现在没有参考)提供适用的高质量随机数用于加密目的。

“高质量”声明在概念上受到了挑战,因为他们的算法没有记录在案,从透明的安全角度来看,这确实不是正确的方法 - 尽管有这些有效的批评,但我个人相信 AWS 能够做到这一点不过,这主要是因为对security 采取了广泛的主动且通常有据可查的方法。

【讨论】:

以上是关于Bamboo 服务器中的 Gradle 构建缓慢的主要内容,如果未能解决你的问题,请参考以下文章

如何在构建服务器和工作站之间同步 Gradle/Android 版本代码

Bamboo 远程代理池

Bamboo + Android + Gradle:如何生成签名的apk?

Docker 中缓慢的 gradle 构建。缓存 gradle 构建

如何在 build.gradle 中获取 Bamboo 内部版本号

如何在两个 Bamboo 构建之间获取 git 提交注释