2017-09-04

版权声明:本文为博主原创文章,转载注明“龙棠博客”字样和原文链接。

软件硬件环境

  • Windows10 x64
  • ThinkPad T450 12G + 500G SSD

说明

  • vagrant 构建虚拟开发环境的工具
  • Chocolatey Windows包管理软件
  • Cygwin是一个在windows平台上运行的类UNIX模拟环境
  • git 版本控制软件

步骤

#以管理员权限打开Powershell【在title栏有管理员字样】,输入Get-ExecutionPolicy返回可能为 Restricted
PS C:\> Get-ExecutionPolicy
Restricted

#重新设置策略,输入Set-ExecutionPolicy AllSigned,Set-ExecutionPolicy Bypass
PS C:\Windows\system32> Set-ExecutionPolicy AllSigned

执行策略更改
执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 http://go.microsoft.com/fwlink/?LinkID=135170
中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“N”): Y
PS C:\Windows\system32> Set-ExecutionPolicy Bypass

执行策略更改
执行策略可帮助你防止执行不信任的脚本。更改执行策略可能会产生安全风险,如 http://go.microsoft.com/fwlink/?LinkID=135170
中的 about_Execution_Policies 帮助主题所述。是否要更改执行策略?
[Y] 是(Y)  [A] 全是(A)  [N] 否(N)  [L] 全否(L)  [S] 暂停(S)  [?] 帮助 (默认值为“N”): Y

#安装Chocolatey【具体方法可以百度反正要把这个装起来】
#Powershell执行以下
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1'))
#安装完Chocolatey后就可以使用其命令安装Windows软件

#Vagrant和virtualbox
>cinst vagrant virtualbox

#安装Cygwin
>cinst cyg-get

#使用Cyg在Prowershell中安装其他软件
>cyg-get gnupg
>cyg-get openssh
>cyg-get rsync
>cyg-get ncurses
>cyg-get git
>cyg-get python
>cyg-get make
>cyg-get python-sphinx

#安装目录
C:\ProgramData\chocolatey
C:\ProgramData\chocolatey\lib\Cygwin

#Cygwin中执行【Cygwin有专用终端】
$/usr/bin/easy_install-2.7 pip
$pip install sphinx_rtd_theme

#Windows上安装golang的sdk下载msi安装设置系统变量GOPATH

#Cygwin里面测试go env
$ go env
set GOARCH=amd64
set GOBIN=
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=
set GORACE=
set GOROOT=C:\Go
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set CC=gcc
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\tools\cygwin\tmp\go-build558394994=/tmp/go-build -gno-record-gcc-switches
set CXX=g++
set CGO_ENABLED=1

Windows开发环境实质

#windows开发环境实质上是fabric,fabric-ca,fabric-sdk-java代码存放于windows上,编译打包制作docker镜像在virtualbox的ubuntu里面
#通过vagrant脚本【源码内】将windows目录映射到ubuntu目录

#获取源码,可以从github获取,可以用Linux Foundation ID从Hyperledger的Gerrit下载
#笔者使用git windows工具从gerrit下载,然后使用JetBrains的Goland构建项目,fabric-sdk-java使用IDEA构建项目
#三个源码目录最好在一个硬盘后续需要使用相对路径,fabric,fabric-ca最好同级目录

#Cygwin终端内执行,进行fabric的devenv目录
cd fabric/devenv

#devenv目录内含有fabric-sdk-java目录可以在这个目录内放置fabric-sdk-java项目源码,或者后续通过相对路径引入
#此时fabric,fabric-ca处于同级目录,fabric-sdk-java为fabric/devenv的子目录【或者其它目录】

#cgywin内宿主机磁盘挂在cygdriver内
$ df -h
文件系统         容量  已用  可用 已用% 挂载点
C:/tools/cygwin  100G   61G   40G   61% /
D:               366G  111G  256G   31% /cygdrive/d

#编辑vagrant脚本【fabric/devenv内】,脚本配置了宿主机【我的win10】和客户机【ubuntu】的路径映射管理和端口映射
config.vm.network :forwarded_port, guest: 9000, host: 9000, id: "portainer", host_ip: "localhost", auto_correct: true # Portainer service

