git fabric 1.0.0 官方源码进行编译,生成 docker images(rc2 版本2017年6月26日)

系统环境:centos 7 64位
docker
docker-compose

不要使用 centos yum 仓库带的 docker,版本过低。
安装docker 官方的repo 里面的版本

$ sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF

yum update

yum install docker-engine

systemctl enable docker

systemctl restart docker

一.添加 fabric 用户和设置存放源码的目录

useradd fabric
# 建立如下项目目录.
mkdir /home/fabric/fabric

二.安装 go 的开发环境和必须的组件

以 root 用户安装

wget https://storage.googleapis.com/golang/go1.8.1.linux-amd64.tar.gz

tar -xzvf go1.8.1.linux-amd64.tar.gz

mv ./go  /usr/local

//修改 etc/profile,增加 一下内容
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin

source /etc/profile
#安装后,确认 go 1.8 安装成功
go version
go version go1.8 darwin/amd64

#如果无法科学上网,使用如下步骤:
# 1. 以 root安装 gopm
    export GOPATH=/usr/local
    go get -u github.com/gpmgo/gopm
    #确认在/usr/local/bin 目录下有 gopm
# 2. 以 fabric 用户,通过 gopm 安装 goimports
    export GOPATH=/home/fabric/fabric
    gopm get -g -d golang.org/x/tools/cmd/goimports
    #再使用 go install 安装 goimports
    go install golang.org/x/tools/cmd/goimports
    #确认在/home/fabric/fabric/bin 目录下有 goimports

以 fabric 用户 安装 gocov

GOPATH=/home/fabric/fabric
gopm get -g -d golang.org/x/tools/cover
gopm get -g -d github.com/axw/gocov/gocov
go install github.com/axw/gocov/gocov
# 确认 /home/fabric/fabric/bin 目录下有 gocov

安装 gocov-xml

GOPATH=/home/fabric/fabric
gopm get -g -d github.com/AlekSi/gocov-xml
go install github.com/AlekSi/gocov-xml
#确认 /home/fabric/fabric/bin 目录下有 gocov-xml

三. 安装其他必须的组件

以 root 用户安装

#centos 下需要安装
yum install   -y gcc libtool libltdl-dev libtool-ltdl-devel openssl

四.设置fabric环境变量

vim ~/.bashrc
export GOPATH=/home/fabric/fabric
# 使得环境变量生效
source ~/.bashrc

五.进入项目目录

cd $GOPATH

六. 建立 go 源码目录结构(一定要建立 src/github.com/hyperledger ,否则无法使用 go 进行编译)

cd $GOPATH
mkdir -p src/github.com/hyperledger

七.拉取 fabric 的源码

cd $GOPATH/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric.git

八.编译生成 protoc-gen-go

#编译生成 protoc-gen-go 
cd $GOPATH
gopm get -g -d github.com/golang/protobuf/protoc-gen-go
go install github.com/golang/protobuf/protoc-gen-go
#确认在$GOPATH/bin出现protoc-gen-go执行文件

九. 编译 fabric docker 环境

cd $GOPATH/src/github.com/hyperledger/fabric
make docker

如果出现 Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock 这个错误。
解决方案:
1. 把 fabric 用户加入到 sudo 组
a. 以 root 用户登录
b. vim /etc/sudoers
c. 增加 fabric ALL=(ALL) ALL 一行到root ALL=(ALL) ALL下面
2. sudo usermod -a -G docker $USER
3. newgrp - docker
4. newgrp - groups ${USER} | cut -d' ' -f1
参考:
https://techoverflow.net/2017/03/01/solving-docker-permission-denied-while-trying-to-connect-to-the-docker-daemon-socket/

十.如果出现文件或者命令没找到的错误,复制go 的相关文件到 fabric 编译环境

cp $GOPATH/bin/protoc-gen-go $GOPATH/src/github.com/hyperledger/fabric/build/docker/gotools/bin/ 

cp $GOPATH/bin/gocov $GOPATH/src/github.com/hyperledger/fabric/build/docker/gotools/bin/ 

十一.编译 fabric ca 环境

cd /root
git clone https://github.com/hyperledger/fabric-ca.git
cd fabric-ca
make docker

十二. 部署和测试 e2e 应用

一键启动
cd $GOPATH/src/github.com/hyperledger/fabric/examples/e2e_cli
./network_setup.sh up mytestchannel

A. 生成配置文件

cd $GOPATH/src/github.com/hyperledger/fabric
make configtxgen

B. 执行后,控制台的输出内容如下:

build/bin/configtxgen
CGO_CFLAGS=" " GOBIN=/root/fabric/src/github.com/hyperledger/fabric/build/bin go install -tags "nopkcs11" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.0.0-snapshot-eba4a20 -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.3.0 -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/common/configtx/tool/configtxgen
Binary available as build/bin/configtxgen

C. Run the generateCfgTrx.sh shell script

cd $GOPATH/src/github.com/hyperledger/fabric/examples/e2e_cli
./generateCfgTrx.sh  mytestchannel

D.控制台输出

[root@fabric e2e_cli]# ./generateCfgTrx.sh  mytestchannel
Channel name - mytestchannel

