1. 程式人生 > >使用Phabricator做為Code Review工具

使用Phabricator做為Code Review工具

目錄

  • 0x10 概述
  • 0x20 我的應用環境
  • 0x30 路線圖
  • 0x40 安裝 0x41 LNMP環境的安裝 0x42 Phabricator原始碼下載及執行
  • 0x50 配置 0x51 解決基本的配置問題 0x52 設定使用者登入認證方式 0x53 設定郵件傳送服務引數 0x54 配置程式碼倉庫訪問方式:SSH/HTTP
  • 0x60 使用Phabricator進行Code Review 0x61 Phabricator Code Review工作流 0x62 進行Code Review所用工具 0x63 配置進行Code Review
  • 0x70 與GitHub整合
  • 0x80 與Jenkins整合
  • 0x90 結束語
  • 0xA0 Q/A

0x10 概述

Phabricator是一套基於Web的軟體開發協作工具,包括程式碼審查工具Differential,資源庫瀏覽器Diffusion,變更監測工具Herald,Bug跟蹤工具Maniphest和維基工具Phriction。Phabricator可與Git、Mercurial、Subversion整合使用。 Phabricator是開源軟體,可在Apache許可證第2版下作為自由軟體分發。 Phabricator最初是Facebook的一個內部工具,主要開發者為Evan Priestley。Evan Priestley離開Facebook後,在名為Phacility的新公司繼續Phabricator的開發。

官網中的文件很多很全,但是如果對這個工具不太瞭解,或者對於Code Review不太瞭解的話,讀起來可能會覺得沒有頭緒。這篇文章就自己的安裝及使用過程做一個梳理,對於同樣想用這個工具的讀者,或許起到一些幫助作用。 對於本文中的一些章節,如果在官方文件有所提及,我會把官方文件地址附上,讀者可以閱讀一下官方文件,因為他們的語言和表達更優秀。

0x20 我的應用環境

  • 我:一個做了很多年Android的程式設計師啊 (所以當這篇文章有幸被所涉及領域的專家看到,又發現有的部分有所不妥,或者有更好的想法時,請主動聯絡我改進,多謝~~~ 有任何問題,歡迎評論交流)
  • 主機:Ubuntu 14.04 PC一臺
  • 網路:內網
  • 程式碼庫:GitHub
  • CI:Jenkins

0x30 路線圖

安裝和使用路線大致如此圖,下面開始詳細說明。

0x40 安裝

