文章出處

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

查看當前的鏡像列表:

image

5.其他Docker鏡像的編譯

除了上面我們看到的這些鏡像外,實際上我們可能還會用到CouchDB做狀態數據庫,用Kafka做共識,用Zookeeper做Kafka的高可用支持,這些工具都有對應的Docker鏡像,我們仍然可以使用make命令來生成他們。

運行以下命令,系統會給我們生成一整套的Fabric鏡像:

make docker

這里一般來說沒什么坑,主要是從網上下載一些包下來,會花一些時間。完成后,我們仍然運行

docker images

可以看到我們生成的所有Fabric鏡像:

image

三、總結

如果沒有墻的存在,那么我們編譯和生成Fabric鏡像將非常簡單,直接一個make all命令即可。可惜因為墻的存在,所以有些地方需要特殊處理。下一篇博客我會講到如何運行Fabric中的測試代碼。只要我們能夠自己編譯Fabric,能夠跑Fabric的Test,那么我們就可以很方便的對Fabric代碼進行修改,并驗證我們的修改,更進一步我們就可以將自己的代碼提交到社區,為Fabric的壯大添磚加瓦。

最后再補充一句,如果我們對之前生成的鏡像不滿意,對代碼進行調整后需要重新生成,可以使用

make clean

命令刪除之前make的所有東西。然后重新執行make命令編譯Fabric。


文章列表


不含病毒。www.avast.com
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()