## Description Usage function not defined before use params are not properly specified ## Type of change <!--- Please check the type of change your PR introduces: ---> - [ ] 🌻 Feature - [x] 🐛 Bugfix - [ ] 🗺️ Documentation - [ ] 🤖 Test - [ ] 💻 CI/Deployment - [x] 🐹 Trivial/Minor ## Issue(s) ## Test Plan <!-- How will this be tested prior to merging.--> - [x] 💪 Manual - [ ] ⚡ Unit test - [ ] 💚 E2E
93 lines
2.6 KiB
Bash
Executable File
93 lines
2.6 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
set -e
|
|
|
|
usage() {
|
|
echo "Usage: $(basename $0) binary | image [--platforms ...] [--tag ...]"
|
|
echo ""
|
|
echo "OPTIONS"
|
|
echo " -p | --platforms Platforms to build for (default: $PLATFORMS)"
|
|
echo " Specify multiple platforms using ',' (eg: linux/amd64,darwin/arm)"
|
|
echo " -t | --tag Tag for container image (default: $TAG)"
|
|
}
|
|
|
|
ROOT=$(dirname $(dirname $(readlink -f $0)))
|
|
GOVER=1.18 # go version
|
|
CORSO_BUILD_CACHE="/tmp/.corsobuild" # shared persistent cache
|
|
|
|
# Figure out os and architecture
|
|
case "$(uname -m)" in
|
|
x86_64) GOARCH="amd64" ;;
|
|
aarch64) GOARCH="arm64" ;;
|
|
arm64) GOARCH="arm64" ;;
|
|
i386) GOARCH="386" ;;
|
|
*) echo "Unknown architecture" && exit 0 ;;
|
|
esac
|
|
case "$(uname)" in
|
|
Linux) GOOS="linux" ;;
|
|
Darwin) GOOS="darwin" ;;
|
|
*) echo "Unknown OS" && exit 0 ;;
|
|
esac
|
|
|
|
PLATFORMS="$GOOS/$GOARCH" # default platform
|
|
TAG="alcionai/corso" # default image tag
|
|
|
|
MODE="binary"
|
|
case "$1" in
|
|
binary) MODE="binary" && shift ;;
|
|
image)
|
|
MODE="image"
|
|
shift
|
|
GOOS="linux" # darwin container images are not a thing
|
|
;;
|
|
-h | --help) usage && exit 0 ;;
|
|
*) usage && exit 1 ;;
|
|
esac
|
|
|
|
while [ "$#" -gt 0 ]; do
|
|
case "$1" in
|
|
-p | --platforms) PLATFORMS="$2" && shift ;;
|
|
-t | --tag) TAG="$2" && shift ;;
|
|
*) echo "Invalid argument $1" && usage && exit 1 ;;
|
|
esac
|
|
shift
|
|
done
|
|
|
|
if [ "$MODE" == "binary" ]; then
|
|
mkdir -p ${CORSO_BUILD_CACHE} # prep env
|
|
for platform in ${PLATFORMS/,/ }; do
|
|
IFS='/' read -r -a platform_split <<<"$platform"
|
|
GOOS=${platform_split[0]}
|
|
GOARCH=${platform_split[1]}
|
|
|
|
printf "Building for %s...\r" "$platform"
|
|
docker run --rm \
|
|
--mount type=bind,src="${ROOT}",dst="/app" \
|
|
--mount type=bind,src="${CORSO_BUILD_CACHE}",dst="${CORSO_BUILD_CACHE}" \
|
|
--env GOMODCACHE="${CORSO_BUILD_CACHE}/mod" --env GOCACHE="${CORSO_BUILD_CACHE}/cache" \
|
|
--env GOOS=${GOOS} --env GOARCH=${GOARCH} \
|
|
--workdir "/app/src" \
|
|
golang:${GOVER} \
|
|
go build -o corso -ldflags "${CORSO_BUILD_LDFLAGS}"
|
|
|
|
OUTFILE="corso"
|
|
[ "$GOOS" == "windows" ] && OUTFILE="corso.exe"
|
|
|
|
mkdir -p "${ROOT}/bin/${GOOS}-${GOARCH}"
|
|
mv "${ROOT}/src/corso" "${ROOT}/bin/${GOOS}-${GOARCH}/${OUTFILE}"
|
|
echo Corso $platform binary available in "${ROOT}/bin/${GOOS}-${GOARCH}/${OUTFILE}"
|
|
done
|
|
else
|
|
for platform in ${PLATFORMS/,/ }; do
|
|
echo "$platform" | grep -Eq "^darwin" &&
|
|
echo Cannot create darwin images "($platform)" && exit 1
|
|
done
|
|
echo Building "$TAG" image for "$PLATFORMS"
|
|
docker buildx build --tag ${TAG} \
|
|
--platform ${PLATFORMS} \
|
|
--file "${ROOT}/build/Dockerfile" \
|
|
--build-arg CORSO_BUILD_LDFLAGS="$CORSO_BUILD_LDFLAGS" \
|
|
--load "${ROOT}"
|
|
echo Built container image "$TAG"
|
|
fi
|