Phabricator是一個基於Web的工具軟體,使用PHP語言編寫的,為了能讓他執行起來,我們需要搭建一個LNMP(Linux,Nginx,MySQL,PHP)的Web Server環境。搭建完LNMP的環境後,下載Phabricator原始碼,配置後即可使用。

  • 先看我 如果你不想讀那麼多文字,在Ubuntu環境下可以試試下面的指令碼,這個指令碼可以安裝LNMP環境和下載Phabricator原始碼,執行完指令碼併成功後,跳到 0x42 Phabricator原始碼下載及執行 檢視如何讓Phabricator跑起來。
  1. #!/bin/bash

  2. confirm() {

  3. echo "Press RETURN to continue, or ^C to cancel.";

  4. read -e ignored

  5. }

  6. GIT='git'

  7. LTS="Ubuntu 10.04"

  8. ISSUE=`cat /etc/issue`

  9. if [[ $ISSUE != Ubuntu* ]]

  10. then

  11. echo "This script is intended for use on Ubuntu, but this system appears";

  12. echo "to be something else. Your results may vary.";

  13. echo

  14. confirm

  15. elif [[ `expr match "$ISSUE" "$LTS"` -eq ${#LTS} ]]

  16. then

  17. GIT='git-core'

  18. fi

  19. echo "PHABRICATOR UBUNTU INSTALL SCRIPT";

  20. echo "This script will install Phabricator and all of its core dependencies.";

  21. echo "Run it from the directory you want to install into.";

  22. echo

  23. ROOT=`pwd`

  24. echo "Phabricator will be installed to: ${ROOT}.";

  25. confirm

  26. echo "Testing sudo..."

  27. sudo true

  28. if [ $? -ne 0 ]

  29. then

  30. echo "ERROR: You must be able to sudo to run this script.";

  31. exit 1;

  32. fi;

  33. echo "Installing dependencies: git, nginx, mysql, php...";

  34. echo

  35. set +x

  36. sudo apt-get -qq update

  37. sudo apt-get install \

  38. $GIT nginx mysql-server dpkg-dev \

  39. php5 php5-mysql php5-gd php5-dev php5-curl php-apc php5-cli php5-json

  40. # Enable mod_rewrite

  41. sudo a2enmod rewrite

  42. HAVEPCNTL=`php -r "echo extension_loaded('pcntl');"`

  43. if [ $HAVEPCNTL != "1" ]

  44. then

  45. echo "Installing pcntl...";

  46. echo

  47. apt-get source php5

  48. PHP5=`ls -1F | grep '^php5-.*/$'`

  49. (cd $PHP5/ext/pcntl && phpize && ./configure && make && sudo make install)

  50. else

  51. echo "pcntl already installed";

  52. fi

  53. if [ ! -e libphutil ]

  54. then

  55. git clone https://github.com/phacility/libphutil.git

  56. else

  57. (cd libphutil && git pull --rebase)

  58. fi

  59. if [ ! -e arcanist ]

  60. then

  61. git clone https://github.com/phacility/arcanist.git

  62. else

  63. (cd arcanist && git pull --rebase)

  64. fi

  65. if [ ! -e phabricator ]

  66. then

  67. git clone https://github.com/phacility/phabricator.git

  68. else

  69. (cd phabricator && git pull --rebase)

  70. fi

  71. echo

  72. echo

  73. echo "Install probably worked mostly correctly. Continue with the 'Configuration Guide':";

  74. echo

  75. echo " https://secure.phabricator.com/book/phabricator/article/configuration_guide/";

  76. echo

  77. echo "You can delete any php5-* stuff that's left over in this directory if you want.";

關於安裝和配置,官方文件中有所提及(官方介紹的是 LAMP),請參考

0x41 LNMP環境的安裝

  • 安裝Linux
    關於Linux的安裝,這裡就不說了。

  • 安裝Nginx

    sudo apt-get install nginx

    安裝完成後,Nginx 的配置檔案存放在 /etc/nginx 目錄下。使用下面的命令可以啟動Nginx

    sudo service nginx start

    在安裝完並啟動後,可以使用瀏覽器訪問  試試是否可以跳轉到Nginx歡迎頁面

  • 安裝MySQL

    sudo apt-get install mysql-server

    在安裝過程中,會兩次提示輸入 root 使用者密碼。
    在安裝完成後,開啟終端,使用以下命令登入MySQL

    mysql -u root -p
  • 安裝PHP
    Phabricator需要 PHP 5.2 或者更高版本,但是 不支援 PHP 7 。
    可以使用以下命令安裝PHP

    sudo apt-get install -y php5 php5-fpm php5-mysql

    安裝完成後,可使用以下命令檢視是否安裝成功

    php -v

    安裝成功後,輸出類似以下資訊

  • 安裝其它
    如果你使用 git 來管理程式碼庫的話,你還需要安裝 git

    sudo apt-get install git

    一些必要的PHP擴充套件

    mbstring, iconv, mysql (or mysqli), curl, pcntl(這些擴充套件一般會以 "php-mysql" 或 "php5-mysql" 方式使用)

    一些可選的PHP擴充套件

    gd, apc(官方文件中有詳細的介紹和安裝說明), xhprof(如果你想自己開發Phabricator的話,你需要安裝這個,官方文件中有詳細的介紹說明)

0x42 Phabricator原始碼下載及執行

在成功安裝LNMP環境後,需要下載Phabricator的原始碼並配置讓它跑起來。

  • 原始碼下載
    在你想要存放Phabricator原始碼的位置(假設為 ./path_to_pha),執行這些命令

    1. git clone https://github.com/phacility/libphutil.git

    2. git clone https://github.com/phacility/arcanist.git

    3. git clone https://github.com/phacility/phabricator.git

    或者,你也可以直接點選上面的連結去GitHub下載壓縮包,下載完成後解壓。

  • Nginx配置
    在下載完成後,我們需要配置Nginx,讓Phabricator跑起來。假設你想為Phabricator分配這個域名:
    在 /etc/nginx/conf.d 目錄下建立檔案 pha.example.com.conf,存放Phabricator代理配置資訊,以下為我的檔案內容(注意把 你存放Phabricator的路徑 改為你的實際路徑)

  1. server {

  2. listen 80;

  3. server_name pha.example.com;

  4. location / {

  5. index index.php;

  6. rewrite ^/(.*)$ /index.php?__path__=/$1 last;

  7. }

  8. #error_page 404 /404.html;

  9. # redirect server error pages to the static page /50x.html

  10. #

  11. error_page 500 502 503 504 /50x.html;

  12. location = /50x.html {

  13. root /usr/share/nginx/html;

  14. }

  15. # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000

  16. #

  17. location ~ \.php$ {

  18. root /你存放Phabricator的路徑/phabricator/webroot;

  19. fastcgi_pass 127.0.0.1:9000;

  20. fastcgi_index index.php;

  21. fastcgi_param SCRIPT_FILENAME /你存放Phabricator的路徑/phabricator/webroot$fastcgi_script_name;

  22. include fastcgi_params;

  23. }

  24. }

配置完成後,重啟Nginx

sudo service nginx restart

然後在你的 hosts 檔案中,加入 pha.example.com 對應的IP

127.0.0.1 pha.example.com

開啟瀏覽器,訪問 ,會跳轉到Phabricator使用者註冊介面,在這個介面註冊的第一個使用者,將會成為管理員使用者。

0x50 配置

0x51 解決基本的配置問題

使用管理員賬號登入,左上角會出現黃色感嘆號圖示,提示有一些配置問題未解決


這些問題基本都是關於一些引數的設定。點選每一個問題,顯示的介面中會有很詳細的關於這個問題的描述,和如何解決。

0x52 設定使用者登入認證方式

使用管理員賬號登入,在左側的選單中選擇 Auth ,然後點選右上側 Add Provider,在列表中選則你需要的認證方式。

我選擇是 Username/Password 的方式,即使用者自己註冊Phabricator賬號。為了保障安全,我設定了只允許公司郵箱地址註冊:Config ---> Core Settings ---> Authentication ---> auth.email-domains。你還可以選擇 auth.require-approval ,即新註冊使用者需要管理員批准。

0x53 設定郵件傳送服務引數

首先,配置 mail-adapter (郵件傳送方式):Config ---> Core Settings ---> Mail ---> metamta.mail-adapter,我選擇的是 PhabricatorMailImplementationPHPMailerAdapter ,通過SMTP的方式傳送郵件。在選擇完之後,需要設定SMTP伺服器地址、賬號和密碼:Config ---> Core Settings ---> PHPMailer ---> metamta.mail-adapter,根據你自己郵箱的配置,相應的設定 phpmailer.smtp-hostphpmailer.smtp-portphpmailer.smtp-protocolphpmailer.smtp-userphpmailer.smtp-passwordphpmailer.smtp-encoding 。

0x54 配置程式碼倉庫訪問方式:SSH/HTTP

  • SSH
    (如果你不打算允許使用SSH的方式訪問程式碼倉庫的話,請忽略這部分)
    1)配置使用者賬號
    Phabricator需要三個使用者賬號(三種使用者身份):兩個用於基本執行,一個用於配置SSH訪問。這些賬號是指Phabricator所執行伺服器系統的賬號,不是Phabricator使用者賬號。
    三個賬號分別是:
    www-user:Phabricator Web伺服器執行身份。
    daemon-user :daemons (守護程序)執行身份。這個賬號是唯一直接與程式碼倉庫互動的賬號,其它賬號需要切換到這個賬號身份(sudo)才能操作程式碼倉庫。
    vcs-user:我們需要以這個賬號SSH連線Phabricator。
    如果你的伺服器系統中現在沒有這三個賬號,需要建立:
    www-user:大部分情況下,這個賬號已經存在了,我們不需要理這個賬號。
    daemon-user :一般情況下,我們直接使用 root 賬號,因為會需要很多許可權(當然這可能不安全)。
    vcs-user:可以使用系統中現有的一個使用者賬號,直接建立一個就叫 vcsuser。當用戶克隆倉庫的時候,需要使用類似 [email protected] 的URI。
    2)配置Phabricator
    首先,設定 phd.user 為 daemon-user(root)

    ./path_to_pha/bin/config set phd.user root

    重啟 daemons 以確認這個配置工作正常

    ./path_to_pha/bin/phd restart

    然後,配置SSH使用者賬號vcs-user(vcsuser 或其它你想用的使用者)

    ./path_to_pha/bin/config set diffusion.ssh-user vcsuser

    3)配置 Sudo
    www-user
     和 vcs-user 需要能夠使用 sudo 切換到 daemon-user 使用者身份才能與倉庫互動,所以我們需要配置更改系統的 sudo 配置。
    直接編輯 /etc/sudoers 或者在 /etc/sudoers.d 下建立一個新檔案,然後把這些內容寫到檔案內容中

    www-user ALL=(root) SETENV: NOPASSWD: /usr/lib/git-core/git, /usr/bin/git, /var/lib/git, /usr/lib/git-core/git-http-backend, /usr/bin/ssh, /etc/ssh, /etc/default/ssh, /etc/init.d/ssh
    vcs-user ALL=(root) SETENV: NOPASSWD: /bin/sh, /usr/bin/git-upload-pack, /usr/bin/git-receive-pack

    當然,別忘了把 www-user 和 vcs-user 替換為你實際對應的使用者。
    接下來,看看你檔案中是不是有這行

    Defaults requiretty

    如果有的話,請用 # 註釋掉。

    4)其它SSH配置
    我們還需要檢視這兩個檔案 /etc/shadow 和 /etc/passwd 中 vcs-user 對應的配置是否正確。
    開啟 /etc/shadow 檔案,找到 vcs-user 對應的那行,看一下第二個欄位(密碼),是不是 !! ,如果是,請改為 空值(什麼都不寫) 或者 NP 。
    開啟 /etc/passwd 檔案,找到 vcs-user 對應的那行,如果有類似於這樣的配置 /bin/false ,請修改為 /bin/sh,否則 sshd 無法執行命令。

    5)配置SSHD埠
    注意
    :Phabricator執行的伺服器系統中 sshd 的版本 必須高於 6.2
    假設我們把Phabricator使用的sshd埠設定為 22,這樣做的好處是我們不需要在倉庫的URI中加入埠號,類似ssh://[email protected]/xxx/xxx/xxx.git。當然,如果這樣做需要我們更改系統已存在的sshd配置改為其它埠。下面來看一下配置的三個步驟:
    i)建立指令碼 phabricator-ssh-hook.sh,並且把這個指令碼放到類似 /usr/libexec/phabricator-ssh-hook.sh 的目錄中(我直接放在 /etc/ssh/ 中,後面會要求變更這個指令碼和它的父資料夾所有者,所以這個指令碼和它的父資料夾所在的資料夾的所有者不正確的話可能會導致這個指令碼執行失敗),指令碼內容如下

  1. #!/bin/sh

  2. # NOTE: Replace this with the username that you expect users to connect with.

  3. VCSUSER="vcs-user"

  4. # NOTE: Replace this with the path to your Phabricator directory.

  5. ROOT="/path_to_pha"

  6. if [ "$1" != "$VCSUSER" ];

  7. then

  8. exit 1

  9. fi

  10. exec "$ROOT/bin/ssh-auth" [email protected]

