我怎样让Sonarcloud在Travis,Maven和github的分叉请求下运行

在调查我最近的问题时, Sonarcloud与Travis,Maven和github失败了,我意识到我问的是错误的问题。 我试图解决一个症状而不是潜在的问题。

我工作的项目( eclipse /扫描 )使用Github作为存储库,使用Travis和Sonarcloud进行持续集成和代码分析。

虽然Sonarcloud分析在内部拉取请求(从分支直接推送到eclipse /扫描的拉取请求)上运行良好,但当Travis运行外部拉取请求(来自分叉回购)时,它不起作用。

根本问题在于,我们目前运行sonarcloud的方式依赖于环境变量,这些变量由于安全原因而未填充外部拉取请求:

Encrypted environment variables have been removed for security reasons. See https://docs.travis-ci.com/user/pull-requests/#Pull-Requests-and-Security-Restrictions 

我们的存储库设置不关心Sonarcloud是否运行,但这意味着我们经常合并破坏sonarcloud规则的更改,因为我们没有意识到它们已被破坏。 我们只看到那些规则在下次被直接推送到存储库的人更改被破坏了。 这将修复Sonarcloud发现的问题从协作者转移到提交者的负担。

所以,

  • 有没有办法在不引入安全问题的情况下启用Sonarcloud分析来自分叉存储库的拉取请求?

请注意,这个问题似乎是在Travis公共存储库之外的一步, 如何添加一个对Pull请求起作用的Secure变量,它还没有答案。

正如你已经完全猜到的那样,除非你硬编码你的GitHub和SonarCloud令牌(显然你不想要,不公开推出它们),否则目前无法分析外部拉取请求。 这在SonarCloud Travis官方附加页面上有记录 。

我们目前正积极致力于正确支持这个用例 – 我希望我们能在年底前提出一些建议。

这可能不是您正在寻找的简单解决方案,但我不认为在构建拉取请求时更容易访问机密,除非Travis以某种forms添加对它的支持。 毕竟,由于拉取请求可以包含在构建期间执行的任意代码,因此秘密变量不可用。 攻击者可能会使用此命令创建一个pull请求,该请求会更改构建过程以读取解密的环境变量并将其发送给他。

基本问题是运行构建的代码和构建的代码来自相同(有时不受信任)的源。 为了能够在构建过程中使用秘密,构建的代码和构建的代码需要分开,构建代码需要来自可信任的源。 除非沙箱被沙箱化,否则不得执行来自不受信任来源的代码,以便它无法访问任何秘密。

据我所知,特拉维斯没有提供实现这一目标的标准方法。

通过遵循分离构建代码和构建代码的想法,应该可以对外部拉取请求执行Sonarqube分析。

第一步是在Github上创建一个新的存储库“构建代码”,它只包含可信的构建脚本。 这些脚本负责检出拉取请求并执行Sonarqube分析。 由于这些不是外部拉取请求的一部分,因此可以访问秘密变量。 但是要小心,不要在pull请求中运行unit testing,因为这些是不可信的。

第二步是在对实际源代码存储库发出拉取请求时触发“构建代码”存储库的构建。 Travis提供了一个触发构建的API 。 但是,这也需要一个秘密。 因此,在构建拉取请求时,我们不能简单地触发“构建代码”存储库的构建。 但是,我们可以做的是在Github上的源代码存储库中安装webhook ,在发出pull请求时调用一个小型Web服务。 然后,此服务调用Travis API以触发可信构建代码存储库的构建。

我希望这是有道理的。 如果不清楚,请告诉我。

我自己还没有这样做。 所以我不能提供任何代码。 但我认为设置一个小型Web服务并将其从Github请求转变为Travis的构建请求应该不会太困难。