From 928b72b60afae6b7e87d783863e7a7661cf2d1c3 Mon Sep 17 00:00:00 2001 From: Simon Stone Date: Wed, 21 Nov 2018 14:54:46 +0000 Subject: [PATCH] [FAB-12875] Add automated tests for fabcar sample Introduce automated tests for the fabcar sample, that deploy the new sample contracts and submit the initLedger transaction using the "peer" CLI. Additional changes will follow to drive the new sample apps to ensure that they work as well (but the apps aren't there yet!). Change-Id: Ie42d139eb1dc1cf0f7c16f41f54bb5f40309921c Signed-off-by: Simon Stone --- Jenkinsfile | 25 +++++++++++--- fabcar/startFabric.sh | 4 +-- scripts/Jenkins_Scripts/CI_Script.sh | 49 +++++++++++++++------------- scripts/Jenkins_Scripts/byfn_eyfn.sh | 1 + scripts/Jenkins_Scripts/fabcar.sh | 42 ++++++++++++++++++++++++ 5 files changed, 93 insertions(+), 28 deletions(-) create mode 100755 scripts/Jenkins_Scripts/fabcar.sh diff --git a/Jenkinsfile b/Jenkinsfile index 8fcd2633a6..c8fca23e5a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -9,7 +9,7 @@ node ('hyp-x') { // trigger build on x86_64 node timestamps { try { def ROOTDIR = pwd() // workspace dir (/w/workspace/ - env.NODE_VER = "8.11.3" // NodeJs version + def nodeHome = tool 'nodejs-8.11.3' env.ARCH = "amd64" env.VERSION = sh(returnStdout: true, script: 'curl -O https://raw.githubusercontent.com/hyperledger/fabric/master/Makefile && cat Makefile | grep "BASE_VERSION =" | cut -d "=" -f2').trim() env.VERSION = "$VERSION" // BASE_VERSION from fabric Makefile @@ -19,7 +19,7 @@ node ('hyp-x') { // trigger build on x86_64 node env.BASE_IMAGE_TAG = "${ARCH}-${BASE_IMAGE_VER}" //fabric baseimage version env.PROJECT_DIR = "gopath/src/github.com/hyperledger" env.GOPATH = "$WORKSPACE/gopath" - env.PATH = "$GOPATH/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:~/npm/bin:/home/jenkins/.nvm/versions/node/v${NODE_VER}/bin:$PATH" + env.PATH = "$GOPATH/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:${nodeHome}/bin:$PATH" def failure_stage = "none" // delete working directory @@ -105,13 +105,30 @@ node ('hyp-x') { // trigger build on x86_64 node } } } + + // Run fabcar tests + stage("Run FabCar Tests") { + // making the output color coded + wrap([$class: 'AnsiColorBuildWrapper', 'colorMapName': 'xterm']) { + try { + dir("${ROOTDIR}/$PROJECT_DIR/fabric-samples/scripts/Jenkins_Scripts") { + sh './CI_Script.sh --fabcar_Tests' + } + } + catch (err) { + failure_stage = "fabcar_Tests" + currentBuild.result = 'FAILURE' + throw err + } + } + } } finally { // Archive the artifacts archiveArtifacts allowEmptyArchive: true, artifacts: '**/*.log' // Sends notification to Rocket.Chat jenkins-robot channel - if (env.GERRIT_EVENT_TYPE == 'change-merged') { + if (env.JOB_NAME == "fabric-samples-merge-byfn") { if (currentBuild.result == 'FAILURE') { // Other values: SUCCESS, UNSTABLE - rocketSend channel: 'jenkins-robot', message: "Build Notification - STATUS: ${currentBuild.result} - BRANCH: ${env.GERRIT_BRANCH} - PROJECT: ${env.PROJECT} - (<${env.BUILD_URL}|Open>)" + rocketSend message: "Build Notification - STATUS: *${currentBuild.result}* - BRANCH: *${env.GERRIT_BRANCH}* - PROJECT: *${env.PROJECT}* - (<${env.BUILD_URL}|Open>)" } } } diff --git a/fabcar/startFabric.sh b/fabcar/startFabric.sh index 89e3bae492..d652d7a7d2 100755 --- a/fabcar/startFabric.sh +++ b/fabcar/startFabric.sh @@ -46,9 +46,9 @@ cd ../basic-network docker-compose -f ./docker-compose.yml up -d cli docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode install -n fabcar -v 1.0 -p "$CC_SRC_PATH" -l "$CC_RUNTIME_LANGUAGE" -docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n fabcar -l "$CC_RUNTIME_LANGUAGE" -v 1.0 -c '{"Args":[""]}' -P "OR ('Org1MSP.member','Org2MSP.member')" +docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n fabcar -l "$CC_RUNTIME_LANGUAGE" -v 1.0 -c '{"Args":[]}' -P "OR ('Org1MSP.member','Org2MSP.member')" sleep 10 -docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n fabcar -c '{"function":"initLedger","Args":[""]}' +docker exec -e "CORE_PEER_LOCALMSPID=Org1MSP" -e "CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" cli peer chaincode invoke -o orderer.example.com:7050 -C mychannel -n fabcar -c '{"function":"initLedger","Args":[]}' printf "\nTotal setup execution time : $(($(date +%s) - starttime)) secs ...\n\n\n" printf "Start by installing required packages run 'npm install'\n" diff --git a/scripts/Jenkins_Scripts/CI_Script.sh b/scripts/Jenkins_Scripts/CI_Script.sh index dd6cbc6740..af1b3b83ce 100755 --- a/scripts/Jenkins_Scripts/CI_Script.sh +++ b/scripts/Jenkins_Scripts/CI_Script.sh @@ -17,9 +17,6 @@ Parse_Arguments() { --env_Info) env_Info ;; - --SetGopath) - setGopath - ;; --pull_Docker_Images) pull_Docker_Images ;; @@ -29,9 +26,12 @@ Parse_Arguments() { --clean_Environment) clean_Environment ;; - --byfn_eyfn_Tests) + --byfn_eyfn_Tests) byfn_eyfn_Tests ;; + --fabcar_Tests) + fabcar_Tests + ;; --pull_Thirdparty_Images) pull_Thirdparty_Images ;; @@ -54,23 +54,19 @@ function clearContainers () { } function removeUnwantedImages() { - DOCKER_IMAGES_SNAPSHOTS=$(docker images | grep snapshot | grep -v grep | awk '{print $1":" $2}') - if [ -z "$DOCKER_IMAGES_SNAPSHOTS" ] || [ "$DOCKER_IMAGES_SNAPSHOTS" = " " ]; then - echo "---- No snapshot images available for deletion ----" - else - docker rmi -f $DOCKER_IMAGES_SNAPSHOTS || true - fi - DOCKER_IMAGE_IDS=$(docker images | grep -v 'base*\|couchdb\|kafka\|zookeeper\|cello' | awk '{print $3}') + for i in $(docker images | grep none | awk '{print $3}'); do + docker rmi ${i}; + done - if [ -z "$DOCKER_IMAGE_IDS" ] || [ "$DOCKER_IMAGE_IDS" = " " ]; then - echo "---- No images available for deletion ----" - else - docker rmi -f $DOCKER_IMAGE_IDS || true - docker images - fi + for i in $(docker images | grep -vE ".*baseimage.*(0.4.13|0.4.14)" | grep -vE ".*baseos.*(0.4.13|0.4.14)" | grep -vE ".*couchdb.*(0.4.13|0.4.14)" | grep -vE ".*zoo.*(0.4.13|0.4.14)" | grep -vE ".*kafka.*(0.4.13|0.4.14)" | grep -v "REPOSITORY" | awk '{print $1":" $2}'); do + docker rmi ${i}; + done } +# Remove /tmp/fabric-shim +docker run -v /tmp:/tmp library/alpine rm -rf /tmp/fabric-shim || true + # remove tmp/hfc and hfc-key-store data rm -rf /home/jenkins/.nvm /home/jenkins/npm /tmp/fabric-shim /tmp/hfc* /tmp/npm* /home/jenkins/kvsTemp /home/jenkins/.hfc-key-store @@ -128,7 +124,7 @@ pull_Docker_Images() { exit 1 fi docker tag $NEXUS_URL/$ORG_NAME-$IMAGES:$IMAGE_TAG $ORG_NAME-$IMAGES - docker tag $NEXUS_URL/$ORG_NAME-$IMAGES:$IMAGE_TAG $ORG_NAME-$IMAGES:$IMAGE_TAG + docker tag $NEXUS_URL/$ORG_NAME-$IMAGES:$IMAGE_TAG $ORG_NAME-$IMAGES:$ARCH-$VERSION docker rmi -f $NEXUS_URL/$ORG_NAME-$IMAGES:$IMAGE_TAG done echo @@ -146,16 +142,25 @@ pull_Fabric_CA_Image() { exit 1 fi docker tag $NEXUS_URL/$ORG_NAME-$IMAGES:$IMAGE_TAG $ORG_NAME-$IMAGES - docker tag $NEXUS_URL/$ORG_NAME-$IMAGES:$IMAGE_TAG $ORG_NAME-$IMAGES:$IMAGE_TAG + docker tag $NEXUS_URL/$ORG_NAME-$IMAGES:$IMAGE_TAG $ORG_NAME-$IMAGES:$ARCH-$VERSION docker rmi -f $NEXUS_URL/$ORG_NAME-$IMAGES:$IMAGE_TAG done echo docker images | grep hyperledger/fabric-ca } + # run byfn,eyfn tests byfn_eyfn_Tests() { - echo - echo "-----------> Execute Byfn and Eyfn Tests" - ./byfn_eyfn.sh + echo + echo "-----------> Execute Byfn and Eyfn Tests" + ./byfn_eyfn.sh +} +# run fabcar tests +fabcar_Tests() { + echo + echo "npm version ------> $(npm -v)" + echo "node version ------> $(node -v)" + echo "-----------> Execute FabCar Tests" + ./fabcar.sh } Parse_Arguments $@ diff --git a/scripts/Jenkins_Scripts/byfn_eyfn.sh b/scripts/Jenkins_Scripts/byfn_eyfn.sh index 3b1bc23bf3..f0a22d26e1 100755 --- a/scripts/Jenkins_Scripts/byfn_eyfn.sh +++ b/scripts/Jenkins_Scripts/byfn_eyfn.sh @@ -12,6 +12,7 @@ COUCHDB_CONTAINER_LIST=(couchdb0 couchdb1 couchdb2 couchdb3 couchdb4 couchdb5) MARCH=$(uname -s|tr '[:upper:]' '[:lower:]') echo "-----------> MARCH" $MARCH echo "-----------> PROJECT_VERSION:" $PROJECT_VERSION +# Download latest binaries from nexus2 MVN_METADATA=$(echo "https://nexus.hyperledger.org/content/repositories/releases/org/hyperledger/fabric/hyperledger-fabric-$PROJECT_VERSION/maven-metadata.xml") curl -L "$MVN_METADATA" > maven-metadata.xml RELEASE_TAG=$(cat maven-metadata.xml | grep release) diff --git a/scripts/Jenkins_Scripts/fabcar.sh b/scripts/Jenkins_Scripts/fabcar.sh new file mode 100755 index 0000000000..4f2355e8de --- /dev/null +++ b/scripts/Jenkins_Scripts/fabcar.sh @@ -0,0 +1,42 @@ +#!/bin/bash +# +# SPDX-License-Identifier: Apache-2.0 +# + +# docker container list - Check these from basic-network/docker-compose.yaml +CONTAINER_LIST=(peer0.org1 orderer ca) + +logs() { + +for CONTAINER in ${CONTAINER_LIST[*]}; do + docker logs $CONTAINER.example.com >& $WORKSPACE/$CONTAINER-$1.log + echo +done +# Write couchdb container logs into couchdb.log file +docker logs couchdb >& couchdb.log + +} + +copy_logs() { + +# Call logs function +logs $2 $3 + +if [ $1 != 0 ]; then + echo -e "\033[31m $2 test case is FAILED" "\033[0m" + exit 1 +fi +} + +cd $BASE_FOLDER/fabric-samples/fabcar || exit +export PATH=gopath/src/github.com/hyperledger/fabric-samples/bin:$PATH + +LANGUAGES="go javascript typescript" +for LANGUAGE in ${LANGUAGES}; do + echo -e "\033[32m starting fabcar test (${LANGUAGE})" "\033[0m" + ./startFabric.sh ${LANGUAGE} + copy_logs $? fabcar-${LANGUAGE} + docker ps -aq | xargs docker rm -f + docker rmi -f $(docker images -aq dev-*) + echo -e "\033[32m finished fabcar test (${LANGUAGE})" "\033[0m" +done