我如何让Sonarcloud运行来自Travis,Maven和github的分叉的拉取请求

2022-09-01 23:50:40

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

我从事的一个项目(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发现的问题的负担从协作者转移到提交者。

VoI

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

请注意,这个问题似乎比Travis公共存储库如何添加一个安全变量更进一步,该变量也适用于尚未找到答案的拉取请求。


答案 1

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

根本问题是运行生成的代码和生成的代码来自同一(有时不受信任的)源。为了能够在生成过程中使用机密,需要将生成的代码和生成的代码分开,并且生成代码需要来自受信任的源。除非对来自不受信任的源执行任何代码,否则不得执行该代码,使其无法访问任何机密。

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

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

第一步是在Github上创建一个新的存储库“构建代码”,该代码仅包含受信任的构建脚本。这些脚本负责签出拉取请求并执行 Sonarqube 分析。由于这些不是外部拉取请求的一部分,因此它们可以访问机密变量。但请注意,不要在拉取请求中运行单元测试,因为这些测试是不受信任的。

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

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

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


答案 2

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

我们目前正在积极研究一种方法来正确支持这个用例 - 我希望我们能在今年年底之前想出一些东西。


推荐