Created
March 13, 2019 09:20
Revisions
-
huahuayu created this gist
Mar 13, 2019 .There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode charactersOriginal file line number Diff line number Diff line change @@ -0,0 +1,237 @@ #!/bin/bash # # Copyright IBM Corp. All Rights Reserved. # # SPDX-License-Identifier: Apache-2.0 # # if version not passed in, default to latest released version export VERSION=1.4.0 # if ca version not passed in, default to latest released version export CA_VERSION=$VERSION # current version of thirdparty images (couchdb, kafka and zookeeper) released export THIRDPARTY_IMAGE_VERSION=0.4.14 export ARCH=$(echo "$(uname -s|tr '[:upper:]' '[:lower:]'|sed 's/mingw64_nt.*/windows/')-$(uname -m | sed 's/x86_64/amd64/g')") export MARCH=$(uname -m) printHelp() { echo "Usage: bootstrap.sh [version [ca_version [thirdparty_version]]] [options]" echo echo "options:" echo "-h : this help" echo "-d : bypass docker image download" echo "-s : bypass fabric-samples repo clone" echo "-b : bypass download of platform-specific binaries" echo echo "e.g. bootstrap.sh 1.4.0 -s" echo "would download docker images and binaries for version 1.4.0" } dockerFabricPull() { local FABRIC_TAG=$1 for IMAGES in peer orderer ccenv javaenv tools; do echo "==> FABRIC IMAGE: $IMAGES" echo docker pull hyperledger/fabric-$IMAGES:$FABRIC_TAG docker tag hyperledger/fabric-$IMAGES:$FABRIC_TAG hyperledger/fabric-$IMAGES done } dockerThirdPartyImagesPull() { local THIRDPARTY_TAG=$1 for IMAGES in couchdb kafka zookeeper; do echo "==> THIRDPARTY DOCKER IMAGE: $IMAGES" echo docker pull hyperledger/fabric-$IMAGES:$THIRDPARTY_TAG docker tag hyperledger/fabric-$IMAGES:$THIRDPARTY_TAG hyperledger/fabric-$IMAGES done } dockerCaPull() { local CA_TAG=$1 echo "==> FABRIC CA IMAGE" echo docker pull hyperledger/fabric-ca:$CA_TAG docker tag hyperledger/fabric-ca:$CA_TAG hyperledger/fabric-ca } samplesInstall() { # clone (if needed) hyperledger/fabric-samples and checkout corresponding # version to the binaries and docker images to be downloaded if [ -d first-network ]; then # if we are in the fabric-samples repo, checkout corresponding version echo "===> Checking out v${VERSION} of hyperledger/fabric-samples" git checkout v${VERSION} elif [ -d fabric-samples ]; then # if fabric-samples repo already cloned and in current directory, # cd fabric-samples and checkout corresponding version echo "===> Checking out v${VERSION} of hyperledger/fabric-samples" cd fabric-samples && git checkout v${VERSION} else echo "===> Cloning hyperledger/fabric-samples repo and checkout v${VERSION}" git clone -b master https://github.com/hyperledger/fabric-samples.git && cd fabric-samples && git checkout v${VERSION} fi } # Incrementally downloads the .tar.gz file locally first, only decompressing it # after the download is complete. This is slower than binaryDownload() but # allows the download to be resumed. binaryIncrementalDownload() { local BINARY_FILE=$1 local URL=$2 curl -f -s -C - ${URL} -o ${BINARY_FILE} || rc=$? # Due to limitations in the current Nexus repo: # curl returns 33 when there's a resume attempt with no more bytes to download # curl returns 2 after finishing a resumed download # with -f curl returns 22 on a 404 if [ "$rc" = 22 ]; then # looks like the requested file doesn't actually exist so stop here return 22 fi if [ -z "$rc" ] || [ $rc -eq 33 ] || [ $rc -eq 2 ]; then # The checksum validates that RC 33 or 2 are not real failures echo "==> File downloaded. Verifying the md5sum..." localMd5sum=$(md5sum ${BINARY_FILE} | awk '{print $1}') remoteMd5sum=$(curl -s ${URL}.md5) if [ "$localMd5sum" == "$remoteMd5sum" ]; then echo "==> Extracting ${BINARY_FILE}..." tar xzf ./${BINARY_FILE} --overwrite echo "==> Done." rm -f ${BINARY_FILE} ${BINARY_FILE}.md5 else echo "Download failed: the local md5sum is different from the remote md5sum. Please try again." rm -f ${BINARY_FILE} ${BINARY_FILE}.md5 exit 1 fi else echo "Failure downloading binaries (curl RC=$rc). Please try again and the download will resume from where it stopped." exit 1 fi } # This will attempt to download the .tar.gz all at once, but will trigger the # binaryIncrementalDownload() function upon a failure, allowing for resume # if there are network failures. binaryDownload() { local BINARY_FILE=$1 local URL=$2 echo "===> Downloading: " ${URL} # Check if a previous failure occurred and the file was partially downloaded if [ -e ${BINARY_FILE} ]; then echo "==> Partial binary file found. Resuming download..." binaryIncrementalDownload ${BINARY_FILE} ${URL} else curl ${URL} | tar xz || rc=$? if [ ! -z "$rc" ]; then echo "==> There was an error downloading the binary file. Switching to incremental download." echo "==> Downloading file..." binaryIncrementalDownload ${BINARY_FILE} ${URL} else echo "==> Done." fi fi } binariesInstall() { echo "===> Downloading version ${FABRIC_TAG} platform specific fabric binaries" binaryDownload ${BINARY_FILE} https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric/${ARCH}-${VERSION}/${BINARY_FILE} if [ $? -eq 22 ]; then echo echo "------> ${FABRIC_TAG} platform specific fabric binary is not available to download <----" echo fi echo "===> Downloading version ${CA_TAG} platform specific fabric-ca-client binary" binaryDownload ${CA_BINARY_FILE} https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric-ca/hyperledger-fabric-ca/${ARCH}-${CA_VERSION}/${CA_BINARY_FILE} if [ $? -eq 22 ]; then echo echo "------> ${CA_TAG} fabric-ca-client binary is not available to download (Available from 1.1.0-rc1) <----" echo fi } dockerInstall() { which docker >& /dev/null NODOCKER=$? if [ "${NODOCKER}" == 0 ]; then echo "===> Pulling fabric Images" dockerFabricPull ${FABRIC_TAG} echo "===> Pulling fabric ca Image" dockerCaPull ${CA_TAG} echo "===> Pulling thirdparty docker images" dockerThirdPartyImagesPull ${THIRDPARTY_TAG} echo echo "===> List out hyperledger docker images" docker images | grep hyperledger* else echo "=========================================================" echo "Docker not installed, bypassing download of Fabric images" echo "=========================================================" fi } DOCKER=true SAMPLES=true BINARIES=true # Parse commandline args pull out # version and/or ca-version strings first if [ ! -z "$1" -a "${1:0:1}" != "-" ]; then VERSION=$1;shift if [ ! -z "$1" -a "${1:0:1}" != "-" ]; then CA_VERSION=$1;shift if [ ! -z "$1" -a "${1:0:1}" != "-" ]; then THIRDPARTY_IMAGE_VERSION=$1;shift fi fi fi # prior to 1.2.0 architecture was determined by uname -m if [[ $VERSION =~ ^1\.[0-1]\.* ]]; then export FABRIC_TAG=${MARCH}-${VERSION} export CA_TAG=${MARCH}-${CA_VERSION} export THIRDPARTY_TAG=${MARCH}-${THIRDPARTY_IMAGE_VERSION} else # starting with 1.2.0, multi-arch images will be default : ${CA_TAG:="$CA_VERSION"} : ${FABRIC_TAG:="$VERSION"} : ${THIRDPARTY_TAG:="$THIRDPARTY_IMAGE_VERSION"} fi BINARY_FILE=hyperledger-fabric-${ARCH}-${VERSION}.tar.gz CA_BINARY_FILE=hyperledger-fabric-ca-${ARCH}-${CA_VERSION}.tar.gz # then parse opts while getopts "h?dsb" opt; do case "$opt" in h|\?) printHelp exit 0 ;; d) DOCKER=false ;; s) SAMPLES=false ;; b) BINARIES=false ;; esac done if [ "$SAMPLES" == "true" ]; then echo echo "Installing hyperledger/fabric-samples repo" echo samplesInstall fi if [ "$BINARIES" == "true" ]; then echo echo "Installing Hyperledger Fabric binaries" echo binariesInstall fi if [ "$DOCKER" == "true" ]; then echo echo "Installing Hyperledger Fabric docker images" echo dockerInstall fi