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

Mar*_*oth 22 java github maven travis-ci sonarqube

在调查我最近的问题时,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
Run Code Online (Sandbox Code Playgroud)

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

所以,

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

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

Chr*_*hme 5

这可能不是你正在寻找最简单的办法,但我不认为这是一个非常容易构建引入请求时,除非特拉维斯以某种形式增加了对IT支持访问秘密的方式.毕竟,由于拉取请求可以包含在构建期间执行的任意代码,因此秘密变量不可用.攻击者可能会使用此命令创建一个pull请求,该请求会更改构建过程以读取解密的环境变量并将其发送给他.

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

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

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

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

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

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

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

  • 在我看来,SonarCloud需要它自己的GitHub集成,而不是依赖于通过另一个可信服务(即Travis)运行.令人愚蠢的是,让sonarcloud在外部拉取请求上运行要困难得多,因为对于这些提交进行分析可能更为重要(具有提交访问权限的开发人员比外部协作者更可能遵守项目标准) .如果您发现任何已经执行此操作的项目,我将有兴趣知道. (4认同)

Fab*_*eam 5

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

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