diff --git a/README.md b/README.md index 5f269150..f35817e8 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,27 @@ +[//]: # (SPDX-License-Identifier: CC-BY-4.0) + ## Hyperledger Fabric Samples -Please visit the [installation instructions](http://hyperledger-fabric.readthedocs.io/en/latest/install.html). +Please visit the [installation instructions](http://hyperledger-fabric.readthedocs.io/en/latest/install.html) +to ensure you have the correct prerequisites installed. Please use the +version of the documentation that matches the version of the software you +intend to use to ensure alignment. + +## Download Binaries and Docker Images + +The [`scripts/bootstrap.sh`](https://github.com/hyperledger/fabric-samples/blob/release-1.1/scripts/bootstrap.sh) +script will preload all of the requisite docker +images for Hyperledger Fabric and tag them with the 'latest' tag. Optionally, +specify a version for fabric, fabric-ca and thirdparty images. Default versions +are 1.1.0, 1.1.0 and 0.4.7 respectively. + +```bash +./scripts/bootstrap.sh [version] [ca version] [thirdparty_version] +``` ## License -Hyperledger Project source code files are made available under the Apache License, Version 2.0 (Apache-2.0), located in the [LICENSE](LICENSE) file. Hyperledger Project documentation files are made available under the Creative Commons Attribution 4.0 International License (CC-BY-4.0), available at http://creativecommons.org/licenses/by/4.0/. +Hyperledger Project source code files are made available under the Apache +License, Version 2.0 (Apache-2.0), located in the [LICENSE](LICENSE) file. +Hyperledger Project documentation files are made available under the Creative +Commons Attribution 4.0 International License (CC-BY-4.0), available at http://creativecommons.org/licenses/by/4.0/. diff --git a/scripts/README.md b/scripts/README.md deleted file mode 100644 index 4dce8de6..00000000 --- a/scripts/README.md +++ /dev/null @@ -1,10 +0,0 @@ -## Hyperledger Fabric Samples - -fabric-preload.sh will preload all of the requisite docker images for Hyperledger Fabric and tag them -with the 'latest' tag. Optionally, specify a specific version (e.g. 1.0.1). Default version is 1.0.0. - -```bash -./fabric-preload.sh [version] -``` - -Creative Commons License
This work is licensed under a Creative Commons Attribution 4.0 International License diff --git a/scripts/bootstrap.sh b/scripts/bootstrap.sh new file mode 100755 index 00000000..37beaf4d --- /dev/null +++ b/scripts/bootstrap.sh @@ -0,0 +1,220 @@ +#!/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.1.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.7 +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) + +# ensure we're in the fabric-samples directory +dir=`basename $PWD` +if [ "${dir}" == "scripts" ]; then + cd .. +fi + +dir=`basename $PWD` +if [ "${dir}" != "fabric-samples" ]; then + echo "You should run this script from the fabric-samples root directory." + exit 1 +fi + +printHelp() { + echo "Usage: bootstrap.sh [] [] [][-d -b]" + echo + echo "-d - bypass docker image download" + echo "-b - bypass download of platform-specific binaries" + echo + echo "e.g. bootstrap.sh 1.1.1" + echo "would download docker images and binaries for version 1.1.1" +} + +dockerFabricPull() { + local FABRIC_TAG=$1 + for IMAGES in peer orderer ccenv 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 +} + +# 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 echo $1 | grep -q '\d'; then + VERSION=$1;shift + if echo $1 | grep -q '\d'; then + CA_VERSION=$1;shift + if echo $1 | grep -q '\d'; then + THIRDPARTY_IMAGE_VERSION=$1;shift + fi + fi +fi + +# prior to 1.1.0 architecture was determined by uname -m +if [[ $VERSION =~ ^1\.[0]\.* ]]; 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?db" opt; do + case "$opt" in + h|\?) + printHelp + exit 0 + ;; + d) DOCKER=false + ;; + b) BINARIES=false + ;; + esac +done + +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 diff --git a/scripts/fabric-preload.sh b/scripts/fabric-preload.sh deleted file mode 100755 index a88963ed..00000000 --- a/scripts/fabric-preload.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash -# -# Copyright IBM Corp. All Rights Reserved. -# -# SPDX-License-Identifier: Apache-2.0 -# - -export VERSION=${1:-1.0.0} -export ARCH=$(echo "$(uname -s|tr '[:upper:]' '[:lower:]'|sed 's/mingw64_nt.*/windows/')-$(uname -m | sed 's/x86_64/amd64/g')" | awk '{print tolower($0)}') -#Set MARCH variable i.e ppc64le,s390x,x86_64,i386 -MARCH=`uname -m` - -dockerFabricPull() { - local FABRIC_TAG=$1 - for IMAGES in peer orderer couchdb ccenv javaenv kafka zookeeper 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 -} - -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 -} - -: ${CA_TAG:="$MARCH-$VERSION"} -: ${FABRIC_TAG:="$MARCH-$VERSION"} - -echo "===> Pulling fabric Images" -dockerFabricPull ${FABRIC_TAG} - -echo "===> Pulling fabric ca Image" -dockerCaPull ${CA_TAG} -echo -echo "===> List out hyperledger docker images" -docker images | grep hyperledger* -