cibuild.sh 6.3 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

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

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

71
    pushd /tmp/
72 73 74

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

    popd
82

83 84
}

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

        echo Build retry $i
    done

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

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

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

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

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

# 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
148
    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
149
    rm -rf Binaries/$BUILD_CONFIGURATION
J
jaredpar 已提交
150 151 152
}

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

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

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

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

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

    pushd /tmp

180
    rm -r $target 2>/dev/null
J
Jared Parsons 已提交
181
    rm $1.tar.bz2 2>/dev/null
J
jaredpar 已提交
182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207
    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
208
        MONO_TOOLSET_NAME=mono.mac.3
J
jaredpar 已提交
209
    elif [ "$OS_NAME" = "Linux" ]; then
A
Andy Gocke 已提交
210
        MONO_TOOLSET_NAME=mono.linux.3
J
jaredpar 已提交
211 212 213 214 215 216 217 218 219
    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 已提交
220 221
test_roslyn()
{
222
    local xunit_runner=~/.nuget/packages/xunit.runner.console/$XUNIT_VERSION/tools/xunit.console.x86.exe
223 224
    local test_binaries=(
        Roslyn.Compilers.CSharp.CommandLine.UnitTests
J
jaredpar 已提交
225 226 227
        Roslyn.Compilers.CSharp.Syntax.UnitTests
        Roslyn.Compilers.CSharp.Semantic.UnitTests
        Roslyn.Compilers.CSharp.Symbol.UnitTests
228 229
        Roslyn.Compilers.VisualBasic.Syntax.UnitTests)
    local any_failed=false
J
jaredpar 已提交
230

J
Jared Parsons 已提交
231 232 233 234
    # 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

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

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

J
Jared Parsons 已提交
249 250 251
echo Clean out the enlistment
git clean -dxf . 

252
restore_nuget
J
Jared Parsons 已提交
253 254
set_mono_path
which mono
J
jaredpar 已提交
255 256 257 258
compile_toolset
save_toolset
clean_roslyn
build_roslyn
J
jaredpar 已提交
259
test_roslyn
J
jaredpar 已提交
260