| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335 |
- #!/bin/bash
- #
- # vi: expandtab tabstop=4 shiftwidth=0
- set -o errexit
- set -o pipefail
- if [ "$DEBUG" == "true" ]; then
- set -ex
- export PS4='+(${BASH_SOURCE}:${LINENO}): ${FUNCNAME[0]:+${FUNCNAME[0]}(): }'
- fi
- readlink_mac() {
- cd $(dirname $1)
- TARGET_FILE=$(basename $1)
- # Iterate down a (possible) chain of symlinks
- while [ -L "$TARGET_FILE" ]; do
- TARGET_FILE=$(readlink $TARGET_FILE)
- cd $(dirname $TARGET_FILE)
- TARGET_FILE=$(basename $TARGET_FILE)
- done
- # Compute the canonicalized name by finding the physical path
- # for the directory we're in and appending the target file.
- PHYS_DIR=$(pwd -P)
- REAL_PATH=$PHYS_DIR/$TARGET_FILE
- }
- get_current_arch() {
- local current_arch
- case $(uname -m) in
- x86_64)
- current_arch=amd64
- ;;
- aarch64)
- current_arch=arm64
- ;;
- riscv64)
- current_arch=riscv64
- ;;
- esac
- echo $current_arch
- }
- ALLARCH=("amd64" "arm64" "riscv64")
- pushd $(
- cd "$(dirname "$0")"
- pwd
- ) >/dev/null
- readlink_mac $(basename "$0")
- cd "$(dirname "$REAL_PATH")"
- CUR_DIR=$(pwd)
- SRC_DIR=$(cd .. && pwd)
- popd >/dev/null
- DOCKER_DIR="$SRC_DIR/build/docker"
- # https://docs.docker.com/develop/develop-images/build_enhancements/
- export DOCKER_BUILDKIT=1
- # https://github.com/docker/buildx#with-buildx-or-docker-1903
- export DOCKER_CLI_EXPERIMENTAL=enabled
- REGISTRY=${REGISTRY:-docker.io/yunion}
- TAG=${TAG:-latest}
- CURRENT_ARCH=$(get_current_arch)
- ARCH=${ARCH:-$CURRENT_ARCH}
- build_bin() {
- local BUILD_ARCH=$2
- local BUILD_CGO=$3
- case "$1" in
- climc)
- rm -vf _output/bin/*cli
- env $BUILD_ARCH $BUILD_CGO make -C "$SRC_DIR" docker-alpine-build F="cmd/$1 cmd/*cli"
- ;;
- *)
- env $BUILD_ARCH $BUILD_CGO make -C "$SRC_DIR" docker-alpine-build F="cmd/$1"
- ;;
- esac
- }
- # build_bundle_libraries() {
- # for bundle_component in 'host-image'; do
- # if [ $1 == $bundle_component ]; then
- # $CUR_DIR/bundle_libraries.sh _output/bin/bundles/$1 _output/bin/$1
- # break
- # fi
- # done
- # }
- build_image() {
- local tag=$1
- local file=$2
- local path=$3
- local arch
- if [[ "$tag" == *:5000/* ]]; then
- arch=$(arch)
- case $arch in
- x86_64)
- docker buildx build -t "$tag" -f "$2" "$3" --output type=docker --platform linux/amd64
- ;;
- aarch64)
- docker buildx build -t "$tag" -f "$2" "$3" --output type=docker --platform linux/arm64
- ;;
- riscv64)
- docker buildx build -t "$tag" -f "$2" "$3" --output type=docker --platform linux/riscv64
- ;;
- *)
- echo wrong arch
- exit 1
- ;;
- esac
- else
- if [[ "$tag" == *"amd64" || "$ARCH" == "" || "$ARCH" == "amd64" || "$ARCH" == "x86_64" || "$ARCH" == "x86" ]]; then
- docker buildx build -t "$tag" -f "$file" "$path" --push --platform linux/amd64
- elif [[ "$tag" == *"arm64" || "$ARCH" == "arm64" ]]; then
- docker buildx build -t "$tag" -f "$file" "$path" --push --platform linux/arm64
- elif [[ "$tag" == *"riscv64" || "$ARCH" == "riscv64" ]]; then
- docker buildx build -t "$tag" -f "$file" "$path" --push --platform linux/riscv64
- else
- docker buildx build -t "$tag" -f "$file" "$path" --push
- fi
- docker pull "$tag"
- fi
- }
- buildx_and_push() {
- local tag=$1
- local file=$2
- local path=$3
- local arch=$4
- if [[ "$DRY_RUN" == "true" ]]; then
- echo "[$(readlink -f ${BASH_SOURCE}):${LINENO} ${FUNCNAME[0]}] return for DRY_RUN"
- return
- fi
- docker buildx build -t "$tag" --platform "linux/$arch" -f "$2" "$3" --push
- docker pull --platform "linux/$arch" "$tag"
- }
- get_image_name() {
- local component=$1
- local arch=$2
- local is_all_arch=$3
- local img_name="$REGISTRY/$component:$TAG"
- if [[ -n "$arch" && "$is_all_arch" == "true" ]]; then
- img_name="${img_name}-$arch"
- fi
- echo $img_name
- }
- build_process() {
- local component=$1
- local arch=$2
- local is_all_arch=$3
- local img_name=$(get_image_name $component $arch $is_all_arch)
- local build_env=""
- case "$component" in
- host)
- build_env="$build_env CGO_ENABLED=1"
- ;;
- *)
- build_env="$build_env CGO_ENABLED=0"
- ;;
- esac
- build_bin $component
- if [[ "$DRY_RUN" == "true" ]]; then
- echo "[$(readlink -f ${BASH_SOURCE}):${LINENO} ${FUNCNAME[0]}] return for DRY_RUN"
- return
- fi
- # build_bundle_libraries $component
- build_image $img_name $DOCKER_DIR/Dockerfile.$component $SRC_DIR
- }
- build_process_with_buildx() {
- local component=$1
- local arch=$2
- local is_all_arch=$3
- local img_name=$(get_image_name $component $arch $is_all_arch)
- build_env="GOARCH=$arch"
- case "$component" in
- host)
- build_env="$build_env CGO_ENABLED=1"
- ;;
- *)
- build_env="$build_env CGO_ENABLED=0"
- ;;
- esac
- case "$component" in
- host | torrent)
- buildx_and_push $img_name $DOCKER_DIR/multi-arch/Dockerfile.$component $SRC_DIR $arch
- ;;
- *)
- build_bin $component $build_env
- buildx_and_push $img_name $DOCKER_DIR/Dockerfile.$component $SRC_DIR $arch
- ;;
- esac
- }
- general_build() {
- local component=$1
- # 如果未指定,则默认使用当前架构
- local arch=${2:-$CURRENT_ARCH}
- local is_all_arch=$3
- if [[ "$CURRENT_ARCH" == "$arch" ]]; then
- build_process $component $arch $is_all_arch
- else
- build_process_with_buildx $component $arch $is_all_arch
- fi
- }
- make_manifest_image() {
- local component=$1
- local arch=$2
- local img_name=$(get_image_name $component "" "false")
- if [[ "$DRY_RUN" == "true" ]]; then
- echo "[$(readlink -f ${BASH_SOURCE}):${LINENO} ${FUNCNAME[0]}] return for DRY_RUN"
- return
- fi
- CMD="docker buildx imagetools create -t ${img_name} "
- for ac in "${ALLARCH[@]}"; do
- if [[ "${arch}" == "all" || "${arch}" == *"$ac"* ]]; then
- CMD="${CMD} ${img_name}-${ac}"
- fi
- done
- echo "$CMD"
- $CMD
- }
- ALL_COMPONENTS=$(ls cmd | grep -v '.*cli$' | xargs)
- if [ "$#" -lt 1 ]; then
- echo "No component is specified~"
- echo "You can specify a component in [$ALL_COMPONENTS]"
- echo "If you want to build all components, specify the component to: all."
- exit
- elif [ "$#" -eq 1 ] && [ "$1" == "all" ]; then
- echo "Build all onecloud docker images"
- COMPONENTS=$ALL_COMPONENTS
- else
- COMPONENTS=$@
- fi
- cd $SRC_DIR
- mkdir -p $SRC_DIR/_output
- show_update_cmd() {
- local component=$1
- local spec=$1
- local name=$1
- local tag=$TAG
- case "$component" in
- 'apigateway')
- spec='apiGateway'
- ;;
- 'apimap')
- spec='apiMap'
- ;;
- 'baremetal-agent')
- spec='baremetalagent'
- name='baremetal-agent'
- ;;
- 'host')
- spec='hostagent'
- ;;
- 'host-deployer')
- spec='hostdeployer'
- ;;
- 'host-health')
- spec='hostagent/HostHealth'
- ;;
- 'host-image')
- spec='hostimage'
- ;;
- 'region')
- spec='regionServer'
- ;;
- 'region-dns')
- spec='regionDNS'
- ;;
- 'vpcagent')
- spec='vpcAgent'
- ;;
- 'esxi-agent')
- spec='esxiagent'
- ;;
- 'mcp-server')
- spec='mcpServer'
- ;;
- esac
- echo "kubectl patch oc -n onecloud default --type='json' -p='[{op: replace, path: /spec/${spec}/imageName, value: ${name}},{"op": "replace", "path": "/spec/${spec}/repository", "value": "${REGISTRY}"},{"op": "add", "path": "/spec/${spec}/tag", "value": "${tag}"}]'"
- }
- for component in $COMPONENTS; do
- if [[ $component == *cli ]]; then
- echo "Please build image for climc"
- continue
- fi
- echo "Start to build component: $component"
- multiarch=""
- for ac in "${ALLARCH[@]}"; do
- if [[ "$ARCH" == "$ac" ]]; then
- # single arch
- if [ -e "$DOCKER_DIR/Dockerfile.$component" ]; then
- general_build $component $ARCH "false"
- fi
- elif [[ "$ARCH" == "all" || "$ARCH" == *"$ac"* ]]; then
- multiarch="true"
- general_build $component $ac "true"
- fi
- done
- if [[ "$multiarch" == "true" ]]; then
- make_manifest_image $component $ARCH
- fi
- done
- echo ""
- for component in $COMPONENTS; do
- if [[ $component == *cli ]]; then
- continue
- fi
- show_update_cmd $component
- done
|