#!/bin/bash
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
set -euo pipefail # set -e表示一旦脚本中有命令的返回值为非0,则脚本立即退出,后续命令不再执行;
# set -o pipefail表示在管道连接的命令序列中,只要有任何一个命令返回非0值,则整个管道返回非0值,即使最后一个命令返回0.
#set -u 就可以让脚本遇到错误时停止执行,并指出错误的行数信息。
if [ "$#" -ne 2 ]; then # if 传参数量不等于两个,则退出
>&2 echo "Expected 2 directories got $#"
exit 2
fi
>&2 jq . "$2/metadata.json"
#>&2 也就是把结果输出到和标准错误一样;之前如果有定义标准错误重定向到某file文件,那么标准输出##也重定向到这个file文件。其中&的意思,可以看成是“The same as”、“与...一样”的意思
# jq -r .type 读取json文件中的 type字段的值
# tr [:upper:] [:lower:] 将大写字母全部替换为小写字母
if [ "$(jq -r .type "$2/metadata.json" | tr '[:upper:]' '[:lower:]')" != "golang" ]; then
>&2 echo "only golang chaincode supported"
exit 1
fi
if [[ "$(jq -r .label "$2/metadata.json")" != *-external* ]]; then
>&2 echo "only golang chaincode named with an '-external' suffix is supported"
exit 1
fi
exit 0
1:这是fabric externalbuilders(外部布署)的detect(检查操作)
2:fabric externalbuilders(外部布署)的release (释放操作)
#!/bin/bash
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
set -euo pipefail
if [ "$#" -ne 2 ]; then
>&2 echo "Expected 2 directories got $#"
exit 2
fi
BLD="$1"
RELEASE="$2"
if [ -d "$BLD/META-INF" ] ; then #-d是测试给定目录是否存在的运算符.
cp -a "$BLD/META-INF"/* "$RELEASE" #cp -a 保留原文件属性的前提下复制文件
fi
3:fabric externalbuilders(外部布署)的build(构建操作)
#!/bin/bash
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
set -euo pipefail
if [ "$#" -ne 3 ]; then
>&2 echo "Expected 3 directories got $#"
exit 1
fi
SOURCE=$1
METADATA=$2
OUTPUT=$3
>&2 jq . "$2/metadata.json"
if [[ "$(jq -r .label "$METADATA/metadata.json")" == *fail* ]]; then
>&2 echo "Exiting with failure..."
exit 1
fi
GO_PACKAGE_PATH="$(jq -r .path "$METADATA/metadata.json")"
if [ -f "$SOURCE/src/go.mod" ]; then
cd "$SOURCE/src"
go build -v -mod=readonly -o "$OUTPUT/chaincode" "$GO_PACKAGE_PATH"
else
GO111MODULE=off go build -v -o "$OUTPUT/chaincode" "$GO_PACKAGE_PATH"
fi
# copy index metadata if present
if [ -d "$SOURCE/META-INF" ]; then
cp -a "$SOURCE/META-INF" "$OUTPUT"
fi
4:fabric externalbuilders(外部布署)的run(执行操作)
#!/bin/bash
# Copyright IBM Corp. All Rights Reserved.
#
# SPDX-License-Identifier: Apache-2.0
set -euo pipefail
if [ "$#" -ne 2 ]; then
>&2 echo "Expected 2 directories got $#"
exit 1
fi
OUTPUT=$1
ARTIFACTS=$2
# shellcheck disable=SC2155
export CORE_CHAINCODE_ID_NAME="$(jq -r .chaincode_id "$ARTIFACTS/chaincode.json")"
export CORE_PEER_TLS_ENABLED="true"
export CORE_TLS_CLIENT_CERT_FILE="$ARTIFACTS/client.crt"
export CORE_TLS_CLIENT_KEY_FILE="$ARTIFACTS/client.key"
export CORE_PEER_TLS_ROOTCERT_FILE="$ARTIFACTS/root.crt"
export CORE_PEER_LOCALMSPID="$(jq -r .mspid "$ARTIFACTS/chaincode.json")"
jq -r .client_cert "$ARTIFACTS/chaincode.json" > "$CORE_TLS_CLIENT_CERT_FILE" #将读出的流写进新的文件中
jq -r .client_key "$ARTIFACTS/chaincode.json" > "$CORE_TLS_CLIENT_KEY_FILE"
jq -r .root_cert "$ARTIFACTS/chaincode.json" > "$CORE_PEER_TLS_ROOTCERT_FILE"
if [ -z "$(jq -r .client_cert "$ARTIFACTS/chaincode.json")" ]; then
export CORE_PEER_TLS_ENABLED="false"
fi
exec "$OUTPUT/chaincode" -peer.address="$(jq -r .peer_address "$ARTIFACTS/chaincode.json")"
# shell 内部的执行命令不启用新的shell进程。