# 映射端口至宿主机后续,可以在window上进行用例测试等操作
# mapping ports for fabric-sdk-java development
  config.vm.network :forwarded_port, guest: 7056, host: 7056, id: "java7056", host_ip: "localhost", autocorrect: true
  config.vm.network :forwarded_port, guest: 7058, host: 7058, id: "java7058", host_ip: "localhost", autocorrect: true
  config.vm.network :forwarded_port, guest: 8051, host: 8051, id: "java8051", host_ip: "localhost", autocorrect: true
  config.vm.network :forwarded_port, guest: 8053, host: 8053, id: "java8053", host_ip: "localhost", autocorrect: true
  config.vm.network :forwarded_port, guest: 8054, host: 8054, id: "java8054", host_ip: "localhost", autocorrect: true
  config.vm.network :forwarded_port, guest: 8056, host: 8056, id: "java8056", host_ip: "localhost", autocorrect: true
  config.vm.network :forwarded_port, guest: 8058, host: 8058, id: "java8058", host_ip: "localhost", autocorrect: true

#将客户机9000端口映射到宿主机9000,portainer为docker的WEB管理工具,这样在宿主机访问localhost:9000就可以访问到虚拟机

#笔者修改,将相对fabric/devenv目录的fabric-sdk-java映射到客户机的devenv里,同时在宿主机的maven仓库映射到客户机
================================================================================================
# Fabric-sdk-java路径映射
  config.vm.synced_folder "../../../../../../fabric-sdk-java",
    "/opt/gopath/src/github.com/hyperledger/fabric/devenv/fabric-sdk-java"
  config.vm.synced_folder "../../../../../../fabric-sdk-java/src/test/fixture/sdkintegration",
    "/opt/gopath/src/github.com/hyperledger/fabric/sdkintegration"
# Map local maven repository to virtual machine
  config.vm.synced_folder "../../../../../../../02maven_repo", "/home/ubuntu/.m2/repository"
================================================================================================ 

#启动虚拟机,在cygwin终端内devenv目录下执行
$vagrant up

#如果后续创建成功,但是第二使用时,它没有启动第一次创建的虚拟机,而是重新创建了,关闭cyg终端,再新开重新up

#该命令会启动virtualbox下载Vagrantfile内配置的虚拟机镜像ubuntu/xenial64,启动后执行devenv/setup.sh脚本
#此时可以Ctrl+C取消因为我们可以调整一下setup.sh脚本,加速构建

#以下针对v1.0.2,主要进行客户机构建加速,如果网速很好可跳过
#国内软件源,在20行,apt-get update之前添加
# Config china software source mirror
cat >/etc/apt/sources.list <<EOF
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
EOF

#docker安装调整,安装docker-ce 17.06.2-ce
apt-get install -y apt-transport-https ca-certificates curl software-properties-common
add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu xenial stable"
apt-get update -qq
apt-get install -y --allow-unauthenticated linux-image-extra-$(uname -r) apparmor docker-ce

#原67行
# Install docker-compose
#curl -L https://github.com/docker/compose/releases/download/1.8.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# Install from my VPS
curl -L http://54.193.56.94/download/docker-compose-Linux-x86_64 > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose


#原73,74行之间新增如下,docker加速
# Config china mirror
cat >/etc/docker/daemon.json <<EOF
{"registry-mirrors": ["http://0503c5a1.m.daocloud.io"]}
EOF


#原84行
#GO_URL=https://storage.googleapis.com/golang/go${GO_VER}.linux-amd64.tar.gz

# Install from my VPS
GO_URL=http://54.193.56.94/download/go1.7.5.linux-amd64.tar.gz


#原105行
#NODE_URL=https://nodejs.org/dist/v$NODE_VER/node-v$NODE_VER-linux-x64.tar.gz

# Install from my VPS
NODE_URL=http://54.193.56.94/download/node-v6.9.5-linux-x64.tar.gz


#原119行
#wget https://services.gradle.org/distributions/gradle-2.12-bin.zip -P /tmp --quiet

# Install from my VPS
wget http://54.193.56.94/download/gradle-2.12-bin.zip -P /tmp

#上述步骤中在setup.sh Line 136 make clean gotools 会导致失败,可以直接vagrant ssh进去手动执行后面几个
#失败原因编译gotools依赖部分包需要从google下载,如果网络不可导编译失败,后续脚本停止执行

构建镜像

#客户机启动后,在cgywin终端内连接客户机
#devenv目录
vagrant ssh

