cibuild.sh 6.5 KB
Newer Older
1
#!/usr/bin/env bash
J
jaredpar 已提交
2

D
Drew DeVault 已提交
3 4 5 6 7 8 9
usage()
{
    echo "Runs our integration suite on Linux"
    echo "usage: cibuild.sh [options]"
    echo ""
    echo "Options"
    echo "  --mono-path <path>  Path to the mono installation to use for the run" 
10
    echo "  --os <os>           OS to run (Linux / Darwin)"
D
Drew DeVault 已提交
11 12
}

T
Tanner Gooding 已提交
13
XUNIT_VERSION=2.1.0
14
BUILD_CONFIGURATION=Debug
J
jaredpar 已提交
15
OS_NAME=$(uname -s)
J
Jared Parsons 已提交
16
USE_CACHE=true
17
MONO_ARGS='--debug=mdb-optimizations --attach=disable'
J
jaredpar 已提交
18

J
Jared Parsons 已提交
19 20
export MONO_THREADS_PER_CPU=50

21 22 23 24 25
# There are some stability issues that are causing Jenkins builds to fail at an 
# unacceptable rate.  To temporarily work around that we are going to retry the 
# unstable tasks a number of times.  
RETRY_COUNT=5

J
jaredpar 已提交
26 27 28 29 30 31 32 33 34 35 36 37
while [[ $# > 0 ]]
do
    opt="$1"
    case $opt in
        -h|--help)
        usage
        exit 1
        ;;
        --mono-path)
        CUSTOM_MONO_PATH=$2
        shift 2
        ;;
J
jaredpar 已提交
38 39 40 41
        --os)
        OS_NAME=$2
        shift 2
        ;;
42 43 44 45 46 47 48 49
        --debug)
        BUILD_CONFIGURATION=Debug
        shift 1
        ;;
        --release)
        BUILD_CONFIGURATION=Release
        shift 1
        ;;
J
Jared Parsons 已提交
50 51 52 53
        --nocache)
        USE_CACHE=false
        shift 1
        ;;
J
jaredpar 已提交
54 55 56 57 58 59 60
        *)
        usage 
        exit 1
        ;;
    esac
done

61 62
restore_nuget()
{
T
Tomas Matousek 已提交
63
    local package_name="nuget.stabilization.27.zip"
64
    local target="/tmp/$package_name"
A
Andy Gocke 已提交
65 66
    echo "Installing NuGet Packages $target"
    if [ -f $target ]; then
67 68 69 70 71 72
        if [ "$USE_CACHE" = "true" ]; then
            echo "Already installed"
            return
        fi
    fi

73
    pushd /tmp/
74 75 76

    rm $package_name 2>/dev/null
    curl -O https://dotnetci.blob.core.windows.net/roslyn/$package_name
77
    unzip -uoq $package_name -d ~/
78 79 80 81 82 83
    if [ $? -ne 0 ]; then
        echo "Unable to download NuGet packages"
        exit 1
    fi

    popd
84

85 86
}

87
run_msbuild()
J
jaredpar 已提交
88
{
89 90 91 92
    local is_good=false
    
    for i in `seq 1 $RETRY_COUNT`
    do
93
        mono $MONO_ARGS ~/.nuget/packages/Microsoft.Build.Mono.Debug/14.1.0-prerelease/lib/MSBuild.exe /v:m /p:SignAssembly=false /p:DebugSymbols=false "$@"
94 95 96 97 98 99 100 101 102 103
        if [ $? -eq 0 ]; then
            is_good=true
            break
        fi

        echo Build retry $i
    done

    if [ "$is_good" != "true" ]; then
        echo Build failed
J
jaredpar 已提交
104 105 106 107
        exit 1
    fi
}

J
jaredpar 已提交
108 109 110 111
# NuGet crashes on occasion during restore.  This isn't a fatal action so 
# we re-run it a number of times.  
run_nuget()
{
112 113 114
    local is_good=false
    for i in `seq 1 $RETRY_COUNT`
    do
J
Jared Parsons 已提交
115
        mono $MONO_ARGS .nuget/NuGet.exe "$@"
J
jaredpar 已提交
116
        if [ $? -eq 0 ]; then
117 118
            is_good=true
            break
J
jaredpar 已提交
119 120 121
        fi
    done

122 123
    if [ "$is_good" != "true" ]; then
        echo NuGet failed
J
jaredpar 已提交
124 125 126 127
        exit 1
    fi
}

J
Jared Parsons 已提交
128
# Run the compilation.  Can pass additional build arguments as parameters
J
jaredpar 已提交
129 130 131
compile_toolset()
{
    echo Compiling the toolset compilers
J
Jared Parsons 已提交
132
    echo -e "Compiling the C# compiler"
A
Andy Gocke 已提交
133
    run_msbuild src/Compilers/CSharp/CscCore/CscCore.csproj /p:Configuration=$BUILD_CONFIGURATION
J
Jared Parsons 已提交
134
    echo -e "Compiling the VB compiler"
A
Andy Gocke 已提交
135
    run_msbuild src/Compilers/VisualBasic/VbcCore/VbcCore.csproj /p:Configuration=$BUILD_CONFIGURATION
J
jaredpar 已提交
136 137
}