注意把 VCSUSER 替換為你實際的使用者,把 ROOT 值替換為你Phabricator原始碼路徑。
建立完指令碼後,需要把指令碼和它的父資料夾所有者改為 root,並且賦予指令碼 755 許可權:

  1. sudo chown root /path/to/somewhere/

  2. sudo chown root /path/to/somewhere/phabricator-ssh-hook.sh

  3. sudo chmod 755 /path/to/somewhere/phabricator-ssh-hook.sh

如果你不這麼做,sshd 會拒絕執行 hook。

ii)為Phabricator建立 sshd_config
在 /etc/ssh 中建立檔名類似 sshd_config.phabricator 的檔案,檔案內容如下:

  1. # NOTE: You must have OpenSSHD 6.2 or newer; support for AuthorizedKeysCommand

  2. # was added in this version.

  3. # NOTE: Edit these to the correct values for your setup.

  4. AuthorizedKeysCommand /你的指令碼路徑/phabricator-ssh-hook.sh

  5. AuthorizedKeysCommandUser vcs-user

  6. AllowUsers vcs-user

  7. # You may need to tweak these options, but mostly they just turn off everything

  8. # dangerous.

  9. Port 你配置的埠號

  10. Protocol 2

  11. PermitRootLogin no

  12. AllowAgentForwarding no

  13. AllowTcpForwarding no

  14. PrintMotd no

  15. PrintLastLog no

  16. PasswordAuthentication no

  17. AuthorizedKeysFile none

  18. PidFile /var/run/sshd-phabricator.pid

