之前的博客都是拿官方現成的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。
文章列表