cibuild.sh 6.1 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
}

13
XUNIT_VERSION=2.0.0-alpha-build2576
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()
{
61

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

72
    pushd /tmp/
73 74 75

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

    popd
83

84 85
}

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

        echo Build retry $i
    done

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

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

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

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

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

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

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

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

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

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

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

    pushd /tmp

181
    rm -r $target 2>/dev/null
J
Jared Parsons 已提交
182
    rm $1.tar.bz2 2>/dev/null
J
jaredpar 已提交
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 208
    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
209
        MONO_TOOLSET_NAME=mono.mac.3
J
jaredpar 已提交
210
    elif [ "$OS_NAME" = "Linux" ]; then
A
Andy Gocke 已提交
211
        MONO_TOOLSET_NAME=mono.linux.3
J
jaredpar 已提交
212 213 214 215 216 217 218 219 220
    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 已提交
221 222
test_roslyn()
{
223
    local xunit_runner=~/.nuget/packages/xunit.runners/$XUNIT_VERSION/tools/xunit.console.x86.exe
224 225
    local test_binaries=(
        Roslyn.Compilers.CSharp.CommandLine.UnitTests
J
jaredpar 已提交
226 227 228
        Roslyn.Compilers.CSharp.Syntax.UnitTests
        Roslyn.Compilers.CSharp.Semantic.UnitTests
        Roslyn.Compilers.CSharp.Symbol.UnitTests
229 230
        Roslyn.Compilers.VisualBasic.Syntax.UnitTests)
    local any_failed=false
J
jaredpar 已提交
231

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

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

J
Jared Parsons 已提交
246 247 248
echo Clean out the enlistment
git clean -dxf . 

249
restore_nuget
J
Jared Parsons 已提交
250 251
set_mono_path
which mono
J
jaredpar 已提交
252 253 254 255
compile_toolset
save_toolset
clean_roslyn
build_roslyn
J
jaredpar 已提交
256
test_roslyn
J
jaredpar 已提交
257