tasks/building.tasks.ps1

# Control flags
$CleanBuild = $false

# Options
$FoldersToClean = @("bin", "obj", "TestResults", "_codeCoverage", "_packages")

# Synopsis: Clean .NET solution
task CleanSolution -If {$CleanBuild -and $SolutionToBuild} {
    exec { 
        dotnet clean $SolutionToBuild `
                     --configuration $Configuration `
                     --verbosity $LogLevel
    }

    # Delete output folders
    Write-Build White "Deleting output folders..."
    $FoldersToClean | ForEach-Object {
        Get-ChildItem -Path (Split-Path -Parent $SolutionToBuild) `
                      -Filter $_ `
                      -Recurse `
            | Where-Object { $_.PSIsContainer }
    } | Remove-Item -Recurse -Force
}

# Synopsis: Build .NET solution
task BuildSolution -If {$SolutionToBuild} GitVersion,CleanSolution,RestorePackages,{
    exec { 
        dotnet build $SolutionToBuild `
                     --no-restore `
                     --configuration $Configuration `
                     /p:Version="$(($script:GitVersion).SemVer)" `
                     /p:EndjinRepositoryUrl="$BuildRepositoryUri" `
                     --verbosity $LogLevel
    }
}

# Synopsis: Restore .NET Solution Packages
task RestorePackages -If {$SolutionToBuild} CleanSolution,{
    exec { 
        dotnet restore $SolutionToBuild `
                       --verbosity $LogLevel
    }
}

# Synopsis: Build .NET solution packages
task BuildSolutionPackages -If {!$SkipSolutionPackages -and $SolutionToBuild} GitVersion,{
    exec { 
        dotnet pack $SolutionToBuild `
                    --configuration $Configuration `
                    --no-build `
                    --no-restore `
                    --output $PackagesDir `
                    /p:EndjinRepositoryUrl="$BuildRepositoryUri" `
                    /p:PackageVersion="$(($script:GitVersion).SemVer)" `
                    --verbosity $LogLevel
    }
}

# Synopsis: Build Container Images
task BuildContainerImages -If {!$SkipContainerImages -and $ContainersToBuild} GitVersion,{
    # ContainersToBuild must be an array of hashtables of the following structure:
    # @(
    # @{
    # Dockerfile = "<path-to-dockerfile>"
    # ImageName = "<container-image-name-without-tag>"
    # ContextDir = "<path-to-docker-build-context-dir>"
    # }
    # )

    foreach ($buildInfo in $ContainersToBuild) {
        $contextDir = $buildInfo.ContainsKey("ContextDir") ? $buildInfo.ContextDir : (Split-Path -Parent $buildInfo.Dockerfile)
        exec {
            docker build `
                -t ("{0}:{1}" -f $buildInfo.ImageName, ($script:GitVersion).SemVer) `
                -f $buildInfo.Dockerfile `
                $contextDir
        }
    }
}

# Synopsis: Lints Bicep files and builds the ARM template
task BuildBicepFiles {

    if (!$BicepOutputDir) { $BicepOutputDir = "./buildOutputs/ARM" }
    if (!(Test-Path $bicepOutputDir)) {
        New-Item -ItemType Directory -Path $bicepOutputDir | Out-Null
    }

    $bicepFilesToBuild = Get-ChildItem -Recurse -Filter *.bicep -Path $BicepModulesDir

    $failBuild = $false
    foreach ($bicepFile in $bicepFilesToBuild) {
        Write-Build White "Building $bicepFile..."
        & az bicep build -f $bicepFile --outdir $BicepOutputDir
        if ($LASTEXITCODE -ne 0)
        {
            $failBuild = $true
        }
    }

    if ($failBuild) {
        throw "Bicep build error(s) - check preceeding log messages"
    }
    else {
        Write-Build Green "Bicep files OK"
    }
}