Liu@DESKTOP-AFIQ8P3 /cygdrive/d/01workspace/hyperledger-rc1/src/github.com/hyperledger/fabric/devenv
$ vagrant ssh
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-93-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


Last login: Mon Sep  4 09:38:39 2017 from 10.0.2.2
ubuntu@hyperledger-devenv:e43b68f:/opt/gopath/src/github.com/hyperledger/fabric$
ubuntu@hyperledger-devenv:e43b68f:/opt/gopath/src/github.com/hyperledger/fabric$

#构建docker镜像,客户机内安装make等构建环境,在客户机fabric目录执行
$make docker

#可能会构建失败,首先make的是fabric/gotools内的Makefile但是其依赖某个go包并未在项目内
#整个fabric的vendor是不能作用到到gotools或者说可能是部分包缺失
#上述报错可能为lint包缺失golang.org/x/tools/go/gcexportdata,这个包在fabric的vendor内是没有的

#解决方法VPN下载放进去,把缺失的包直接放置到fabirc/gotools/build/gopath/src内和github.com同级,【可以直接在宿主机拷贝】
#在gotools目录执行make,会在gotool/gopath/bin生成可执行文件,后续需要拷贝到其它目录

#继续在fabric目录执行make docker会报错缺失protoc-gen-go等文件,直接将上述gotools编译的bin下文件拷贝到对应ben文件
#主要有/fabric/build/docker/bin,/fabric/build/docker/gotools/bin
#理论上如果直接可以获取到gcexportdata,在fabirc下执行make docker会在fabric/build目录的子目录内构件gotools

#构件过程中会下载基础镜像fabric-baseimage等,所以之前设置了docker加速器

#构件结果
ubuntu@hyperledger-devenv:e43b68f:/opt/gopath/src/github.com/hyperledger/fabric$ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
hyperledger/fabric-ca          latest              bf6030ff7463        25 hours ago        238MB
hyperledger/fabric-ca          x86_64-1.0.2        bf6030ff7463        25 hours ago        238MB
hyperledger/fabric-tools       latest              b9e0850e6572        28 hours ago        1.33GB
hyperledger/fabric-tools       x86_64-1.0.2        b9e0850e6572        28 hours ago        1.33GB
hyperledger/fabric-couchdb     latest              d380c5dfee6b        28 hours ago        1.47GB
hyperledger/fabric-couchdb     x86_64-1.0.2        d380c5dfee6b        28 hours ago        1.47GB
hyperledger/fabric-kafka       latest              421992b5b155        29 hours ago        1.29GB
hyperledger/fabric-kafka       x86_64-1.0.2        421992b5b155        29 hours ago        1.29GB
hyperledger/fabric-zookeeper   latest              1e3e329122da        29 hours ago        1.3GB
hyperledger/fabric-zookeeper   x86_64-1.0.2        1e3e329122da        29 hours ago        1.3GB
hyperledger/fabric-testenv     latest              fc9f8605bb5d        29 hours ago        1.39GB
hyperledger/fabric-testenv     x86_64-1.0.2        fc9f8605bb5d        29 hours ago        1.39GB
hyperledger/fabric-buildenv    latest              8d62efcecd25        29 hours ago        1.31GB
hyperledger/fabric-buildenv    x86_64-1.0.2        8d62efcecd25        29 hours ago        1.31GB
hyperledger/fabric-orderer     latest              54df4bb6db20        29 hours ago        151MB
hyperledger/fabric-orderer     x86_64-1.0.2        54df4bb6db20        29 hours ago        151MB
hyperledger/fabric-peer        latest              e3b74120eaef        29 hours ago        154MB
hyperledger/fabric-peer        x86_64-1.0.2        e3b74120eaef        29 hours ago        154MB
hyperledger/fabric-javaenv     latest              1ba24601adb0        29 hours ago        1.41GB
hyperledger/fabric-javaenv     x86_64-1.0.2        1ba24601adb0        29 hours ago        1.41GB
hyperledger/fabric-ccenv       latest              4459f200ddb2        30 hours ago        1.28GB
hyperledger/fabric-ccenv       x86_64-1.0.2        4459f200ddb2        30 hours ago        1.28GB
hyperledger/fabric-baseimage   x86_64-0.3.2        c92d9fdee998        9 days ago          1.26GB
hyperledger/fabric-baseos      x86_64-0.3.2        bbcbb9da2d83        9 days ago          129MB
portainer                      1.13.6              96196eaa67b3        2 months ago        10.4MB
kafka                          0.10.2              12453f4efa7b        3 months ago        265MB
kafka                          latest              12453f4efa7b        3 months ago        265MB
hyperledger/fabric-baseos      x86_64-0.3.1        4b0cab202084        3 months ago        157MB