注意把 AuthorizedKeysCommand 值替換為你在上一步中指令碼實際路徑,把 AuthorizedKeysCommandUser 和 AllowUsers 替換為你實際的使用者,把 Port 替換為你想配置的埠號。如果你的 Port 值為 22,在你進行下面的操作之前,請檢視當前系統中 22 埠是已否佔用

sudo netstat -atlunp | grep ssh

如果已經被佔用,請修改使用 22 埠的 sshd 配置,一般它們會在 /etc/ssh 下,名稱類似 sshd_config,修改完成後,請重啟 ssh 服務

sudo /etc/init.d/ssh restart

在完成上面的步驟後,我們來啟動Phabricator的 ssh 服務

sudo /path/to/sshd -f /你的Phabricator sshd配置路徑/sshd_config.phabricator

一般情況下,sshd 路徑為 /usr/sbin
在啟動後,我們需要驗證以下配置是否有效:
首先,請把你的公鑰新增到Phabricator自己的賬號中(你可以自己註冊一個新的賬號),註冊完成後登入,然後 點選你的頭像 ---> 左側菜單面板 Manage ---> 右側菜單面板 Edit Settings ---> 左側菜單面板 SSH Public Keys ---> 右上角 SSH Key Actions ---> Upload Public Key

上傳公鑰後,執行下面的命令