Building configtxgen
build/bin/configtxgen
CGO_CFLAGS=" " GOBIN=/root/fabric/src/github.com/hyperledger/fabric/build/bin go install -tags "nopkcs11" -ldflags "-X github.com/hyperledger/fabric/common/metadata.Version=1.0.0-snapshot-eba4a20 -X github.com/hyperledger/fabric/common/metadata.BaseVersion=0.3.0 -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/common/configtx/tool/configtxgen
Binary available as build/bin/configtxgen
Generating genesis block
2017/04/19 16:14:03 Loading configuration
2017/04/19 16:14:03 Looking for configtx.yaml in: /root/fabric/src/github.com/hyperledger/fabric/common/configtx/tool
2017/04/19 16:14:03 Found configtx.yaml there
2017/04/19 16:14:03 Checking for MSPDir at: .
2017/04/19 16:14:03 Checking for MSPDir at: .
2017/04/19 16:14:03 Checking for MSPDir at: .
2017/04/19 16:14:03 Generating genesis block
2017/04/19 16:14:03 Writing genesis block
Generating channel configuration transaction
2017/04/19 16:14:03 Loading configuration
2017/04/19 16:14:03 Looking for configtx.yaml in: /root/fabric/src/github.com/hyperledger/fabric/common/configtx/tool
2017/04/19 16:14:03 Found configtx.yaml there
2017/04/19 16:14:03 Checking for MSPDir at: .
2017/04/19 16:14:03 Checking for MSPDir at: .
2017/04/19 16:14:03 Checking for MSPDir at: .
2017/04/19 16:14:03 Generating new channel configtx
2017/04/19 16:14:03 Creating no-op MSP instance
2017/04/19 16:14:03 Obtaining default signing identity
2017/04/19 16:14:03 Creating no-op signing identity instance
2017/04/19 16:14:03 Serialinzing identity
2017/04/19 16:14:03 signing message
2017/04/19 16:14:03 signing message
2017/04/19 16:14:03 Writing new channel tx

E.启动 fabric 网络

先把make 出的 image 进行 tag 到 latest

docker tag hyperledger/fabric-orderer:x86_64-1.0.0-snapshot-<xxxxxxx> hyperledger/fabric-orderer

docker tag hyperledger/fabric-peer:x86_64-1.0.0-snapshot-<xxxxxxx> hyperledger/fabric-peer

然后启动 docker 容器

cd $GOPATH/src/github.com/hyperledger/fabric/examples/e2e_cli

CHANNEL_NAME=mytestchannel docker-compose up -d

十三.问题的解决

A.在 mac os 下出现如下错误:

Error processing tar file(bzip2 data invalid: bad magic value in continuation file): 

解决办法 ,更新gnu-tar

brew install gnu-tar --with-default-names

B. 在 mac os 下出现’ltdl.h’ file not found错误

brew install libtool openssl

C. 出现goimports: command not found错误

make linter
出现如下错误:

LINT: Running code checks..
Checking ./bccsp
./scripts/golinter.sh: line 22: goimports: command not found
make: *** [linter] 错误 127

但是执行$GOPATH/src/github.com/hyperledger/fabric/scripts/golinter.sh
是可以正常执行的

make gotools

#如果无法科学上网,需要使用代理
git config --global http.proxy "192.168.0.50:8016"
git config --global https.proxy "192.168.0.50:8016"

#或者在可以 git 的地方,把 gotools 的源码 git 下来,然后复制到相应目录下

git clone https://go.googlesource.com/tools 
#当前目录下生成 tools 目录,
#把目录复制到$GOPATH/src/github.com/hyperledger/fabric/gotools/build/gopath/src/golang.org/x/目录下。
#重新 make gotools
cd $GOPATH/src/github.com/hyperledger/fabric
make gotools

D. make 过程中出现 IPv4 forwarding is disabled. Networking will not work. 这个警告。

sysctl -w net.ipv4.ip_forward=1
#重启 docker 服务
systemctl restart docker

E. 运行 e2e 例子的时候出现如下错误:

1.无法创建 channel
vim  $GOPATH/src/github.com/hyperledger/fabric/examples/e2e_cli/docker-compose.yaml

#修改 docker-compose.yaml 文件。在 cli 部分增加 host 映射
    extra_hosts:
      - "orderer0:10.211.55.8"
      - "peer0:10.211.55.8"
      - "peer1:10.211.55.8"
      - "peer2:10.211.55.8"
      - "peer3:10.211.55.8"

#修改 script.sh 脚本,进行 peer 的判断,映射端口号:

if [ $1 -eq 0 ]; then
     CORE_PEER_ADDRESS=peer$1:7051
elif [ $1 -eq 1 ]; then
        ORE_PEER_ADDRESS=peer$1:8051
elif [ $1 -eq 2 ]; then
        ORE_PEER_ADDRESS=peer$1:9051
elif [ $1 -eq 3 ]; then
        ORE_PEER_ADDRESS=peer$1:10051
fi

F. 相关知识点

1. git 拉取某个特定版本
git reset --hard <commitlevel号>
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