#fabric构件完毕后,在fabric-ca目录内执行make docker

#构件fabric-sdk-java,在开始setup.sh内已经在客户机内安装了jdk,maven,gradle
$vagrant ssh
$cd /opt/gopath/src/github.com/hyperledger/fabric/devenv/fabric-sdk-java
$mvn install

#顺利编译输出,目前fabric-sdk-java还是v1.0.1【截止2017-09-04】
[INFO] Installing /opt/gopath/src/github.com/hyperledger/fabric/devenv/fabric-sdk-java/target/fabric-sdk-java-1.0.1.jar to /home/ubuntu/.m2/repository/org/hyperledger/fabric-sdk-java/fabric-sdk-java/1.0.1/fabric-sdk-java-1.0.1.jar
[INFO] Installing /opt/gopath/src/github.com/hyperledger/fabric/devenv/fabric-sdk-java/pom.xml to /home/ubuntu/.m2/repository/org/hyperledger/fabric-sdk-java/fabric-sdk-java/1.0.1/fabric-sdk-java-1.0.1.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:00 min
[INFO] Finished at: 2017-09-04T21:30:59+08:00
[INFO] Final Memory: 41M/388M
[INFO] ------------------------------------------------------------------------

其它参考

#安装python-sphinx
.\setup-x86_64.exe -q -P python-sphinx

#Chocolatey命令
cinst [packagename] 安装
clist [packagename] 查询程序是否在数据库中

#帮助
PS C:\Windows\system32> choco -h
This is a listing of all of the different things you can pass to choco.

Commands

 * list - lists remote or local packages
 * search - searches remote or local packages (alias for list)
 * info - retrieves package information. Shorthand for choco search pkgname --exact --verbose
 * install - installs packages from various sources
 * pin - suppress upgrades for a package
 * outdated - retrieves packages that are outdated. Similar to upgrade all --noop
 * upgrade - upgrades packages from various sources
 * uninstall - uninstalls a package
 * pack - packages up a nuspec to a compiled nupkg
 * push - pushes a compiled nupkg
 * new - generates files necessary for a chocolatey package from a template
 * sources - view and configure default sources (alias for source)
 * source - view and configure default sources
 * config - Retrieve and configure config file settings
 * feature - view and configure choco features
 * features - view and configure choco features (alias for feature)
 * apikey - retrieves or saves an apikey for a particular source
 * setapikey - retrieves or saves an apikey for a particular source (alias for apikey)
 * unpackself - have chocolatey set it self up
 * version - [DEPRECATED] will be removed in v1 - use `choco outdated` or `cup <pkg|all> -whatif` instead
 * update - [DEPRECATED] RESERVED for future use (you are looking for upgrade, these are not the droids you are looking
for)

#Linux开发环境只需要按照setup.sh, 因为windows开发环境的实质还是Linux开发环境,只是代码存放于windows上

Fabric-sdk-java

#创建两个vagrant ssh