echo {} | ssh [email protected] conduit conduit.ping

如果出現類似下面的結果,說明配置有效

{"result":"phabricator.yourcompany.com","error_code":null,"error_info":null}

如果沒有出現別的情況,請參考官方文件 Troubleshooting SSH 部分,官方文件地址如下

接下來,看一下如何配置 HTTP

  • HTTP
    首先,請確認Phabricator的配置項 diffusion.allow-http-auth 設定為 true。可以在 左側菜單面板 All Setttings 中查詢 diffusion.allow-http-auth ,點選之後可設定,請設定為 Allow HTTP Basic Auth
    然後,所有使用者需要使用 HTTP 訪問倉庫之前,需要設定自己的密碼:點選你的頭像 ---> 左側菜單面板 Manage ---> 右側菜單面板 Edit Settings ---> 左側菜單面板 VCS Password

強烈建議不要把這個密碼設定為你的Phabricator登入密碼,因為 vcs 密碼很容易洩露。
一般來說,不需要其它配置就可以使用 HTTP 了,如果有問題,請參考官方文件 Troubleshooting HTTP 部分

配置完倉庫訪問方式後,我們來看一下如何使用 Phabricator 進行 Code Review。

0x60 使用Phabricator進行Code Review

在進行 Code Review 實踐前,先說一些理論方面的東西(開頭和 0x61 ,不喜歡可繞過)
Code Review,有時候就像打架一樣:我提交了變更,你說不行,要修改;我又提交了一次,你說還是不行,還要改。我不知道你究竟要怎樣,你也不知道我感覺受到了打擊有多不爽。所以,大家需要對Code Review這件事抱有開放的態度:

  • 為什麼我的程式碼需要其他人審查?
    因為我不是神,我會製造Bug,我會當局者迷。
  • 為什麼我要審查其他人的程式碼?
    因為我要對我們的團隊負責,我要保證我們產品的質量,我可能會看到他人程式碼的Bug,在這些Bug顯示出它們的"威力"前,把它們弄死。

Code Review這件事,旨在創造一個共進的團隊氛圍(交流和技術等),在產品交付給使用者(包括我們的測試人員)前,保證產品的質量。

在瞭解如何使用Phabricator進行Code Review前,我們先了解一下Phabricator Code Review的流程,對其有一個整體上的瞭解。

0x61 Phabricator Code Review工作流

