Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Updating toolkit/scripts/build_cargo_cache.sh #12309

Draft
wants to merge 2 commits into
base: 3.0-dev
Choose a base branch
from
Draft
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
168 changes: 133 additions & 35 deletions toolkit/scripts/build_cargo_cache.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,60 +2,158 @@
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT License.

# Quit on failure
set -e

temp_dir=$(mktemp -d)
echo "Working in temporary directory '$temp_dir'."
function clean-up {
echo "Cleaning up temporary directory '$temp_dir'."
rm -rf "$temp_dir"
}
trap clean-up EXIT
PKG_VERSION=""
SRC_TARBALL=""
OUT_FOLDER="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
VENDOR_VERSION="1"

tarball_name=$1
# parameters:
#
# --srcTarball : src tarball file
# this file contains the 'initial' source code of the component
# and should be replaced with the new/modified src code
# --outFolder : folder where to copy the new tarball(s)
# --pkgVersion : package version
# --vendorVersion : vendor version

cache_name=${tarball_name%.*}
if [[ "$cache_name" =~ \.tar$ ]]
then
cache_name=${cache_name%.*}
PARAMS=""
while (( "$#" )); do
case "$1" in
--srcTarball)
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
SRC_TARBALL=$2
shift 2
else
echo "Error: Argument for $1 is missing" >&2
exit 1
fi
;;
--outFolder)
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
OUT_FOLDER=$2
shift 2
else
echo "Error: Argument for $1 is missing" >&2
exit 1
fi
;;
--pkgVersion)
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
PKG_VERSION=$2
shift 2
else
echo "Error: Argument for $1 is missing" >&2
exit 1
fi
;;
--vendorVersion)
if [ -n "$2" ] && [ ${2:0:1} != "-" ]; then
VENDOR_VERSION=$2
shift 2
else
echo "Error: Argument for $1 is missing" >&2
exit 1
fi
;;
-*|--*=) # unsupported flags
echo "Error: Unsupported flag $1" >&2
exit 1
;;
*) # preserve positional arguments
PARAMS="$PARAMS $1"
shift
;;
esac
done

echo "--srcTarball -> $SRC_TARBALL"
echo "--outFolder -> $OUT_FOLDER"
echo "--pkgVersion -> $PKG_VERSION"
echo "--vendorVersion -> $VENDOR_VERSION"

if [ -z "$PKG_VERSION" ]; then
echo "--pkgVersion parameter cannot be empty"
exit 1
fi

cache_tarball_name="$cache_name-cargo.tar.gz"
if [ -z "$VENDOR_VERSION" ]; then
echo "--vendorVersion parameter cannot be empty"
exit 1
fi

echo "-- create temp folder"
TEMP_DIR=$(mktemp -d)
function cleanup {
echo "+++ cleanup -> remove $TEMP_DIR"
rm -rf $TEMP_DIR
}
trap cleanup EXIT

pushd $TEMP_DIR > /dev/null

if [[ $# -ge 2 ]]
TARBALL_NAME=$(basename "$SRC_TARBALL")

NAME_VER=${TARBALL_NAME%.*}
if [[ "$NAME_VER" =~ \.tar$ ]]
then
directory_name=$2
else
directory_name=$cache_name
NAME_VER=${NAME_VER%.*}
fi

if [[ -f "$tarball_name" ]]
VENDOR_TARBALL="$NAME_VER-cargovendor-v$VENDOR_VERSION.tar.gz"

if [[ -f "$TARBALL_NAME" ]]
then
cp "$tarball_name" "$temp_dir"
cp "$SRC_TARBALL" "$TEMP_DIR"
else
echo "Tarball '$tarball_name' doesn't exist. Will attempt to download from blobstorage."
if ! wget -q "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/$tarball_name" -O "$temp_dir/$tarball_name"
echo "Tarball '$TARBALL_NAME' doesn't exist. Will attempt to download from blobstorage."
if ! wget -q "https://azurelinuxsrcstorage.blob.core.windows.net/sources/core/$TARBALL_NAME" -O "$TEMP_DIR/$TARBALL_NAME"
then
echo "ERROR: failed to download the source tarball."
exit 1
fi
echo "Download successful."
fi

pushd "$temp_dir" &> /dev/null
echo "Extracting $tarball_name."
tar -xf "$tarball_name"

pushd "$directory_name" &> /dev/null
echo "Fetching dependencies to a temporary cache."
CARGO_HOME=$(pwd)/.cargo cargo fetch
echo "Unpacking source tarball..."
tar -xf $SRC_TARBALL

echo "Vendor cargo ..."
DIRECTORY_NAME=($(ls -d */))

# assume there is only one directory in the tarball
DIRECTORY_NAME=${DIRECTORY_NAME[0]%//}

pushd "$DIRECTORY_NAME" &> /dev/null
echo "Fetching dependencies to a temporary cache in $DIRECTORY_NAME."

echo "Installing build prerequisites for AzureLinux..."
CURRENT_OS=$(grep '^ID=' /etc/os-release | cut -d'=' -f2-)
echo "Current OS: $CURRENT_OS" && \
if [ "$CURRENT_OS" = "mariner" ] || [ "$CURRENT_OS" = "azurelinux" ]; then
sudo dnf install -y rust
elif [ "$$CURRENT_OS" = "ubuntu" ]; then
sudo apt install -y rustc
else
$(call print_error,"Unsupported OS: $$CURRENT_OS") ;
fi

echo "Compressing the cache."
tar --sort=name --mtime="2021-04-26 00:00Z" --owner=0 --group=0 --numeric-owner --pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime -cf "$cache_tarball_name" .cargo
popd &> /dev/null
popd &> /dev/null
# assume there is only one Cargo.toml
TOML_LOCATION=$(find . -maxdepth 2 -name "Cargo.toml" -exec dirname {} \;)
pushd $TOML_LOCATION &> /dev/null
cargo vendor > config.toml

mv "$temp_dir/$directory_name/$cache_tarball_name" .
echo ""
echo "========================="
echo "Tar vendored tarball"
tar --sort=name \
--mtime="2021-04-26 00:00Z" \
--owner=0 --group=0 --numeric-owner \
--pax-option=exthdr.name=%d/PaxHeaders/%f,delete=atime,delete=ctime \
-I pigz -cf "$VENDOR_TARBALL" vendor

echo "Done:"
sha256sum "$cache_tarball_name"
cp $VENDOR_TARBALL $OUT_FOLDER
popd > /dev/null
echo "$NAME_VER vendored modules are available at $VENDOR_TARBALL"
Loading