#FIRST:构建测试环境
ubuntu@hyperledger-devenv:e43b68f:/opt/gopath/src/github.com/hyperledger/fabric/sdkintegration
#对应fabric-sdk-java项目目录src/test/fixture/sdkintegration
#该目录内修改.env文件,默认为1.0.1,修改为1.0.2
$docker-compose up
CONTAINER ID        IMAGE                                     COMMAND                  CREATED              STATUS              PORTS                                            NAMES
e77cac2d62e4        hyperledger/fabric-peer:x86_64-1.0.2      "peer node start"        About a minute ago   Up About a minute   0.0.0.0:7056->7051/tcp, 0.0.0.0:7058->7053/tcp   peer1.org1.example.com
a01670d92b08        hyperledger/fabric-peer:x86_64-1.0.2      "peer node start"        About a minute ago   Up About a minute   0.0.0.0:8056->7051/tcp, 0.0.0.0:8058->7053/tcp   peer1.org2.example.com
b7114220bc1b        hyperledger/fabric-peer:x86_64-1.0.2      "peer node start"        About a minute ago   Up About a minute   0.0.0.0:8051->7051/tcp, 0.0.0.0:8053->7053/tcp   peer0.org2.example.com
7e767f05b5b5        hyperledger/fabric-peer:x86_64-1.0.2      "peer node start"        About a minute ago   Up About a minute   0.0.0.0:7051->7051/tcp, 0.0.0.0:7053->7053/tcp   peer0.org1.example.com
81f953933fed        hyperledger/fabric-orderer:x86_64-1.0.2   "orderer"                About a minute ago   Up About a minute   0.0.0.0:7050->7050/tcp                           orderer.example.com
9b7a12985544        hyperledger/fabric-tools:x86_64-1.0.2     "/usr/local/bin/co..."   About a minute ago   Up About a minute   0.0.0.0:7059->7059/tcp                           configtxlator
88dc3f728287        hyperledger/fabric-ca:x86_64-1.0.2        "sh -c 'fabric-ca-..."   About a minute ago   Up About a minute   0.0.0.0:7054->7054/tcp                           ca_peerOrg1
ab5424ab459c        hyperledger/fabric-ca:x86_64-1.0.2        "sh -c 'fabric-ca-..."   About a minute ago   Up About a minute   0.0.0.0:8054->7054/tcp                           ca_peerOrg2
34acae21e4ce        portainer:1.13.6                          "/portainer -H uni..."   37 hours ago         Up 3 hours          0.0.0.0:9000->9000/tcp                           heuristic_haibt

#SECOND:测试
ubuntu@hyperledger-devenv:e43b68f:/opt/gopath/src/github.com/hyperledger/fabric/devenv/fabric-sdk-java
$mvn clean
$mvn install
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ fabric-sdk-java ---
[INFO] Installing /opt/gopath/src/github.com/hyperledger/fabric/devenv/fabric-sdk-java/target/fabric-sdk-java-1.0.1.jar to /home/ubuntu/.m2/repository/org/hyperledger/fabric-sdk-java/fabric-sdk-java/1.0.1/fabric-sdk-java-1.0.1.jar
[INFO] Installing /opt/gopath/src/github.com/hyperledger/fabric/devenv/fabric-sdk-java/pom.xml to /home/ubuntu/.m2/repository/org/hyperledger/fabric-sdk-java/fabric-sdk-java/1.0.1/fabric-sdk-java-1.0.1.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 02:00 min
[INFO] Finished at: 2017-09-05T12:32:25+08:00
[INFO] Final Memory: 39M/378M
[INFO] ------------------------------------------------------------------------

#集成测试End2endIT
$mvn failsafe:integration-test -DskipITs=false
Results :

Tests run: 18, Failures: 0, Errors: 0, Skipped: 2

[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent! The file encoding for reports output files should be provided by the POM property ${project.reporting.outputEncoding}.
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 55.370 s
[INFO] Finished at: 2017-09-05T12:34:03+08:00
[INFO] Final Memory: 14M/174M
[INFO] ------------------------------------------------------------------------

#测试指定用例
$mvn failsafe:integration-test -Dit.test=End2endIT -DskipITs=false

#failsafe补充
Failsafe和maven结合,将整个集成测试分为4个阶段: 
1. pre-integration-test 启动测试环境,比如通过容器插件cargo启动容器,加载应用 
2. integration-test 执行集成测试用例, 
3. post-integration-test 清理测试环境 
4. verify 检测测试结果 

test目录下所有 “/ITCase.Java”,”/IT.java” 和”**/*IT.java” 测试用例

#pom配置
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-failsafe-plugin</artifactId>
    <version>2.19.1</version>
    <configuration>
        <argLine>${failsafeArgLine}</argLine>
        <includes>
            <include>**/IntegrationSuite.java</include>
        </includes>
        <skipITs>${skipITs}</skipITs>
        <!--<argLine>-->
        <!-- -Xbootclasspath/p:${settings.localRepository}/org/mortbay/jetty/alpn/alpn-boot/${alpn-boot-version}/alpn-boot-${alpn-boot-version}.jar-->
        <!--</argLine>-->
    </configuration>
    <executions>
        <execution>
            <id>failsafe-integration-tests</id>
            <phase>integration-test</phase>
            <goals>
                <goal>integration-test</goal>
                <goal>verify</goal>
            </goals>
        </execution>
    </executions>
</plugin>

参考链接:Java SDK for Hyperledger Fabric 1.0

下篇预告《构建基于kafka的fabric》,尽请期待!