之前的部落格都是拿官方現成的Docker映象來用,但是並沒有自己動手做映象,也沒有說到如何去開發和測試Fabric的程式碼。這一篇部落格就從入門的角度講解如何編譯、測試和開發Fabric。
一、環境準備
要進行相關的開發工作,當然第一步是準備好環境,還是老生常談,主要是安裝Docker、安裝Go,下載最新Fabric程式碼等工作。我這裡使用的是VirtualBox裡面安裝的Ubuntu 16.04,如果您使用的不是這個版本,可能有些命令會有所區別。Fabric開發依賴的工具主要還是參考官方文件:http://hyperledger-fabric.readthedocs.io/en/latest/dev-setup/devenv.html
1. 使用VirtualBox並在其中安裝好Ubuntu
這一步其實沒啥好說的,下載好最新版的VirtualBox,下載Ubuntu Server,我用的是Ubuntu16.04.2 X64 Server。我使用的使用者是studyzy,不建議直接在root下執行命令。在安裝完Ubuntu後,需要保證apt source是國內的,不然如果是國外的話會很慢很慢的。具體做法是
sudo vi /etc/apt/sources.list
開啟這個apt源列表,如果其中看到是http://us.xxxxxx之類的,那麼就是外國的,如果看到是http://cn.xxxxx之類的,那麼就不用換的。我的是美國的源,所以需要做一下批量的替換。在命令模式下,輸入:
:%s/us./cn./g
就可以把所有的us.改為cn.了。然後輸入:wq即可儲存退出。
sudo apt-get update
更新一下源。
然後安裝ssh,這樣接下來就可以用putty或者SecureCRT之類的客戶端遠端連線Ubuntu了。
sudo apt-get install ssh
2. Go的安裝
Ubuntu的apt-get雖然提供了Go的安裝,但是版本比較舊,最好的方法還是參考官方網站 https://golang.org/dl/ ,下載最新版的Go。具體涉及到的命令包括:
wget https://redirector.gvt1.com/edgedl/go/go1.9.2.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.9.2.linux-amd64.tar.gz
【注意:不要使用apt方式安裝go,apt的go版本太低了!】
接下來編輯當前使用者的環境變數:
vi ~/.profile
新增以下內容:
export PATH=$PATH:/usr/local/go/bin export GOROOT=/usr/local/go export GOPATH=$HOME/go export PATH=$PATH:$HOME/go/bin
編輯儲存並退出vi後,記得把這些環境載入:
source ~/.profile
我們把go的目錄GOPATH設定為當前使用者的資料夾下,所以記得建立go資料夾
cd ~
mkdir go
執行以下命令檢視當前go的版本,如果能夠顯示go版本,那麼說明我們的go安裝成功.
go version
3. Docker安裝
我們可以使用阿里提供的映象,安裝也非常方便,參考:https://yq.aliyun.com/articles/110806 ,其中Ubuntu的指令碼是:
# step 1: 安裝必要的一些系統工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-common # step 2: 安裝GPG證照 curl -fsSL http://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo apt-key add - # Step 3: 寫入軟體源資訊 sudo add-apt-repository "deb [arch=amd64] http://mirrors.aliyun.com/docker-ce/linux/ubuntu $(lsb_release -cs) stable" # Step 4: 更新並安裝 Docker-CE sudo apt-get -y update sudo apt-get -y install docker-ce
安裝完成後需要修改當前使用者(我使用的使用者叫studyzy)許可權:
sudo usermod -aG docker studyzy
登出並重新登入,然後新增阿里雲的Docker Hub映象:
sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' { "registry-mirrors": ["https://obou6wyb.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker
不同的版本新增方法是不一樣的,官方的文件如下:
https://cr.console.aliyun.com/#/accelerator
當然覺得阿里雲映象不好用,喜歡用DaoClound的也可以用DaoClound的映象。DaoCloud的映象設定文件為:https://www.daocloud.io/mirror#accelerator-doc
4. Docker-Compose的安裝
Docker-compose是支援通過模板指令碼批量建立Docker容器的一個元件。
然後是安裝docker-compose,我們從官方網站(https://github.com/docker/compose/releases)下載,執行指令碼:
sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose sudo chmod +x /usr/local/bin/docker-compose
5.Pip的安裝
Pip是基於Python的一個工具,需要安裝Python-pip,執行指令碼:
sudo apt-get install python-pip
這個指令碼會安裝Pip所依賴的Python和各種庫,所以安裝pip完畢後我們也有了Python的環境。執行以下命令可以檢查pip和Python的版本:
pip –V
apt安裝的版本可能不夠新,我們使用以下命令可以更新pip版本:
pip install --upgrade pip
6. Go Tools安裝
Fabric使用GO開發,其中用到了一些官方或者第三方的工具,我們也需要下載。尤其是golang的網址被牆了,我們只有訪問GitHub的映象。
mkdir –p $GOPATH/src/golang.org/x cd $GOPATH/src/golang.org/x git clone https://github.com/golang/tools.git
等tools下載完畢,我們可以執行以下命令來安裝Fabric可能用到的Go工具:
go get github.com/kardianos/govendor go get github.com/golang/lint/golint go get golang.org/x/tools/cmd/goimports go get github.com/onsi/ginkgo/ginkgo go get github.com/axw/gocov/... go get github.com/client9/misspell/cmd/misspell go get github.com/AlekSi/gocov-xml go get github.com/golang/protobuf/protoc-gen-go
7. 第三方庫安裝
Fabric依賴的第三方庫裡面,有些庫又依賴了其他庫,而這些庫是需要我們先手動準備好的。比如libltdl-dev,這是PKCS11用到的一個庫,我們需要安裝:
sudo apt-get install libltdl-dev
8. Fabric原始碼下載
我們可以使用Git命令下載原始碼,首先需要建立對應的目錄,然後進入該目錄,Git下載原始碼:
mkdir -p ~/go/src/github.com/hyperledger cd ~/go/src/github.com/hyperledger git clone https://github.com/hyperledger/fabric.git
等Fabric下載完畢後,我們就切換到Fabric原始碼的資料夾:
cd ~/go/src/github.com/hyperledger/fabric
二、編譯Fabric
編譯Fabric的程式碼主要是通過make命令來完成,因為官方已經寫好了完整的Makefile,所以我們要編譯各個Fabric的元件還是比較簡單的。關於make的基礎知識,可以參考這篇部落格:http://www.ruanyifeng.com/blog/2015/02/make.html
下面我們就分步驟來編譯Fabric。
1.Orderer節點的編譯
Orderer節點容器裡面執行的是orderer服務,我們要生成Orderer映象,就需要先編譯出Orderer程式。執行:
make orderer
這是我在CLI下執行的結果:
studyzy@ubuntu1:~/go/src/github.com/hyperledger/fabric$ make orderer build/bin/orderer CGO_CFLAGS=" " GOBIN=/home/studyzy/go/src/github.com/hyperledger/fabric/build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.0.6-snapshot-a8728bc -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.3.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger" github.com/hyperledger/fabric/orderer Binary available as build/bin/orderer
從日誌可以看出,Orderer編譯完成後,會把二進位制檔案放在build/bin/orderer。
2.Peer節點的編譯
Peer節點的編譯會比Orderer複雜很多,因為牆的原因,我們需要做一些額外的操作。另外鏈碼是執行在Peer所在的機器上,所以需要給ChainCode準備執行基礎環境,也就是ccenv和javaenv兩個映象。在make peer之前我們必須先保證本地沒有對應的映象檔案,如果有,那麼就用docker rmi命令刪除之前下載或者編譯好的映象。
還記得前面下載的Go Tools嗎,這裡需要copy到Fabric目錄裡面來:
mkdir -p build/docker/gotools/bin cp ~/go/bin/* build/docker/gotools/bin
以上操作純粹是為了繞開牆,如果你本身不存在牆的問題,那麼完全可以不用如此多此一舉。
接下來直接執行以下命令即可編譯生成Peer節點的Docker映象:
make peer
執行該命令後,系統首先會下載hyperledger/fabric-baseimage:x86_64-0.3.2這個映象到本地,這是所有Fabric映象的基礎映象檔案。
下載後會從官網下載chaintool的jar包,下載地址:https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/chaintool-1.0.0/hyperledger-fabric-chaintool-1.0.0.jar
這個地址沒有被牆,一般來說是能夠正常下載下來的。
下載chaintool完畢後,接下來就開始建立fabric-ccenv映象。所有建立Docker映象都是基於Dockerfile,我們可以在Fabric目錄下的images資料夾看到所有Fabric映象Build的步驟配置。
在建立fabric-ccenv映象後,接下來是建立java版ChainCode的基礎映象,也就是fabric-javaenv,最後才是build peer程式,執行成功後看到的日誌大概是這樣的:
…… Successfully built b8f69c7b3c4c Successfully tagged hyperledger/fabric-javaenv:latest docker tag hyperledger/fabric-javaenv hyperledger/fabric-javaenv:x86_64-1.0.6-snapshot-a8728bc build/bin/peer CGO_CFLAGS=" " GOBIN=/home/studyzy/go/src/github.com/hyperledger/fabric/build/bin go install -tags "" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.0.6-snapshot-a8728bc -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.3.2 -X github.com/hyperledger/fabric/common/metadata.BaseDockerLabel=org.hyperledger.fabric -X github.com/hyperledger/fabric/common/metadata.DockerNamespace=hyperledger -X github.com/hyperledger/fabric/common/metadata.BaseDockerNamespace=hyperledger" github.com/hyperledger/fabric/peer Binary available as build/bin/peer
3.Fabric 工具編譯
Fabric除了Orderer和Peer外,還為我們提供了幾個很方便的工具,在搭建Fabric網路時我們就用到過。那就是:
- configtxgen
- cryptogen
- configtxlator
這三個工具的編譯也很簡單,直接執行以下命令即可:
make configtxgen make cryptogen make configtxlator
4.Docker映象的生成
前面三步只是生成了Fabric的二進位制檔案,我們並不能直接使用,而是需要分別將這些二進位制檔案打包到Docker映象中。所以我們接下來需要Build Docker Image。
要生成Orderer映象,那麼需要執行命令:
make orderer-docker
由於沒有網路檔案的依賴,所以這時應該很快就能完成。然後我們繼續生成Peer映象:
make peer-docker
再然後是客戶端,也就是fabric-tools,對應的命令是:
make tools-docker
以上3個最重要的映象生成完成,我們可以用
docker images
檢視當前的映象列表:
5.其他Docker映象的編譯
除了上面我們看到的這些映象外,實際上我們可能還會用到CouchDB做狀態資料庫,用Kafka做共識,用Zookeeper做Kafka的高可用支援,這些工具都有對應的Docker映象,我們仍然可以使用make命令來生成他們。
執行以下命令,系統會給我們生成一整套的Fabric映象:
make docker
這裡一般來說沒什麼坑,主要是從網上下載一些包下來,會花一些時間。完成後,我們仍然執行
docker images
可以看到我們生成的所有Fabric映象:
三、總結
如果沒有牆的存在,那麼我們編譯和生成Fabric映象將非常簡單,直接一個make all命令即可。可惜因為牆的存在,所以有些地方需要特殊處理。下一篇部落格我會講到如何執行Fabric中的測試程式碼。只要我們能夠自己編譯Fabric,能夠跑Fabric的Test,那麼我們就可以很方便的對Fabric程式碼進行修改,並驗證我們的修改,更進一步我們就可以將自己的程式碼提交到社群,為Fabric的壯大添磚加瓦。
最後再補充一句,如果我們對之前生成的映象不滿意,對程式碼進行調整後需要重新生成,可以使用
make clean
命令刪除之前make的所有東西。然後重新執行make命令編譯Fabric。