有没有办法让 Phabricator 将差异推送到存储库?

Is there any way to get Phabricator to push diffs to a repository?

我们的团队最近开始尝试使用 Phabricator 进行代码审查。

除了 Phabricator 之外,我们还有一个测试系统,可以自动构建和测试推送到我们主要 git 存储库中特定分支的任何代码。有没有办法让 arc diff 自动将差异推送到那个特定的分支?测试通常需要几个小时,我希望人们可以在测试代码时查看代码。能否以某种方式将其集成为单元测试,而不必在发送差异以供审核之前完成?

arc diff 的目的是允许 tests/Code 执行审核 而无需 将代码登陆分支。我们通过 Herald 规则、Harbormaster 构建计划和 Jenkins 在这里做到这一点。

当 diff 为 created/updated 时,监视 Repo 的先驱规则触发 Harbormaster 构建计划,该计划通过 HTTP post 请求触发 Jenkins。我会尝试详细说明基础知识,但如果您选择走这条路,我建议您在构建此过程时查看一些其他材料。

请注意 - Harbormaster 被列为 "Prototype"。意思是,对它的支持有限。但是,除了编写您自己的自定义代码之外,没有其他方法可以执行我在此建议的操作。

我希望这里有足够的内容帮助您入门。根据您的特定需求进行制作需要您提供更多细节。这就是我们所做的,对我们来说效果很好。我希望它对你有用。

设置测试作业

必须对测试作业进行参数化,以便您可以将差异和构建 ID 作为参数传入。
在你的测试中,你会做这样的事情来从差异中提取代码:

#!/bin/bash
# Clean the branch
git fetch --all
git checkout master
git reset --hard origin/master
git pull

# Delete the arcpatch branch (ignoring error if the branch doesn't exist)
git branch -D arcpatch-D$DIFF || true

# Apply the patch
arc patch D$DIFF

# Update dependencies
git submodule update
composer install

然后触发您的常规测试。测试后,您将需要一些类似这样的代码来查看使用构建结果更新 Phabricator:

#!/bin/bash
# Let Phabricator know if the build succeeded
if [ -n "$PHID" ]; then
   export PATH=$PATH:~/bin/arcanist/bin
   if [ {{{Code to determine Failure}}} ]; then
      jsonResult="{\"buildTargetPHID\":\"$PHID\",\"type\":\"fail\"}";
   else
      jsonResult="{\"buildTargetPHID\":\"$PHID\",\"type\":\"pass\"}";
   fi
   echo $jsonResult | arc call-conduit harbormaster.sendmessage;
fi

查看代码

与此同时,开发人员可以参考该差异 (http://{Phabricator.url}/D####)、审查代码,甚至可以 运行 按照类似流程进行任何测试正如上面的测试工作所做的那样。

先驱规则

先驱规则将在差异修订时触发。它将寻找任何指示您想要测试的更改(通常是特定回购中的任何内容)并将 运行 构建计划(请参阅其他参考资料,了解如何创建链接到 Jenkins 的构建计划,如果是你使用的)。

其他参考资料:

http://www.guywarner.com/2014/05/integrating-jenkins-and-phabricator.html http://www.guywarner.com/2014/06/part-2-integrating-phabricator-and.html

另一种选择是配置 Diffusion 以观察您的 git 存储库并创建一个 "staging" 区域。这将导致 arc diff 自动推送到带有 phabricator/diff/123.

等标签的已配置暂存远程

有关详细信息,请参阅 https://secure.phabricator.com/book/phabricator/article/harbormaster/#change-handoff