目錄
- 0x10 概述
- 0x20 我的應用環(huán)境
- 0x30 路線圖
- 0x40 安裝
0x41 LNMP環(huán)境的安裝
0x42 Phabricator源碼下載及運行- 0x50 配置
0x51 解決基本的配置問題
0x52 設置用戶登錄認證方式
0x53 設置郵件發(fā)送服務參數(shù)
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的軟件開發(fā)協(xié)作工具,包括代碼審查工具Differential,資源庫瀏覽器Diffusion,變更監(jiān)測工具Herald,Bug跟蹤工具Maniphest和維基工具Phriction。Phabricator可與Git、Mercurial、Subversion集成使用。
Phabricator是開源軟件,可在Apache許可證第2版下作為自由軟件分發(fā)。
Phabricator最初是Facebook的一個內部工具,主要開發(fā)者為Evan Priestley。Evan Priestley離開Facebook后,在名為Phacility的新公司繼續(xù)Phabricator的開發(fā)。
官網(wǎng):https://www.phacility.com/
官網(wǎng)中的文檔很多很全,但是如果對這個工具不太了解,或者對于Code Review不太了解的話,讀起來可能會覺得沒有頭緒。這篇文章就自己的安裝及使用過程做一個梳理,對于同樣想用這個工具的讀者,或許起到一些幫助作用。
對于本文中的一些章節(jié),如果在官方文檔有所提及,我會把官方文檔地址附上,讀者可以閱讀一下官方文檔,因為他們的語言和表達更優(yōu)秀。
0x20 我的應用環(huán)境
- 我:一個做了很多年Android的程序員 (所以當這篇文章有幸被所涉及領域的專家看到,又發(fā)現(xiàn)有的部分有所不妥,或者有更好的想法時,請主動聯(lián)系我改進,多謝~~~ 有任何問題,歡迎評論交流)
- 主機:Ubuntu 14.04 PC一臺
- 網(wǎng)絡:內網(wǎng)
- 代碼庫:GitHub
- CI:Jenkins
0x30 路線圖
安裝和使用路線大致如此圖,下面開始詳細說明。
0x40 安裝
Phabricator是一個基于Web的工具軟件,使用PHP語言編寫的,為了能讓他運行起來,我們需要搭建一個LNMP(Linux,Nginx,MySQL,PHP)的Web Server環(huán)境。搭建完LNMP的環(huán)境后,下載Phabricator源碼,配置后即可使用。
-
先看我
如果你不想讀那么多文字,在Ubuntu環(huán)境下可以試試下面的腳本,這個腳本可以安裝LNMP環(huán)境和下載Phabricator源碼,執(zhí)行完腳本并成功后,跳到 0x42 Phabricator源碼下載及運行 查看如何讓Phabricator跑起來。
#!/bin/bash
confirm() {
echo "Press RETURN to continue, or ^C to cancel.";
read -e ignored
}
GIT='git'
LTS="Ubuntu 10.04"
ISSUE=`cat /etc/issue`
if [[ $ISSUE != Ubuntu* ]]
then
echo "This script is intended for use on Ubuntu, but this system appears";
echo "to be something else. Your results may vary.";
echo
confirm
elif [[ `expr match "$ISSUE" "$LTS"` -eq ${#LTS} ]]
then
GIT='git-core'
fi
echo "PHABRICATOR UBUNTU INSTALL SCRIPT";
echo "This script will install Phabricator and all of its core dependencies.";
echo "Run it from the directory you want to install into.";
echo
ROOT=`pwd`
echo "Phabricator will be installed to: ${ROOT}.";
confirm
echo "Testing sudo..."
sudo true
if [ $? -ne 0 ]
then
echo "ERROR: You must be able to sudo to run this script.";
exit 1;
fi;
echo "Installing dependencies: git, nginx, mysql, php...";
echo
set +x
sudo apt-get -qq update
sudo apt-get install \
$GIT nginx mysql-server dpkg-dev \
php5 php5-mysql php5-gd php5-dev php5-curl php-apc php5-cli php5-json
# Enable mod_rewrite
sudo a2enmod rewrite
HAVEPCNTL=`php -r "echo extension_loaded('pcntl');"`
if [ $HAVEPCNTL != "1" ]
then
echo "Installing pcntl...";
echo
apt-get source php5
PHP5=`ls -1F | grep '^php5-.*/$'`
(cd $PHP5/ext/pcntl && phpize && ./configure && make && sudo make install)
else
echo "pcntl already installed";
fi
if [ ! -e libphutil ]
then
git clone https://github.com/phacility/libphutil.git
else
(cd libphutil && git pull --rebase)
fi
if [ ! -e arcanist ]
then
git clone https://github.com/phacility/arcanist.git
else
(cd arcanist && git pull --rebase)
fi
if [ ! -e phabricator ]
then
git clone https://github.com/phacility/phabricator.git
else
(cd phabricator && git pull --rebase)
fi
echo
echo
echo "Install probably worked mostly correctly. Continue with the 'Configuration Guide':";
echo
echo " https://secure.phabricator.com/book/phabricator/article/configuration_guide/";
echo
echo "You can delete any php5-* stuff that's left over in this directory if you want.";
關于安裝和配置,官方文檔中有所提及(官方介紹的是 LAMP),請參考
https://secure.phabricator.com/book/phabricator/article/installation_guide/
0x41 LNMP環(huán)境的安裝
安裝Linux
關于Linux的安裝,這里就不說了。安裝Nginx
sudo apt-get install nginx
安裝完成后,Nginx 的配置文件存放在 /etc/nginx 目錄下。使用下面的命令可以啟動Nginx
sudo service nginx start
在安裝完并啟動后,可以使用瀏覽器訪問 http://127.0.0.1 試試是否可以跳轉到Nginx歡迎頁面
-
安裝MySQL
sudo apt-get install mysql-server
在安裝過程中,會兩次提示輸入 root 用戶密碼。
在安裝完成后,打開終端,使用以下命令登錄MySQLmysql -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(如果你想自己開發(fā)Phabricator的話,你需要安裝這個,官方文檔中有詳細的介紹說明)
0x42 Phabricator源碼下載及運行
在成功安裝LNMP環(huán)境后,需要下載Phabricator的源碼并配置讓它跑起來。
-
源碼下載
在你想要存放Phabricator源碼的位置(假設為 ./path_to_pha),執(zhí)行這些命令
git clone https://github.com/phacility/libphutil.git
git clone https://github.com/phacility/arcanist.git
git clone https://github.com/phacility/phabricator.git
或者,你也可以直接點擊上面的鏈接去GitHub下載壓縮包,下載完成后解壓。
-
Nginx配置
在下載完成后,我們需要配置Nginx,讓Phabricator跑起來。假設你想為Phabricator分配這個域名:http://pha.example.com
在 /etc/nginx/conf.d 目錄下創(chuàng)建文件 pha.example.com.conf,存放Phabricator代理配置信息,以下為我的文件內容(注意把 你存放Phabricator的路徑 改為你的實際路徑)
server {
listen 80;
server_name pha.example.com;
location / {
index index.php;
rewrite ^/(.*)$ /index.php?__path__=/$1 last;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
root /你存放Phabricator的路徑/phabricator/webroot;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /你存放Phabricator的路徑/phabricator/webroot$fastcgi_script_name;
include fastcgi_params;
}
}
配置完成后,重啟Nginx
sudo service nginx restart
然后在你的 hosts 文件中,加入 pha.example.com 對應的IP
127.0.0.1 pha.example.com
打開瀏覽器,訪問 http://pha.example.com,會跳轉到Phabricator用戶注冊界面,在這個界面注冊的第一個用戶,將會成為管理員用戶。
0x50 配置
0x51 解決基本的配置問題
使用管理員賬號登錄,左上角會出現(xiàn)黃色感嘆號圖標,提示有一些配置問題未解決
這些問題基本都是關于一些參數(shù)的設置。點擊每一個問題,顯示的界面中會有很詳細的關于這個問題的描述,和如何解決。
0x52 設置用戶登錄認證方式
使用管理員賬號登錄,在左側的菜單中選擇 Auth ,然后點擊右上側 Add Provider,在列表中選則你需要的認證方式。
我選擇是 Username/Password 的方式,即用戶自己注冊Phabricator賬號。為了保障安全,我設置了只允許公司郵箱地址注冊:Config ---> Core Settings ---> ** Authentication** ---> auth.email-domains。你還可以選擇 auth.require-approval ,即新注冊用戶需要管理員批準。
0x53 設置郵件發(fā)送服務參數(shù)
首先,配置 mail-adapter (郵件發(fā)送方式):Config ---> Core Settings ---> Mail ---> metamta.mail-adapter,我選擇的是 PhabricatorMailImplementationPHPMailerAdapter ,通過SMTP的方式發(fā)送郵件。在選擇完之后,需要設置SMTP服務器地址、賬號和密碼:Config ---> Core Settings ---> PHPMailer ---> metamta.mail-adapter,根據(jù)你自己郵箱的配置,相應的設置 phpmailer.smtp-host、phpmailer.smtp-port、phpmailer.smtp-protocol、phpmailer.smtp-user、phpmailer.smtp-password、phpmailer.smtp-encoding 。
0x54 配置代碼倉庫訪問方式:SSH/HTTP
-
SSH
(如果你不打算允許使用SSH的方式訪問代碼倉庫的話,請忽略這部分)
1)配置用戶賬號
Phabricator需要三個用戶賬號(三種用戶身份):兩個用于基本運行,一個用于配置SSH訪問。這些賬號是指Phabricator所運行服務器系統(tǒng)的賬號,不是Phabricator用戶賬號。
三個賬號分別是:
www-user:Phabricator Web服務器運行身份。
daemon-user :daemons (守護進程)運行身份。這個賬號是唯一直接與代碼倉庫交互的賬號,其它賬號需要切換到這個賬號身份(sudo)才能操作代碼倉庫。
vcs-user:我們需要以這個賬號SSH連接Phabricator。
如果你的服務器系統(tǒng)中現(xiàn)在沒有這三個賬號,需要創(chuàng)建:
www-user:大部分情況下,這個賬號已經(jīng)存在了,我們不需要理這個賬號。
daemon-user :一般情況下,我們直接使用 root 賬號,因為會需要很多權限(當然這可能不安全)。
vcs-user:可以使用系統(tǒng)中現(xiàn)有的一個用戶賬號,直接創(chuàng)建一個就叫 vcsuser。當用戶克隆倉庫的時候,需要使用類似 vcsuser@pha.example.com 的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 用戶身份才能與倉庫交互,所以我們需要配置更改系統(tǒng)的 sudo 配置。
直接編輯 /etc/sudoers 或者在 /etc/sudoers.d 下創(chuàng)建一個新文件,然后把這些內容寫到文件內容中
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 無法執(zhí)行命令。
5)配置SSHD端口
注意:Phabricator運行的服務器系統(tǒng)中 sshd 的版本 必須高于 6.2。
假設我們把Phabricator使用的sshd端口設置為 22,這樣做的好處是我們不需要在倉庫的URI中加入端口號,類似ssh://vcs-user@pha.example.com/xxx/xxx/xxx.git。當然,如果這樣做需要我們更改系統(tǒng)已存在的sshd配置改為其它端口。下面來看一下配置的三個步驟:
i)創(chuàng)建腳本 phabricator-ssh-hook.sh,并且把這個腳本放到類似 /usr/libexec/phabricator-ssh-hook.sh 的目錄中(我直接放在 /etc/ssh/ 中,后面會要求變更這個腳本和它的父文件夾所有者,所以這個腳本和它的父文件夾所在的文件夾的所有者不正確的話可能會導致這個腳本執(zhí)行失敗),腳本內容如下
#!/bin/sh
# NOTE: Replace this with the username that you expect users to connect with.
VCSUSER="vcs-user"
# NOTE: Replace this with the path to your Phabricator directory.
ROOT="/path_to_pha"
if [ "$1" != "$VCSUSER" ];
then
exit 1
fi
exec "$ROOT/bin/ssh-auth" $@
注意把 VCSUSER 替換為你實際的用戶,把 ROOT 值替換為你Phabricator源碼路徑。
創(chuàng)建完腳本后,需要把腳本和它的父文件夾所有者改為 root,并且賦予腳本 755 權限:
sudo chown root /path/to/somewhere/
sudo chown root /path/to/somewhere/phabricator-ssh-hook.sh
sudo chmod 755 /path/to/somewhere/phabricator-ssh-hook.sh
如果你不這么做,sshd 會拒絕執(zhí)行 hook。
ii)為Phabricator創(chuàng)建 sshd_config
在 /etc/ssh 中創(chuàng)建文件名類似 sshd_config.phabricator 的文件,文件內容如下:
# NOTE: You must have OpenSSHD 6.2 or newer; support for AuthorizedKeysCommand
# was added in this version.
# NOTE: Edit these to the correct values for your setup.
AuthorizedKeysCommand /你的腳本路徑/phabricator-ssh-hook.sh
AuthorizedKeysCommandUser vcs-user
AllowUsers vcs-user
# You may need to tweak these options, but mostly they just turn off everything
# dangerous.
Port 你配置的端口號
Protocol 2
PermitRootLogin no
AllowAgentForwarding no
AllowTcpForwarding no
PrintMotd no
PrintLastLog no
PasswordAuthentication no
AuthorizedKeysFile none
PidFile /var/run/sshd-phabricator.pid
注意把 AuthorizedKeysCommand 值替換為你在上一步中腳本實際路徑,把 AuthorizedKeysCommandUser 和 AllowUsers 替換為你實際的用戶,把 Port 替換為你想配置的端口號。如果你的 Port 值為 22,在你進行下面的操作之前,請查看當前系統(tǒng)中 22 端口是已否占用
sudo netstat -atlunp | grep ssh
如果已經(jīng)被占用,請修改使用 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
上傳公鑰后,執(zhí)行下面的命令
echo {} | ssh vcs-user@phabricator.yourcompany.com conduit conduit.ping
如果出現(xiàn)類似下面的結果,說明配置有效
{"result":"phabricator.yourcompany.com","error_code":null,"error_info":null}
如果沒有出現(xiàn)別的情況,請參考官方文檔 Troubleshooting SSH 部分,官方文檔地址如下
https://secure.phabricator.com/book/phabricator/article/diffusion_hosting/
接下來,看一下如何配置 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 部分
https://secure.phabricator.com/book/phabricator/article/diffusion_hosting/
配置完倉庫訪問方式后,我們來看一下如何使用 Phabricator 進行 Code Review。
0x60 使用Phabricator進行Code Review
在進行 Code Review 實踐前,先說一些理論方面的東西(開頭和 0x61 ,不喜歡可繞過)
Code Review,有時候就像打架一樣:我提交了變更,你說不行,要修改;我又提交了一次,你說還是不行,還要改。我不知道你究竟要怎樣,你也不知道我感覺受到了打擊有多不爽。所以,大家需要對Code Review這件事抱有開放的態(tài)度:
-
為什么我的代碼需要其他人審查?
因為我不是神,我會制造Bug,我會當局者迷。 -
為什么我要審查其他人的代碼?
因為我要對我們的團隊負責,我要保證我們產(chǎn)品的質量,我可能會看到他人代碼的Bug,在這些Bug顯示出它們的"威力"前,把它們弄死。
Code Review這件事,旨在創(chuàng)造一個共進的團隊氛圍(交流和技術等),在產(chǎn)品交付給用戶(包括我們的測試人員)前,保證產(chǎn)品的質量。
在了解如何使用Phabricator進行Code Review前,我們先了解一下Phabricator Code Review的流程,對其有一個整體上的了解。
0x61 Phabricator Code Review工作流
Phabricator提供兩種Code Review的方式:pre-push,post-push
pre-push 是指審查發(fā)生在變更發(fā)布前;post-push 是指審查發(fā)生在變更已經(jīng)被發(fā)布或者正在發(fā)布。
這里我們認為 pre-push 的方式更適合,所以接下來說一下 pre-push 的工作流:
Write, Review, Merge, Publish
從這篇文章,我了解到了這個流程
如果你之前用過其它的Code Review工具,可能會對這樣的流程感到不習慣。在其它工具中,變更(代碼,資源文件或其它)會經(jīng)歷這樣一個流程: Write, Publish, Review, Merge。首先,你做出一些變更(Write),然后把他們推送到遠程倉庫(Publish)等待審查者審查。一旦這些代碼被審查(Review)并通過,變更會合并(Merge)到一個指定的功能分支。在這個流程中,被合并的變更恰好是被推送的變更(這句話有點模模糊糊,不痛不癢,接下來我們看一下Phabricator的流程,也許會清晰很多)。
接下來,我們看一下Phabricator略有不同的工作流:Write, Review, Merge, Publish。像上面一樣,開始的時候,你做出一些變更。但是,接下來的流程就不一樣了。
Phabricator認為在開發(fā)過程中審查(Review)是一個重要的步驟,對于那些沒有審查過的變更,是不可以發(fā)布的。
理論上來說,沒有審查過的變更不算數(shù):這些變更可能只是臨時的,易變的。可能方法上不對,可能缺少來龍去脈,可能根本就是解決錯誤的問題,等等。審查的參考基礎是建立在開發(fā)人員和審查人員擁有一個共同認可的變更處理方式,并且這種處理方式是開發(fā)過程所有參與人員(項目管理、產(chǎn)品、開發(fā))都期望的,而不僅僅是僅僅做到最終的產(chǎn)品看起來沒問題。直到變更經(jīng)過了這樣的審查,我們才能得到穩(wěn)固的版本。
這樣的工作流跟其它工具的審查流程沒有實質上的技術區(qū)別,但是存在明顯的社交活動上的不同:由于變更必須經(jīng)過審查才能被合并、發(fā)布,變更作者需要根據(jù)反饋對變更進行調整。另外,審查者根據(jù)粗略的草圖(所有開發(fā)參與人員共同認可的變更方式)進行反饋,而不是簡單的批判一件已經(jīng)完成的變更工作。
Phabricator和其它工具的工作流都有著同樣的目的:未審查的代碼都只是臨時的變更,沒有長久或者明顯的價值,直到通過審查。
Phabricator工作流的第二步是審查(Review),審查的對象是還沒有發(fā)布的變更。沒有發(fā)布的變更被發(fā)送到Phabricator等待被審查(通常我們使用 arc diff
命令發(fā)送審查請求),然后審查者做出反饋。變更作者根據(jù)反饋進行修改,在修改過程中,作者不必擔心版本、解決方式這些事情。作者可以自由的復位、使用、移除或者舍棄老的變更。在從變更提交審核到審核者反饋,以及作者再次修改整個過程中,沒有那種審核者把作者推入一個必須接受或者只能做少量改變的默認發(fā)布狀態(tài)。
一旦通過審核,變更會被合并(Merge)和發(fā)布(Publish)(通常,這兩個步驟由一個命令完成 arc land
)。
這里,Phabricator也與那些先 Publish 的工具不同:默認情況下,Phabricator會舍棄到達最后變更前的所做的中間過程,把最后變更的整個過程壓縮成一次提交。總體來說,這意味著舍棄checkpoint commits, rebases, squash-merges, 并且把整個變更過程做為一次 fast-forward commit 提交到目標分支。
Phabricator在一定程度上能做到這些,是因為:什么都沒有被發(fā)布,所以這種工作流可以以任何想要的方式發(fā)布變更。
有了這些,我們可以以我們想要的版本自由的rebase,fast-commit,這些是Phabricator默認的行為。
0x62 進行Code Review所用工具
做為一般用戶,常用的工具有兩個 Differential 和 Arcanist 。
- Differential-審查代碼的工作臺
我們在這里查看變更審查情況,對變更進行審查或評論等操作。
這是某次變更界面操作部分截圖
<p>做為 審查人,可進行的操作有:
Comment:說點什么。可以針對某行代碼進行評論,直接點擊行號即可
Accept Revision:接受變更,這哥們代碼寫得不錯,不需要改
Request Changes:不行,還要改
Resign as Reviewer:重新指定審查代碼的人
Commandeer Revision:字面意思是將這個Revision據(jù)為己有的意思,實際上這個時候Reviewer的身份已經(jīng)變?yōu)镺wner的身份了,不能再進行Review了,但是Comment還是可以的
Add Reviewer:添加審查人
Add Subscribers:添加訂閱者,CC
做為 作者,可進行的操作有:
Comment:說點什么。可以針對某行代碼進行評論,直接點擊行號即可
Abandon Revision:廢除版本。廢除后,這個版本就不需要再審核了
Plan Changes:計劃變更,我自己發(fā)現(xiàn)了一些問題或者需求有變,正在改
Add Reviewer:添加其它審查人(除當前審查人外)
Add Subscribers:添加訂閱者,CC
-
Arcanist - 命令交互
我們用這個工具提交變更和審查請求,對變更做出更改,或者在通過審查后發(fā)布到遠程倉庫分支中。
常用的命令有:
arc diff:發(fā)送變更詳情和審查請求
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:靜態(tài)代碼檢查
arc unit:單元測試
與其它工具交互:
arc upload:上傳文件
arc download:下載文件
arc paste:創(chuàng)建和查看剪貼
還有一些高級功能:
arc call-conduit:執(zhí)行 Conduit 方法
arc liberate:創(chuàng)建或更新 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 等信息,在創(chuàng)建完成后即可使用。如果沒有什么特殊的需求,不需要進行特別的配置,這里列舉兩種你可能遇到的打算開始使用 Phabricator 時的場景:
1、代碼之前由 GitHub 或其它托管,現(xiàn)在我需要把之前的代碼導入
點擊 Manage Repository ,點擊左側 URIs,點擊 Add New URI,填寫GitHub或其它托管系統(tǒng)對應倉庫的 URI , I/O Type 選擇 Observe,點擊 Create Repository URI 添加新的 URI 。
在添加完新的 URI 后,你還需要點擊 Set Credential 設置訪問新的 URI 的認證方式。
如果你打算此時就開始使用 Phabricator ,請務必通知你的團隊,暫停一下,不要再向GitHub等提交代碼。如果你的 GitHub 等也設置了代碼審查,請督促相關人員完成代碼審查流程。
稍等片刻,待 Phabricator 同步完之前的代碼后,編輯你添加的 GitHub 或其它代碼托管系統(tǒng)的 URI ,務必修改 I/O Type:
1)如果你不再需要使用之前的托管系統(tǒng),選擇 No I/O
2)如果你想繼續(xù)把代碼備份到之前的代碼托管系統(tǒng),選擇 Mirror,這時, Phabricator 代碼倉庫的變更會覆蓋推送到之前的代碼托管系統(tǒng)
如果你不修改 I/O Type,向 Phabricator 代碼倉庫提交代碼會失敗,因為是只讀的。
當然,對于導入之前的代碼,還有別的方式,例如直接把本地的代碼再次向 Phabricator 代碼倉庫再提交一次。
2、開始一個新的項目,創(chuàng)建一個新的倉庫
參考第1種場景,在 Phabricator 創(chuàng)建代碼倉庫。如果你希望把代碼備份到其它的托管系統(tǒng),只需要添加對應的 URI,并且把 I/O Type 選為 Mirror。
- 把你本地的Git遠程URL設置為Phabricator上代碼倉庫地址
git remote set-url 遠程名稱 新的url
- 安裝Arcanist
https://secure.phabricator.com/book/phabricator/article/arcanist_quick_start/
- 配置Project信息
在你項目代碼的根目錄下,創(chuàng)建 .arcconfig 文件,內容如下:
{
"phabricator.uri" : "你Phabricator系統(tǒng)訪問URL"
}
Windows系統(tǒng)下,創(chuàng)建類似這種文件名的文件可能很麻煩,可以使用這條命令創(chuàng)建:
arc set-config phabricator.uri "你Phabricator系統(tǒng)訪問URL"
Windows系統(tǒng)下,還需要配置 Editor ,詳情參考:
https://secure.phabricator.com/book/phabricator/article/arcanist_windows/
Arcanist 使用可參考:
https://secure.phabricator.com/book/phabricator/article/arcanist_quick_start/
https://secure.phabricator.com/book/phabricator/article/arcanist/
在進行完基本的配置和安裝后,可以開始 Code Review 了。
寫代碼
當然,不只是代碼可以被審查,圖標等資源文件的變更也可以被審查。提交審查請求(arc diff)
一般情況下,我們直接使用arc diff
即可,默認情況下,Arcanist 會把本地分支的 HEAD 與遠程對應分支的 HEAD 進行對比,并生成差異對比發(fā)送到 Phabricator。當你所做的修改沒有 commit 時,會提示你進行 commit。
在一些情況下,我們并不希望與本地分支的 HEAD 進行比較,假設想要與上次的 commit 比較,上次 commit id 是 8ffc88dc05d31fffd28e3ff1129d1b8c321dffff,那么我們需要在arc diff
后把這個 id 加上:arc diff 8ffc88dc05d31fffd28e3ff1129d1b8c321dffff
。
執(zhí)行這條命令時我們需要按照模板填寫title(必填),summary(必填),Test Plan(必填,沒有可寫 N/A 之類的標識),Reviewers(必填,且必須為真實有效的用戶名),Subscribers(可選),填寫完成后關閉編輯器,Arcanist會自動提交審查請求。審查(Differential)
做為 審查人,需要在 Differential 工作臺完成代碼審查工作,上面已經(jīng)介紹了 Differential,這里就不再多說了。(審查通過后)合并提交(arc land)
做為 作者,在代碼審查通過后,需要使用arc land
把變更發(fā)布到遠程分支。
注意,在首次執(zhí)行這條命令前(不一定非要到這個步驟,可以是這個步驟前的任意時刻,例如開始寫代碼前),建議請使用git branch -u 遠程名稱/遠程分支名稱
把本地的分支與遠程分支相關聯(lián),否則,在執(zhí)行完arc land
后,本地分支會被刪除。如果你不想這樣做,又需要保留現(xiàn)在分支的話,請使用arc land --keep-branch
。
默認情況下,Arcanist 會把變更推送到與本地分支相關聯(lián)的遠程分支,你可以使用 * --remote * 和 * --onto * 參數(shù)推送到你想要的遠程和遠程分支。
關于arc land
的詳細說明,可使用arc land --help
查看。
0x70 與GitHub集成
這里的“集成”其實說的很心虛,因為在使用 Phabricator 后,GitHub 已經(jīng)變?yōu)橐粋€文件存儲服務器了。常見的使用情況已經(jīng)在 ** 0x63 配置進行Code Review ** 的 ** 配置代碼倉庫(Diffusion)** 中寫出,所以你懂的。
0x80 與Jenkins集成
在很久很久以前,我已經(jīng)搭建了 Jenkins 用于自動構建,所以這次把 Phabricator 與 Jenkins 做了集成。
在 Jenkins 中安裝完插件:* Phabricator Differential Plugin * 后,請參考這篇文章:
https://github.com/uber/phabricator-jenkins-plugin#phabricator-jenkins-plugin--
0x90 結束語
從配置完到開始試用已經(jīng)有一個月左右,期間遇到了各種問題。經(jīng)歷了這些問題的洗禮,算是對 Phabricator 使用入門了吧。
這篇文章時隔多日才完成,盡管我想把每個細節(jié)寫的詳盡,但是記憶總是像被蟲蛀過的木頭,難免有些疏漏。加之文筆水平有限,各位就湊合著看吧。
在安裝和使用過程中遇到的問題,歡迎各位評論交流。
0xA0 Q/A
1、如何強制用戶 Code Review?
再次強調一下前提:在開始 Code Review 流程前,請先確認團隊成員的git remote url已經(jīng)切換為Phabricator上對應倉庫地址。
強制用戶Code Review,需要創(chuàng)建Herald Rule。在創(chuàng)建時,New Rule for 選:Commit Hook: Commit Content.;Rule Type選:Global,或者根據(jù)自己需要選擇;Conditions中是組合條件,可以根據(jù)自己需要指定一些條件;Action 指定當前情況符合你指定的條件組合時執(zhí)行的動作。示例如圖:
示例中定義了以下規(guī)則:在向develop分支提交代碼時,所提交的代碼必須是通過 Code Review 流程審查通過的,否則會被拒絕;除非 Commit Message 中包含字符 @bypass-review 。
指定 Commit Message 中包含字符 @bypass-review 這種例外情況,主要考慮到在緊急修復一些問題,沒時間等待審查時使用。
當提交被拒絕時,如圖: