mirror of
https://github.com/actions/runner.git
synced 2025-12-10 12:36:23 +00:00
361 lines
14 KiB
Bash
Executable File
361 lines
14 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
###############################################################################
|
|
#
|
|
# ./dev.sh build/layout/test/package [Debug/Release]
|
|
#
|
|
###############################################################################
|
|
|
|
set -e
|
|
|
|
DEV_CMD=$1
|
|
DEV_CONFIG=$2
|
|
DEV_TARGET_RUNTIME=$3
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
LAYOUT_DIR="$SCRIPT_DIR/../_layout"
|
|
LAYOUT_TRIMS_DIR="$SCRIPT_DIR/../_layout_trims"
|
|
LAYOUT_TRIM_EXTERNALS_DIR="$LAYOUT_TRIMS_DIR/trim_externals"
|
|
LAYOUT_TRIM_RUNTIME_DIR="$LAYOUT_TRIMS_DIR/trim_runtime"
|
|
LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR="$LAYOUT_TRIMS_DIR/trim_runtime_externals"
|
|
DOWNLOAD_DIR="$SCRIPT_DIR/../_downloads/netcore2x"
|
|
PACKAGE_DIR="$SCRIPT_DIR/../_package"
|
|
PACKAGE_TRIMS_DIR="$SCRIPT_DIR/../_package_trims"
|
|
DOTNETSDK_ROOT="$SCRIPT_DIR/../_dotnetsdk"
|
|
DOTNETSDK_VERSION="6.0.300"
|
|
DOTNETSDK_INSTALLDIR="$DOTNETSDK_ROOT/$DOTNETSDK_VERSION"
|
|
RUNNER_VERSION=$(cat runnerversion)
|
|
|
|
pushd "$SCRIPT_DIR"
|
|
|
|
BUILD_CONFIG="Debug"
|
|
if [[ "$DEV_CONFIG" == "Release" ]]; then
|
|
BUILD_CONFIG="Release"
|
|
fi
|
|
|
|
CURRENT_PLATFORM="windows"
|
|
if [[ ($(uname) == "Linux") || ($(uname) == "Darwin") ]]; then
|
|
CURRENT_PLATFORM=$(uname | awk '{print tolower($0)}')
|
|
fi
|
|
|
|
if [[ "$CURRENT_PLATFORM" == 'windows' ]]; then
|
|
RUNTIME_ID='win-x64'
|
|
if [[ "$PROCESSOR_ARCHITECTURE" == 'x86' ]]; then
|
|
RUNTIME_ID='win-x86'
|
|
fi
|
|
elif [[ "$CURRENT_PLATFORM" == 'linux' ]]; then
|
|
RUNTIME_ID="linux-x64"
|
|
if command -v uname > /dev/null; then
|
|
CPU_NAME=$(uname -m)
|
|
case $CPU_NAME in
|
|
armv7l) RUNTIME_ID="linux-arm";;
|
|
aarch64) RUNTIME_ID="linux-arm64";;
|
|
esac
|
|
fi
|
|
elif [[ "$CURRENT_PLATFORM" == 'darwin' ]]; then
|
|
RUNTIME_ID='osx-x64'
|
|
if command -v uname > /dev/null; then
|
|
CPU_NAME=$(uname -m)
|
|
case $CPU_NAME in
|
|
arm64) RUNTIME_ID="osx-arm64";;
|
|
esac
|
|
fi
|
|
fi
|
|
|
|
if [[ -n "$DEV_TARGET_RUNTIME" ]]; then
|
|
RUNTIME_ID="$DEV_TARGET_RUNTIME"
|
|
fi
|
|
|
|
# Make sure current platform support publish the dotnet runtime
|
|
# Windows can publish win-x86/x64
|
|
# Linux can publish linux-x64/arm/arm64
|
|
# OSX can publish osx-x64/arm64
|
|
if [[ "$CURRENT_PLATFORM" == 'windows' ]]; then
|
|
if [[ ("$RUNTIME_ID" != 'win-x86') && ("$RUNTIME_ID" != 'win-x64') ]]; then
|
|
echo "Failed: Can't build $RUNTIME_ID package $CURRENT_PLATFORM" >&2
|
|
exit 1
|
|
fi
|
|
elif [[ "$CURRENT_PLATFORM" == 'linux' ]]; then
|
|
if [[ ("$RUNTIME_ID" != 'linux-x64') && ("$RUNTIME_ID" != 'linux-x86') && ("$RUNTIME_ID" != 'linux-arm64') && ("$RUNTIME_ID" != 'linux-arm') ]]; then
|
|
echo "Failed: Can't build $RUNTIME_ID package $CURRENT_PLATFORM" >&2
|
|
exit 1
|
|
fi
|
|
elif [[ "$CURRENT_PLATFORM" == 'darwin' ]]; then
|
|
if [[ ("$RUNTIME_ID" != 'osx-x64') && ("$RUNTIME_ID" != 'osx-arm64') ]]; then
|
|
echo "Failed: Can't build $RUNTIME_ID package $CURRENT_PLATFORM" >&2
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
function failed()
|
|
{
|
|
local error=${1:-Undefined error}
|
|
echo "Failed: $error" >&2
|
|
popd
|
|
exit 1
|
|
}
|
|
|
|
function warn()
|
|
{
|
|
local error=${1:-Undefined error}
|
|
echo "WARNING - FAILED: $error" >&2
|
|
}
|
|
|
|
function checkRC() {
|
|
local rc=$?
|
|
if [ $rc -ne 0 ]; then
|
|
failed "${1} Failed with return code $rc"
|
|
fi
|
|
}
|
|
|
|
function heading()
|
|
{
|
|
echo
|
|
echo
|
|
echo "-----------------------------------------"
|
|
echo " ${1}"
|
|
echo "-----------------------------------------"
|
|
}
|
|
|
|
function build ()
|
|
{
|
|
heading "Building ..."
|
|
dotnet msbuild -t:Build -p:PackageRuntime="${RUNTIME_ID}" -p:BUILDCONFIG="${BUILD_CONFIG}" -p:RunnerVersion="${RUNNER_VERSION}" ./dir.proj || failed build
|
|
}
|
|
|
|
function layout ()
|
|
{
|
|
heading "Create layout ..."
|
|
dotnet msbuild -t:layout -p:PackageRuntime="${RUNTIME_ID}" -p:BUILDCONFIG="${BUILD_CONFIG}" -p:RunnerVersion="${RUNNER_VERSION}" ./dir.proj || failed build
|
|
|
|
#change execution flag to allow running with sudo
|
|
if [[ ("$CURRENT_PLATFORM" == "linux") || ("$CURRENT_PLATFORM" == "darwin") ]]; then
|
|
chmod +x "${LAYOUT_DIR}/bin/Runner.Listener"
|
|
chmod +x "${LAYOUT_DIR}/bin/Runner.Worker"
|
|
chmod +x "${LAYOUT_DIR}/bin/Runner.PluginHost"
|
|
chmod +x "${LAYOUT_DIR}/bin/installdependencies.sh"
|
|
chmod +x "${LAYOUT_DIR}/safe_sleep.sh"
|
|
fi
|
|
|
|
heading "Setup externals folder for $RUNTIME_ID runner's layout"
|
|
bash ./Misc/externals.sh $RUNTIME_ID || checkRC externals.sh
|
|
|
|
heading "Create layout (Trimmed) ..."
|
|
|
|
rm -Rf "$LAYOUT_TRIMS_DIR"
|
|
mkdir -p "$LAYOUT_TRIMS_DIR"
|
|
mkdir -p "$LAYOUT_TRIMS_DIR/runtime"
|
|
cp -r "$LAYOUT_DIR/bin/." "$LAYOUT_TRIMS_DIR/runtime"
|
|
mkdir -p "$LAYOUT_TRIMS_DIR/externals"
|
|
cp -r "$LAYOUT_DIR/externals/." "$LAYOUT_TRIMS_DIR/externals"
|
|
|
|
pushd "$LAYOUT_TRIMS_DIR/runtime" > /dev/null
|
|
if [[ ("$CURRENT_PLATFORM" == "windows") ]]; then
|
|
sed -i 's/\n$/\r\n/' "$SCRIPT_DIR/Misc/runnercoreassets"
|
|
fi
|
|
|
|
cat "$SCRIPT_DIR/Misc/runnercoreassets" | xargs rm -f
|
|
find . -empty -type d -delete
|
|
find . -type f > "$LAYOUT_TRIMS_DIR/runnerdotnetruntimeassets"
|
|
popd > /dev/null
|
|
|
|
heading "Create layout with externals trimmed ..."
|
|
mkdir -p "$LAYOUT_TRIM_EXTERNALS_DIR"
|
|
cp -r "$LAYOUT_DIR/." "$LAYOUT_TRIM_EXTERNALS_DIR/"
|
|
rm -Rf "$LAYOUT_TRIM_EXTERNALS_DIR/externals"
|
|
echo "Created... $LAYOUT_TRIM_EXTERNALS_DIR"
|
|
|
|
heading "Create layout with dotnet runtime trimmed ..."
|
|
mkdir -p "$LAYOUT_TRIM_RUNTIME_DIR"
|
|
cp -r "$LAYOUT_DIR/." "$LAYOUT_TRIM_RUNTIME_DIR/"
|
|
pushd "$LAYOUT_TRIM_RUNTIME_DIR/bin" > /dev/null
|
|
cat "$LAYOUT_TRIMS_DIR/runnerdotnetruntimeassets" | xargs rm -f
|
|
echo "Created... $LAYOUT_TRIM_RUNTIME_DIR"
|
|
popd > /dev/null
|
|
|
|
heading "Create layout with externals and dotnet runtime trimmed ..."
|
|
mkdir -p "$LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR"
|
|
cp -r "$LAYOUT_DIR/." "$LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR/"
|
|
rm -Rf "$LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR/externals"
|
|
pushd "$LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR/bin" > /dev/null
|
|
cat "$LAYOUT_TRIMS_DIR/runnerdotnetruntimeassets" | xargs rm -f
|
|
echo "Created... $LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR"
|
|
popd > /dev/null
|
|
}
|
|
|
|
function runtest ()
|
|
{
|
|
heading "Testing ..."
|
|
|
|
if [[ ("$CURRENT_PLATFORM" == "linux") || ("$CURRENT_PLATFORM" == "darwin") ]]; then
|
|
ulimit -n 1024
|
|
fi
|
|
|
|
dotnet msbuild -t:test -p:PackageRuntime="${RUNTIME_ID}" -p:BUILDCONFIG="${BUILD_CONFIG}" -p:RunnerVersion="${RUNNER_VERSION}" ./dir.proj || failed "failed tests"
|
|
}
|
|
|
|
function package ()
|
|
{
|
|
if [ ! -d "${LAYOUT_DIR}/bin" ]; then
|
|
echo "You must build first. Expecting to find ${LAYOUT_DIR}/bin"
|
|
fi
|
|
|
|
# TODO: We are cross-compiling arm on x64 so we cant exec Runner.Listener. Remove after building on native arm host
|
|
runner_ver=$("${LAYOUT_DIR}/bin/Runner.Listener" --version) || runner_ver=$(cat runnerversion) || failed "version"
|
|
runner_pkg_name="actions-runner-${RUNTIME_ID}-${runner_ver}"
|
|
|
|
heading "Packaging ${runner_pkg_name}"
|
|
|
|
rm -Rf "${LAYOUT_DIR:?}/_diag"
|
|
find "${LAYOUT_DIR}/bin" -type f -name '*.pdb' -delete
|
|
|
|
mkdir -p "$PACKAGE_DIR"
|
|
mkdir -p "$PACKAGE_TRIMS_DIR"
|
|
rm -Rf "${PACKAGE_DIR:?}"/*
|
|
rm -Rf "${PACKAGE_TRIMS_DIR:?}"/*
|
|
|
|
pushd "$PACKAGE_DIR" > /dev/null
|
|
|
|
if [[ ("$CURRENT_PLATFORM" == "linux") || ("$CURRENT_PLATFORM" == "darwin") ]]; then
|
|
tar_name="${runner_pkg_name}.tar.gz"
|
|
echo "Creating $tar_name in ${LAYOUT_DIR}"
|
|
tar -czf "${tar_name}" -C "${LAYOUT_DIR}" .
|
|
elif [[ ("$CURRENT_PLATFORM" == "windows") ]]; then
|
|
zip_name="${runner_pkg_name}.zip"
|
|
echo "Convert ${LAYOUT_DIR} to Windows style path"
|
|
window_path=${LAYOUT_DIR:1}
|
|
window_path=${window_path:0:1}:${window_path:1}
|
|
echo "Creating $zip_name in ${window_path}"
|
|
powershell -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command "Add-Type -Assembly \"System.IO.Compression.FileSystem\"; [System.IO.Compression.ZipFile]::CreateFromDirectory(\"${window_path}\", \"${zip_name}\")"
|
|
fi
|
|
|
|
popd > /dev/null
|
|
|
|
runner_trim_externals_pkg_name="actions-runner-${RUNTIME_ID}-${runner_ver}-noexternals"
|
|
heading "Packaging ${runner_trim_externals_pkg_name} (Trimmed)"
|
|
|
|
PACKAGE_TRIM_EXTERNALS_DIR="$PACKAGE_TRIMS_DIR/trim_externals"
|
|
mkdir -p "$PACKAGE_TRIM_EXTERNALS_DIR"
|
|
pushd "$PACKAGE_TRIM_EXTERNALS_DIR" > /dev/null
|
|
if [[ ("$CURRENT_PLATFORM" == "linux") || ("$CURRENT_PLATFORM" == "darwin") ]]; then
|
|
tar_name="${runner_trim_externals_pkg_name}.tar.gz"
|
|
echo "Creating $tar_name in ${LAYOUT_TRIM_EXTERNALS_DIR}"
|
|
tar -czf "${tar_name}" -C "${LAYOUT_TRIM_EXTERNALS_DIR}" .
|
|
elif [[ ("$CURRENT_PLATFORM" == "windows") ]]; then
|
|
zip_name="${runner_trim_externals_pkg_name}.zip"
|
|
echo "Convert ${LAYOUT_TRIM_EXTERNALS_DIR} to Windows style path"
|
|
window_path=${LAYOUT_TRIM_EXTERNALS_DIR:1}
|
|
window_path=${window_path:0:1}:${window_path:1}
|
|
echo "Creating $zip_name in ${window_path}"
|
|
powershell -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command "Add-Type -Assembly \"System.IO.Compression.FileSystem\"; [System.IO.Compression.ZipFile]::CreateFromDirectory(\"${window_path}\", \"${zip_name}\")"
|
|
fi
|
|
popd > /dev/null
|
|
|
|
runner_trim_runtime_pkg_name="actions-runner-${RUNTIME_ID}-${runner_ver}-noruntime"
|
|
heading "Packaging ${runner_trim_runtime_pkg_name} (Trimmed)"
|
|
|
|
PACKAGE_TRIM_RUNTIME_DIR="$PACKAGE_TRIMS_DIR/trim_runtime"
|
|
mkdir -p "$PACKAGE_TRIM_RUNTIME_DIR"
|
|
pushd "$PACKAGE_TRIM_RUNTIME_DIR" > /dev/null
|
|
if [[ ("$CURRENT_PLATFORM" == "linux") || ("$CURRENT_PLATFORM" == "darwin") ]]; then
|
|
tar_name="${runner_trim_runtime_pkg_name}.tar.gz"
|
|
echo "Creating $tar_name in ${LAYOUT_TRIM_RUNTIME_DIR}"
|
|
tar -czf "${tar_name}" -C "${LAYOUT_TRIM_RUNTIME_DIR}" .
|
|
elif [[ ("$CURRENT_PLATFORM" == "windows") ]]; then
|
|
zip_name="${runner_trim_runtime_pkg_name}.zip"
|
|
echo "Convert ${LAYOUT_TRIM_RUNTIME_DIR} to Windows style path"
|
|
window_path=${LAYOUT_TRIM_RUNTIME_DIR:1}
|
|
window_path=${window_path:0:1}:${window_path:1}
|
|
echo "Creating $zip_name in ${window_path}"
|
|
powershell -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command "Add-Type -Assembly \"System.IO.Compression.FileSystem\"; [System.IO.Compression.ZipFile]::CreateFromDirectory(\"${window_path}\", \"${zip_name}\")"
|
|
fi
|
|
popd > /dev/null
|
|
|
|
runner_trim_runtime_externals_pkg_name="actions-runner-${RUNTIME_ID}-${runner_ver}-noruntime-noexternals"
|
|
heading "Packaging ${runner_trim_runtime_externals_pkg_name} (Trimmed)"
|
|
|
|
PACKAGE_TRIM_RUNTIME_EXTERNALS_DIR="$PACKAGE_TRIMS_DIR/trim_runtime_externals"
|
|
mkdir -p "$PACKAGE_TRIM_RUNTIME_EXTERNALS_DIR"
|
|
pushd "$PACKAGE_TRIM_RUNTIME_EXTERNALS_DIR" > /dev/null
|
|
if [[ ("$CURRENT_PLATFORM" == "linux") || ("$CURRENT_PLATFORM" == "darwin") ]]; then
|
|
tar_name="${runner_trim_runtime_externals_pkg_name}.tar.gz"
|
|
echo "Creating $tar_name in ${LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR}"
|
|
tar -czf "${tar_name}" -C "${LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR}" .
|
|
elif [[ ("$CURRENT_PLATFORM" == "windows") ]]; then
|
|
zip_name="${runner_trim_runtime_externals_pkg_name}.zip"
|
|
echo "Convert ${LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR} to Windows style path"
|
|
window_path=${LAYOUT_TRIM_RUNTIME_EXTERNALS_DIR:1}
|
|
window_path=${window_path:0:1}:${window_path:1}
|
|
echo "Creating $zip_name in ${window_path}"
|
|
powershell -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command "Add-Type -Assembly \"System.IO.Compression.FileSystem\"; [System.IO.Compression.ZipFile]::CreateFromDirectory(\"${window_path}\", \"${zip_name}\")"
|
|
fi
|
|
popd > /dev/null
|
|
}
|
|
|
|
if [[ (! -d "${DOTNETSDK_INSTALLDIR}") || (! -e "${DOTNETSDK_INSTALLDIR}/.${DOTNETSDK_VERSION}") || (! -e "${DOTNETSDK_INSTALLDIR}/dotnet") ]]; then
|
|
|
|
# Download dotnet SDK to ../_dotnetsdk directory
|
|
heading "Ensure Dotnet SDK"
|
|
|
|
# _dotnetsdk
|
|
# \1.0.x
|
|
# \dotnet
|
|
# \.1.0.x
|
|
echo "Download dotnetsdk into ${DOTNETSDK_INSTALLDIR}"
|
|
rm -Rf "${DOTNETSDK_DIR}"
|
|
|
|
# run dotnet-install.ps1 on windows, dotnet-install.sh on linux
|
|
if [[ ("$CURRENT_PLATFORM" == "windows") ]]; then
|
|
echo "Convert ${DOTNETSDK_INSTALLDIR} to Windows style path"
|
|
sdkinstallwindow_path=${DOTNETSDK_INSTALLDIR:1}
|
|
sdkinstallwindow_path=${sdkinstallwindow_path:0:1}:${sdkinstallwindow_path:1}
|
|
powershell -NoLogo -Sta -NoProfile -NonInteractive -ExecutionPolicy Unrestricted -Command "& \"./Misc/dotnet-install.ps1\" -Version ${DOTNETSDK_VERSION} -InstallDir \"${sdkinstallwindow_path}\" -NoPath; exit \$LastExitCode;" || checkRC dotnet-install.ps1
|
|
else
|
|
bash ./Misc/dotnet-install.sh --version ${DOTNETSDK_VERSION} --install-dir "${DOTNETSDK_INSTALLDIR}" --no-path || checkRC dotnet-install.sh
|
|
fi
|
|
|
|
echo "${DOTNETSDK_VERSION}" > "${DOTNETSDK_INSTALLDIR}/.${DOTNETSDK_VERSION}"
|
|
fi
|
|
|
|
echo "Prepend ${DOTNETSDK_INSTALLDIR} to %PATH%"
|
|
export PATH=${DOTNETSDK_INSTALLDIR}:$PATH
|
|
|
|
heading "Dotnet SDK Version"
|
|
dotnet --version
|
|
|
|
heading "Pre-cache external resources for $RUNTIME_ID package ..."
|
|
bash ./Misc/externals.sh $RUNTIME_ID "Pre-Cache" || checkRC "externals.sh Pre-Cache"
|
|
|
|
if [[ "$CURRENT_PLATFORM" == 'windows' ]]; then
|
|
vswhere=$(find "$DOWNLOAD_DIR" -name vswhere.exe | head -1)
|
|
vs_location=$("$vswhere" -prerelease -latest -property installationPath)
|
|
msbuild_location="$vs_location""\MSBuild\15.0\Bin\msbuild.exe"
|
|
|
|
if [[ ! -e "${msbuild_location}" ]]; then
|
|
msbuild_location="$vs_location""\MSBuild\Current\Bin\msbuild.exe"
|
|
|
|
if [[ ! -e "${msbuild_location}" ]]; then
|
|
failed "Can not find msbuild location, failing build"
|
|
fi
|
|
fi
|
|
|
|
export DesktopMSBuild="$msbuild_location"
|
|
fi
|
|
|
|
case $DEV_CMD in
|
|
"build") build;;
|
|
"b") build;;
|
|
"test") runtest;;
|
|
"t") runtest;;
|
|
"layout") layout;;
|
|
"l") layout;;
|
|
"package") package;;
|
|
"p") package;;
|
|
*) echo "Invalid cmd. Use build(b), test(t), layout(l) or package(p)";;
|
|
esac
|
|
|
|
popd
|
|
echo
|
|
echo Done.
|
|
echo
|