Phabricator提供兩種Code Review的方式:pre-pushpost-push
pre-push
 是指審查發生在變更釋出前;post-push 是指審查發生在變更已經被髮布或者正在釋出。
這裡我們認為 pre-push 的方式更適合,所以接下來說一下 pre-push 的工作流:

Write, Review, Merge, Publish

從這篇文章,我瞭解到了這個流程

如果你之前用過其它的Code Review工具,可能會對這樣的流程感到不習慣。在其它工具中,變更(程式碼,資原始檔或其它)會經歷這樣一個流程: Write, Publish, Review, Merge。首先,你做出一些變更(Write),然後把他們推送到遠端倉庫(Publish)等待審查者審查。一旦這些程式碼被審查(Review)並通過,變更會合並(Merge)到一個指定的功能分支。在這個流程中,被合併的變更恰好是被推送的變更(這句話有點模模糊糊,不痛不癢,接下來我們看一下Phabricator的流程,也許會清晰很多)。
接下來,我們看一下Phabricator略有不同的工作流:Write, Review, Merge, Publish。像上面一樣,開始的時候,你做出一些變更。但是,接下來的流程就不一樣了。
Phabricator認為在開發過程中審查(Review)是一個重要的步驟,對於那些沒有審查過的變更,是不可以釋出的。
理論上來說,沒有審查過的變更不算數:這些變更可能只是臨時的,易變的。可能方法上不對,可能缺少來龍去脈,可能根本就是解決錯誤的問題,等等。審查的參考基礎是建立在開發人員和審查人員擁有一個共同認可的變更處理方式,並且這種處理方式是開發過程所有參與人員(專案管理、產品、開發)都期望的,而不僅僅是僅僅做到最終的產品看起來沒問題。直到變更經過了這樣的審查,我們才能得到穩固的版本。
這樣的工作流跟其它工具的審查流程沒有實質上的技術區別,但是存在明顯的社交活動上的不同:由於變更必須經過審查才能被合併、釋出,變更作者需要根據反饋對變更進行調整。另外,審查者根據粗略的草圖(所有開發參與人員共同認可的變更方式)進行反饋,而不是簡單的批判一件已經完成的變更工作。
Phabricator和其它工具的工作流都有著同樣的目的:未審查的程式碼都只是臨時的變更,沒有長久或者明顯的價值,直到通過審查。
Phabricator工作流的第二步是審查(Review),審查的物件是還沒有釋出的變更。沒有釋出的變更被髮送到Phabricator等待被審查(通常我們使用 arc diff命令傳送審查請求),然後審查者做出反饋。變更作者根據反饋進行修改,在修改過程中,作者不必擔心版本、解決方式這些事情。作者可以自由的復位、使用、移除或者捨棄老的變更。在從變更提交稽核到稽核者反饋,以及作者再次修改整個過程中,沒有那種稽核者把作者推入一個必須接受或者只能做少量改變的預設釋出狀態。
一旦通過稽核,變更會被合併(Merge)和釋出(Publish)(通常,這兩個步驟由一個命令完成 arc land)。
這裡,Phabricator也與那些先 Publish 的工具不同:預設情況下,Phabricator會捨棄到達最後變更前的所做的中間過程,把最後變更的整個過程壓縮成一次提交。總體來說,這意味著捨棄checkpoint commits, rebases, squash-merges, 並且把整個變更過程做為一次 fast-forward commit 提交到目標分支。
Phabricator在一定程度上能做到這些,是因為:什麼都沒有被髮布,所以這種工作流可以以任何想要的方式釋出變更。
有了這些,我們可以以我們想要的版本自由的rebase,fast-commit,這些是Phabricator預設的行為。

0x62 進行Code Review所用工具

做為一般使用者,常用的工具有兩個 Differential 和 Arcanist 。

  • Differential-審查程式碼的工作臺

我們在這裡檢視變更審查情況,對變更進行審查或評論等操作。
這是某次變更介面操作部分截圖

做為 審查人,可進行的操作有:
Comment:說點什麼。可以針對某行程式碼進行評論,直接點選行號即可
Accept Revision:接受變更,這哥們程式碼寫得不錯,不需要改
Request Changes:不行,還要改
Resign as Reviewer:重新指定審查程式碼的人
Commandeer Revision:字面意思是將這個Revision據為己有的意思,實際上這個時候Reviewer的身份已經變為Owner的身份了,不能再進行Review了,但是Comment還是可以的
Add Reviewer:新增審查人
Add Subscribers:新增訂閱者,CC

