corso/build/build.sh
Georgi Matev 21446a9e46
Update golang in build script (#4504)
Update build.sh golang version

---

#### Does this PR need a docs update or release note?

- [ ]  Yes, it's included
- [ ] 🕐 Yes, but in a later PR
- [x]  No

#### Type of change

<!--- Please check the type of change your PR introduces: --->
- [ ] 🌻 Feature
- [x] 🐛 Bugfix
- [ ] 🗺️ Documentation
- [ ] 🤖 Supportability/Tests
- [ ] 💻 CI/Deployment
- [ ] 🧹 Tech Debt/Cleanup

#### Issue(s)

<!-- Can reference multiple issues. Use one of the following "magic words" - "closes, fixes" to auto-close the Github issue. -->
* #<issue>

#### Test Plan

<!-- How will this be tested prior to merging.-->
- [x] 💪 Manual
- [ ]  Unit test
- [ ] 💚 E2E
2023-10-14 04:26:51 +00:00

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.21 # 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