138
# Save the toolset binaries from Binaries/BUILD_CONFIGURATION to Binaries/Bootstrap
J
jaredpar 已提交
139 140 141
save_toolset()
{
    mkdir Binaries/Bootstrap
A
Andy Gocke 已提交
142
    cp Binaries/$BUILD_CONFIGURATION/core-clr/* Binaries/Bootstrap
J
jaredpar 已提交
143 144 145 146 147 148 149
}

# Clean out all existing binaries.  This ensures the bootstrap phase forces
# a rebuild instead of picking up older binaries.
clean_roslyn()
{
    echo Cleaning the enlistment
150
    mono $MONO_ARGS ~/.nuget/packages/Microsoft.Build.Mono.Debug/14.1.0-prerelease/lib/MSBuild.exe /v:m /t:Clean build/Toolset.sln /p:Configuration=$BUILD_CONFIGURATION
151
    rm -rf Binaries/$BUILD_CONFIGURATION
J
jaredpar 已提交
152 153 154
}

build_roslyn()
155
{    
A
Andy Gocke 已提交
156 157 158
    local bootstrapArg=""

    if [ "$OS_NAME" == "Linux" ]; then
J
Jared Parsons 已提交
159
        bootstrapArg="/p:CscToolPath=$(pwd)/Binaries/Bootstrap /p:CscToolExe=csc \
J
Jared Parsons 已提交
160
/p:VbcToolPath=$(pwd)/Binaries/Bootstrap /p:VbcToolExe=vbc"
A
Andy Gocke 已提交
161
    fi
J
jaredpar 已提交
162

J
Jared Parsons 已提交
163
    echo Building CrossPlatform.sln
164
    run_msbuild $bootstrapArg CrossPlatform.sln /p:Configuration=$BUILD_CONFIGURATION
J
jaredpar 已提交
165 166
}

J
jaredpar 已提交
167 168 169
# Install the specified Mono toolset from our Azure blob storage.
install_mono_toolset()
{
170
    local target=/tmp/$1
J
jaredpar 已提交
171
    echo "Installing Mono toolset $1"
172

173
    if [ -d $target ]; then
J
Jared Parsons 已提交
174 175 176 177
        if [ "$USE_CACHE" = "true" ]; then
            echo "Already installed"
            return
        fi
J
jaredpar 已提交
178 179 180 181
    fi

    pushd /tmp

182
    rm -r $target 2>/dev/null
J
Jared Parsons 已提交
183
    rm $1.tar.bz2 2>/dev/null
J
jaredpar 已提交
184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209
    curl -O https://dotnetci.blob.core.windows.net/roslyn/$1.tar.bz2
    tar -jxf $1.tar.bz2
    if [ $? -ne 0 ]; then
        echo "Unable to download toolset"
        exit 1
    fi

    popd
}

# This function will update the PATH variable to put the desired
# version of Mono ahead of the system one. 
set_mono_path()
{
    if [ "$CUSTOM_MONO_PATH" != "" ]; then
        if [ ! -d "$CUSTOM_MONO_PATH" ]; then
            echo "Not a valid directory $CUSTOM_MONO_PATH"
            exit 1
        fi
  
        echo "Using mono path $CUSTOM_MONO_PATH"
        PATH=$CUSTOM_MONO_PATH:$PATH
        return
    fi

    if [ "$OS_NAME" = "Darwin" ]; then
210
        MONO_TOOLSET_NAME=mono.mac.3
J
jaredpar 已提交
211
    elif [ "$OS_NAME" = "Linux" ]; then
A
Andy Gocke 已提交
212
        MONO_TOOLSET_NAME=mono.linux.3
J
jaredpar 已提交
213 214 215 216 217 218 219 220 221
    else
        echo "Error: Unsupported OS $OS_NAME"
        exit 1
    fi

    install_mono_toolset $MONO_TOOLSET_NAME
    PATH=/tmp/$MONO_TOOLSET_NAME/bin:$PATH
}

J
jaredpar 已提交
222 223
test_roslyn()
{
224
    local xunit_runner=~/.nuget/packages/xunit.runner.console/$XUNIT_VERSION/tools/xunit.console.x86.exe
225 226
    local test_binaries=(
        Roslyn.Compilers.CSharp.CommandLine.UnitTests
J
jaredpar 已提交
227 228 229
        Roslyn.Compilers.CSharp.Syntax.UnitTests
        Roslyn.Compilers.CSharp.Semantic.UnitTests
        Roslyn.Compilers.CSharp.Symbol.UnitTests
230 231
        Roslyn.Compilers.VisualBasic.Syntax.UnitTests)
    local any_failed=false
J
jaredpar 已提交
232

J
Jared Parsons 已提交
233 234 235 236
    # Need to copy over the execution dependencies.  This isn't being done correctly
    # by msbuild at the moment. 
    cp ~/.nuget/packages/xunit.extensibility.execution/$XUNIT_VERSION/lib/net45/xunit.execution.desktop.* Binaries/$BUILD_CONFIGURATION

237 238
    for i in "${test_binaries[@]}"
    do
239 240
        mkdir -p Binaries/$BUILD_CONFIGURATION/xUnitResults/
        mono $MONO_ARGS $xunit_runner Binaries/$BUILD_CONFIGURATION/$i.dll -xml Binaries/$BUILD_CONFIGURATION/xUnitResults/$i.dll.xml -noshadow
241 242 243 244
        if [ $? -ne 0 ]; then
            any_failed=true
        fi
    done
J
jaredpar 已提交
245

246 247
    if [ "$any_failed" = "true" ]; then
        echo Unit test failed
J
jaredpar 已提交
248
        exit 1
J
jaredpar 已提交
249
    fi
J
Jared Parsons 已提交
250 251
}

J
Jared Parsons 已提交
252 253 254
echo Clean out the enlistment
git clean -dxf . 

255
restore_nuget
J
Jared Parsons 已提交
256 257
set_mono_path
which mono
J
jaredpar 已提交
258 259 260 261
compile_toolset
save_toolset
clean_roslyn
build_roslyn
J
jaredpar 已提交
262
test_roslyn
J
jaredpar 已提交
263