做為 作者,可進行的操作有:
Comment:說點什麼。可以針對某行程式碼進行評論,直接點選行號即可
Abandon Revision:廢除版本。廢除後,這個版本就不需要再稽核了
Plan Changes:計劃變更,我自己發現了一些問題或者需求有變,正在改
Add Reviewer:新增其它審查人(除當前審查人外)
Add Subscribers:新增訂閱者,CC

  • Arcanist - 命令互動
    我們用這個工具提交變更和審查請求,對變更做出更改,或者在通過審查後釋出到遠端倉庫分支中。
    常用的命令有:
    arc diff:傳送變更詳情和審查請求
    arc land:推送變更(Git and Mercurial),當通過審查後使用這個命令
    arc list:顯示變更處理的情況
    arc cover:查詢最有可能審查變更的人
    arc patch:給版本打補丁
    arc export:從Differential下載補丁
    arc amend:更新Git commit
    arc commit:提交變更(SVN)
    arc branch:檢視Git branches更加詳細的資訊

    在配置了 lint 和 unit test intergration後,可以用這些命令:
    arc lint:靜態程式碼檢查
    arc unit:單元測試

    與其它工具互動:
    arc upload:上傳檔案
    arc download:下載檔案
    arc paste:建立和檢視剪貼

    還有一些高階功能:
    arc call-conduit:執行 Conduit 方法
    arc liberate:建立或更新 libphutil 庫
    arc shell-complete:啟用 tab 補全

0x63 配置進行Code Review

一些基本的配置和安裝 ---> 寫程式碼 ---> 提交審查請求(arc diff) ---> 審查(Differential) ---> (審查通過後)合併提交(arc land)

  • 一些基本的配置和安裝
    包括:
    配置程式碼倉庫(Diffusion)
    把你本地的Git遠端URL設定為Phabricator上程式碼倉庫地址
    安裝Arcanist
    配置Project資訊

  • 配置程式碼倉庫(Diffusion)
    在開始進行程式碼審查後,我們的程式碼是由Phabricator直接託管的,所以我們需要配置程式碼倉庫。
    使用管理員賬號登入Phabricator,點選左側面板選單 Diffusion ,然後點選右上側 Create Repository ,選擇你所使用的 Repository 型別,填寫 Name 等資訊,在建立完成後即可使用。如果沒有什麼特殊的需求,不需要進行特別的配置,這裡列舉兩種你可能遇到的打算開始使用 Phabricator 時的場景:

    1、程式碼之前由 GitHub 或其它託管,現在我需要把之前的程式碼匯入
    點選 Manage Repository ,點選左側 URIs,點選 Add New URI,填寫GitHub或其它託管系統對應倉庫的 URI , I/O Type 選擇 Observe,點選 Create Repository URI 新增新的 URI 。


    在新增完新的 URI 後,你還需要點選 Set Credential 設定訪問新的 URI 的認證方式。
    如果你打算此時就開始使用 Phabricator ,請務必通知你的團隊,暫停一下,不要再向GitHub等提交程式碼。如果你的 GitHub 等也設定了程式碼審查,請督促相關人員完成程式碼審查流程。 
    稍等片刻,待 Phabricator 同步完之前的程式碼後,編輯你新增的 GitHub 或其它程式碼託管系統的 URI ,務必修改 I/O Type
    1)如果你不再需要使用之前的託管系統,選擇 No I/O
    2)如果你想繼續把程式碼備份到之前的程式碼託管系統,選擇 Mirror,這時, Phabricator 程式碼倉庫的變更會覆蓋推送到之前的程式碼託管系統
    如果你不修改 I/O Type,向 Phabricator 程式碼倉庫提交程式碼會失敗,因為是隻讀的。
    當然,對於匯入之前的程式碼,還有別的方式,例如直接把本地的程式碼再次向 Phabricator 程式碼倉庫再提交一次。

    2、開始一個新的專案,建立一個新的倉庫
    參考第1種場景,在 Phabricator 建立程式碼倉庫。如果你希望把程式碼備份到其它的託管系統,只需要新增對應的 URI,並且把 I/O Type 選為 Mirror

  • 把你本地的Git遠端URL設定為Phabricator上程式碼倉庫地址

    git remote set-url 遠端名稱 新的url
  • 寫程式碼
    當然,不只是程式碼可以被審查,圖示等資原始檔的變更也可以被審查。

  • 提交審查請求(arc diff)
    一般情況下,我們直接使用 arc diff 即可,預設情況下,Arcanist 會把本地分支的 HEAD 與遠端對應分支的 HEAD 進行對比,並生成差異對比傳送到 Phabricator。當你所做的修改沒有 commit 時,會提示你進行 commit。
    在一些情況下,我們並不希望與本地分支的 HEAD 進行比較,假設想要與上次的 commit 比較,上次 commit id 是 8ffc88dc05d31fffd28e3ff1129d1b8c321dffff,那麼我們需要在 arc diff 後把這個 id 加上:arc diff 8ffc88dc05d31fffd28e3ff1129d1b8c321dffff
    執行這條命令時我們需要按照模板填寫title(必填),summary(必填),Test Plan(必填,沒有可寫 N/A 之類的標識),Reviewers(必填,且必須為真實有效的使用者名稱),Subscribers(可選),填寫完成後關閉編輯器,Arcanist會自動提交審查請求。

  • 審查(Differential)
    做為 審查人,需要在 Differential 工作臺完成程式碼審查工作,上面已經介紹了 Differential,這裡就不再多說了。

  • (審查通過後)合併提交(arc land)
    做為 作者,在程式碼審查通過後,需要使用 arc land 把變更釋出到遠端分支。
    注意,在首次執行這條命令前(不一定非要到這個步驟,可以是這個步驟前的任意時刻,例如開始寫程式碼前),建議請使用 git branch -u 遠端名稱/遠端分支名稱 把本地的分支與遠端分支相關聯,否則,在執行完 arc land 後,本地分支會被刪除。如果你不想這樣做,又需要保留現在分支的話,請使用 arc land --keep-branch
    預設情況下,Arcanist 會把變更推送到與本地分支相關聯的遠端分支,你可以使用 --remote 和 --onto 引數推送到你想要的遠端和遠端分支。
    關於 arc land 的詳細說明,可使用 arc land --help 檢視。

0x70 與GitHub整合

這裡的“整合”其實說的很心虛,因為在使用 Phabricator 後,GitHub 已經變為一個檔案儲存伺服器了。常見的使用情況已經在 0x63 配置進行Code Review 的 配置程式碼倉庫(Diffusion) 中寫出,所以你懂的。

0x80 與Jenkins整合

在很久很久以前,我已經搭建了 Jenkins 用於自動構建,所以這次把 Phabricator 與 Jenkins 做了整合。
在 Jenkins 中安裝完外掛: Phabricator Differential Plugin 後,請參考這篇文章:

0x90 結束語

從配置完到開始試用已經有一個月左右,期間遇到了各種問題。經歷了這些問題的洗禮,算是對 Phabricator 使用入門了吧。
這篇文章時隔多日才完成,儘管我想把每個細節寫的詳盡,但是記憶總是像被蟲蛀過的木頭,難免有些疏漏。加之文筆水平有限,各位就湊合著看吧。
在安裝和使用過程中遇到的問題,歡迎各位評論交流。

0xA0 Q/A

1、如何強制使用者 Code Review?
再次強調一下前提:在開始 Code Review 流程前,請先確認團隊成員的git remote url已經切換為Phabricator上對應倉庫地址。
強制使用者Code Review,需要建立Herald Rule。在建立時,New Rule for 選:Commit Hook: Commit Content.Rule Type選:Global,或者根據自己需要選擇;Conditions中是組合條件,可以根據自己需要指定一些條件;Action 指定當前情況符合你指定的條件組合時執行的動作。示例如圖:

示例中定義了以下規則:在向develop分支提交程式碼時,所提交的程式碼必須是通過 Code Review 流程審查通過的,否則會被拒絕;除非 Commit Message 中包含字元 @bypass-review 。
指定 Commit Message 中包含字元 @bypass-review 這種例外情況,主要考慮到在緊急修復一些問題,沒時間等待審查時使用。
當提交被拒絕時,如圖: