From a3f4275b3097681ec3277ef2a97ed1fceb74e3be Mon Sep 17 00:00:00 2001 From: Stephan Date: Sun, 9 Jul 2017 18:45:29 +0200 Subject: [PATCH] U4-10006 - build docs --- build/BuildDocs.bat | 20 --- build/BuildDocs.ps1 | 114 ------------------ .../Umbraco.Build/Build-UmbracoDocs.ps1 | 110 +++++++++++++++++ .../Modules/Umbraco.Build/Umbraco.Build.psm1 | 80 ++++++------ build/Modules/Umbraco.Build/Utilities.ps1 | 37 ++++++ 5 files changed, 181 insertions(+), 180 deletions(-) delete mode 100644 build/BuildDocs.bat delete mode 100644 build/BuildDocs.ps1 create mode 100644 build/Modules/Umbraco.Build/Build-UmbracoDocs.ps1 diff --git a/build/BuildDocs.bat b/build/BuildDocs.bat deleted file mode 100644 index 9d0a04e1cd..0000000000 --- a/build/BuildDocs.bat +++ /dev/null @@ -1,20 +0,0 @@ -@ECHO OFF -SETLOCAL - -SET release=%1 -ECHO Installing Npm NuGet Package - -SET nuGetFolder=%CD%\..\src\packages\ -ECHO Configured packages folder: %nuGetFolder% -ECHO Current folder: %CD% - -%CD%\..\src\.nuget\NuGet.exe install Npm.js -OutputDirectory %nuGetFolder% -Verbosity quiet - -for /f "delims=" %%A in ('dir %nuGetFolder%node.js.* /b') do set "nodePath=%nuGetFolder%%%A\" -for /f "delims=" %%A in ('dir %nuGetFolder%npm.js.* /b') do set "npmPath=%nuGetFolder%%%A\tools\" - -ECHO Adding Npm and Node to path -REM SETLOCAL is on, so changes to the path not persist to the actual user's path -PATH=%npmPath%;%nodePath%;%PATH% - -Powershell.exe -ExecutionPolicy Unrestricted -File .\BuildDocs.ps1 \ No newline at end of file diff --git a/build/BuildDocs.ps1 b/build/BuildDocs.ps1 deleted file mode 100644 index 7b13f98ca4..0000000000 --- a/build/BuildDocs.ps1 +++ /dev/null @@ -1,114 +0,0 @@ -$PSScriptFilePath = (Get-Item $MyInvocation.MyCommand.Path); -$RepoRoot = (get-item $PSScriptFilePath).Directory.Parent.FullName; -$SolutionRoot = Join-Path -Path $RepoRoot "src"; -$ToolsRoot = Join-Path -Path $RepoRoot "tools"; -$DocFx = Join-Path -Path $ToolsRoot "docfx\docfx.exe" -$DocFxFolder = (Join-Path -Path $ToolsRoot "docfx") -$DocFxJson = Join-Path -Path $RepoRoot "apidocs\docfx.json" -$7Zip = Join-Path -Path $ToolsRoot "7zip\7za.exe" -$DocFxSiteOutput = Join-Path -Path $RepoRoot "apidocs\_site\*.*" -$NgDocsSiteOutput = Join-Path -Path $RepoRoot "src\Umbraco.Web.UI.Client\docs\api\*.*" -$ProgFiles86 = [Environment]::GetEnvironmentVariable("ProgramFiles(x86)"); -$MSBuild = "$ProgFiles86\MSBuild\14.0\Bin\MSBuild.exe" - - -################ Do the UI docs - -"Changing to Umbraco.Web.UI.Client folder" -cd .. -cd src\Umbraco.Web.UI.Client -Write-Host $(Get-Location) - -"Creating build folder so MSBuild doesn't run the whole grunt build" -if (-Not (Test-Path "build")) { - md "build" -} - -"Installing node" -# Check if Install-Product exists, should only exist on the build server -if (Get-Command Install-Product -errorAction SilentlyContinue) -{ - Install-Product node '' -} - -"Installing node modules" -& npm install - -"Installing grunt" -& npm install -g grunt-cli - -"Moving back to build folder" -cd .. -cd .. -cd build -Write-Host $(Get-Location) - - & grunt --gruntfile ../src/umbraco.web.ui.client/gruntfile.js docs - -# change baseUrl -$BaseUrl = "https://our.umbraco.org/apidocs/ui/" -$IndexPath = "../src/umbraco.web.ui.client/docs/api/index.html" -(Get-Content $IndexPath).replace('location.href.replace(rUrl, indexFile)', "`'" + $BaseUrl + "`'") | Set-Content $IndexPath -# zip it - -& $7Zip a -tzip ui-docs.zip $NgDocsSiteOutput -r - -################ Do the c# docs - -# Build the solution in debug mode -$SolutionPath = Join-Path -Path $SolutionRoot -ChildPath "umbraco.sln" - -# Go get nuget.exe if we don't hae it -$NuGet = "$ToolsRoot\nuget.exe" -$FileExists = Test-Path $NuGet -If ($FileExists -eq $False) { - Write-Host "Retrieving nuget.exe..." - $SourceNugetExe = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe" - Invoke-WebRequest $SourceNugetExe -OutFile $NuGet -} - -#restore nuget packages -Write-Host "Restoring nuget packages..." -& $NuGet restore $SolutionPath - -& $MSBuild "$SolutionPath" /p:Configuration=Debug /maxcpucount /t:Clean -if (-not $?) -{ - throw "The MSBuild process returned an error code." -} -& $MSBuild "$SolutionPath" /p:Configuration=Debug /maxcpucount -if (-not $?) -{ - throw "The MSBuild process returned an error code." -} - -# Go get docfx if we don't hae it -$FileExists = Test-Path $DocFx -If ($FileExists -eq $False) { - - If(!(Test-Path $DocFxFolder)) - { - New-Item $DocFxFolder -type directory - } - - $DocFxZip = Join-Path -Path $ToolsRoot "docfx\docfx.zip" - $DocFxSource = "https://github.com/dotnet/docfx/releases/download/v1.9.4/docfx.zip" - Invoke-WebRequest $DocFxSource -OutFile $DocFxZip - - #unzip it - & $7Zip e $DocFxZip "-o$DocFxFolder" -} - -#clear site -If(Test-Path(Join-Path -Path $RepoRoot "apidocs\_site")) -{ - Remove-Item $DocFxSiteOutput -recurse -} - -# run it! -& $DocFx metadata $DocFxJson -& $DocFx build $DocFxJson - -# zip it - -& $7Zip a -tzip csharp-docs.zip $DocFxSiteOutput -r diff --git a/build/Modules/Umbraco.Build/Build-UmbracoDocs.ps1 b/build/Modules/Umbraco.Build/Build-UmbracoDocs.ps1 new file mode 100644 index 0000000000..e9ee79408c --- /dev/null +++ b/build/Modules/Umbraco.Build/Build-UmbracoDocs.ps1 @@ -0,0 +1,110 @@ +# + +function Build-UmbracoDocs +{ + $uenv = Get-UmbracoBuildEnv + + $src = "$($uenv.SolutionRoot)\src" + $out = "$($uenv.SolutionRoot)\build.out" + $tmp = "$($uenv.SolutionRoot)\build.tmp" + + $buildTemp = "$PSScriptRoot\temp" + $cache = 2 + + Prepare-Build -keep $uenv + + ################ Do the UI docs + + # create Belle build folder, so that we don't cause a Belle rebuild + $belleBuildDir = "$src\Umbraco.Web.UI.Client\build" + if (-not (Test-Path $belleBuildDir)) + { + mkdir $belleBuildDir > $null + } + + Write-Host "Build UI documentation" + + push-location "$src\Umbraco.Web.UI.Client" + $p = $env:path + $env:path = $uenv.NpmPath + ";" + $uenv.NodePath + ";" + $env:path + + write "cache clean" > $tmp\belle-docs.log + &npm cache clean --quiet >> $tmp\belle-docs.log 2>&1 + &npm install --quiet >> $tmp\belle-docs.log 2>&1 + &npm install -g grunt-cli --quiet >> $tmp\belle-docs.log 2>&1 + #&npm install -g bower --quiet >> $tmp\belle.log 2>&1 + #&grunt build --buildversion=$version.Release >> $tmp\belle.log 2>&1 + &grunt --gruntfile "$src/Umbraco.Web.UI.Client/gruntfile.js" docs >> $tmp\belle-docs.log 2>&1 + + # fixme - should we filter the log to find errors? + #get-content .\build.tmp\belle-docs.log | %{ if ($_ -match "build") { write $_}} + + # change baseUrl + $baseUrl = "https://our.umbraco.org/apidocs/ui/" + $indexPath = "$src/Umbraco.Web.UI.Client/docs/api/index.html" + (Get-Content $indexPath).Replace("location.href.replace(rUrl, indexFile)", "'$baseUrl'") ` + | Set-Content $indexPath + + pop-location + $env:path = $p + + # zip + &$uenv.Zip a -tzip -r "$out\ui-docs.zip" "$src\Umbraco.Web.UI.Client\docs\api\*.*" ` + > $null + + ################ Do the c# docs + + Write-Host "Build C# documentation" + + # Build the solution in debug mode + # FIXME no only a simple compilation should be enough! + # FIXME we MUST handle msbuild & co error codes! + # FIXME deal with weird things in gitconfig? + #Build-Umbraco -Configuration Debug + Restore-NuGet $uenv + Compile-Umbraco $uenv "Debug" # FIXME different log file! + Restore-WebConfig "$src\Umbraco.Web.UI" + + # ensure we have docfx + Get-DocFx $uenv $buildTemp + + # clear + $docFxOutput = "$($uenv.SolutionRoot)\apidocs\_site" + if (test-path($docFxOutput)) + { + Remove-Directory $docFxOutput + } + + # run + $docFxJson = "$($uenv.SolutionRoot)\apidocs\docfx.json" + push-location "$($uenv.SolutionRoot)\build" # silly docfx.json wants this + + Write-Host "Run DocFx metadata" + Write-Host "Logging to $tmp\docfx.metadata.log" + &$uenv.DocFx metadata $docFxJson > "$tmp\docfx.metadata.log" + Write-Host "Run DocFx build" + Write-Host "Logging to $tmp\docfx.build.log" + &$uenv.DocFx build $docFxJson > "$tmp\docfx.build.log" + + pop-location + + # zip + &$uenv.Zip a -tzip -r "$out\csharp-docs.zip" "$docFxOutput\*.*" ` + > $null +} + +function Get-DocFx($uenv, $buildTemp) +{ + $docFx = "$buildTemp\docfx" + if (-not (test-path $docFx)) + { + Write-Host "Download DocFx..." + $source = "https://github.com/dotnet/docfx/releases/download/v2.19.2/docfx.zip" + $client = new-object Net.WebClient + $client.DownloadFile($source, "$buildTemp\docfx.zip") + + &$uenv.Zip x "$buildTemp\docfx.zip" -o"$buildTemp\docfx" -aos > $nul + Remove-File "$buildTemp\docfx.zip" + } + $uenv | add-member -memberType NoteProperty -name DocFx -value "$docFx\docfx.exe" +} \ No newline at end of file diff --git a/build/Modules/Umbraco.Build/Umbraco.Build.psm1 b/build/Modules/Umbraco.Build/Umbraco.Build.psm1 index 9cbf008fd6..e9190a9fe5 100644 --- a/build/Modules/Umbraco.Build/Umbraco.Build.psm1 +++ b/build/Modules/Umbraco.Build/Umbraco.Build.psm1 @@ -21,13 +21,19 @@ . "$PSScriptRoot\Set-UmbracoVersion.ps1" . "$PSScriptRoot\Get-UmbracoVersion.ps1" +. "$PSScriptRoot\Build-UmbracoDocs.ps1" + # # Prepares the build # function Prepare-Build { param ( - $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv) + $uenv, # an Umbraco build environment (see Get-UmbracoBuildEnv) + + [Alias("k")] + [switch] + $keep = $false ) Write-Host ">> Prepare Build" @@ -42,35 +48,18 @@ function Prepare-Build Remove-Directory "$src\Umbraco.Web.UI.Client\build" Remove-Directory "$src\Umbraco.Web.UI.Client\bower_components" - Remove-Directory "$tmp" - mkdir "$tmp" > $null - - Remove-Directory "$out" - mkdir "$out" > $null - - # prepare web.config - $webUi = "$src\Umbraco.Web.UI" - if (test-path "$webUi\web.config") + if (-not $keep) { - if (test-path "$webUi\web.config.temp-build") - { - Write-Host "Found existing web.config.temp-build" - $i = 0 - while (test-path "$webUi\web.config.temp-build.$i") - { - $i = $i + 1 - } - Write-Host "Save existing web.config as web.config.temp-build.$i" - Write-Host "(WARN: the original web.config.temp-build will be restored during post-build)" - mv "$webUi\web.config" "$webUi\web.config.temp-build.$i" - } - else - { - Write-Host "Save existing web.config as web.config.temp-build" - Write-Host "(will be restored during post-build)" - mv "$webUi\web.config" "$webUi\web.config.temp-build" - } + Remove-Directory "$tmp" + mkdir "$tmp" > $null + + Remove-Directory "$out" + mkdir "$out" > $null } + + # ensure proper web.config + $webUi = "$src\Umbraco.Web.UI" + Store-WebConfig $webUi Write-Host "Create clean web.config" Copy-File "$webUi\web.Template.config" "$webUi\web.config" } @@ -125,14 +114,13 @@ function Compile-Belle function Compile-Umbraco { param ( - $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv) + $uenv, # an Umbraco build environment (see Get-UmbracoBuildEnv) + [string] $buildConfiguration = "Release" ) $src = "$($uenv.SolutionRoot)\src" $tmp = "$($uenv.SolutionRoot)\build.tmp" $out = "$($uenv.SolutionRoot)\build.out" - - $buildConfiguration = "Release" if ($uenv.VisualStudio -eq $null) { @@ -224,7 +212,8 @@ function Compile-Tests $toolsVersion = "15.0" } - Write-Host ">> Compile Tests (logging to $tmp\msbuild.tests.log)" + Write-Host ">> Compile Tests" + Write-Host "Logging to $tmp\msbuild.tests.log" # beware of the weird double \\ at the end of paths # see http://edgylogic.com/blog/powershell-and-external-commands-done-right/ @@ -263,13 +252,7 @@ function Prepare-Packages $buildConfiguration = "Release" # restore web.config - $webUi = "$src\Umbraco.Web.UI" - if (test-path "$webUi\web.config.temp-build") - { - Write-Host "Restoring existing web.config" - Remove-File "$webUi\web.config" - mv "$webUi\web.config.temp-build" "$webUi\web.config" - } + Restore-WebConfig "$src\Umbraco.Web.UI" # cleanup build Write-Host "Clean build" @@ -403,11 +386,13 @@ function Restore-NuGet $uenv # an Umbraco build environment (see Get-UmbracoBuildEnv) ) - Write-Host ">> Restore NuGet" - $src = "$($uenv.SolutionRoot)\src" + $tmp = "$($uenv.SolutionRoot)\build.tmp" + + Write-Host ">> Restore NuGet" + Write-Host "Logging to $tmp\nuget.restore.log" - &$uenv.NuGet restore "$src\Umbraco.sln" + &$uenv.NuGet restore "$src\Umbraco.sln" > "$tmp\nuget.restore.log" } # @@ -451,11 +436,13 @@ function Build-Umbraco [CmdletBinding()] param ( [string] - $target = "all" + $target = "all", + [string] + $buildConfiguration = "Release" ) $target = $target.ToLowerInvariant() - Write-Host ">> Build-Umbraco <$target>" + Write-Host ">> Build-Umbraco <$target> <$configuration>" Write-Host "Get Build Environment" $uenv = Get-UmbracoBuildEnv @@ -495,7 +482,7 @@ function Build-Umbraco } elseif ($target -eq "compile-umbraco") { - Compile-Umbraco $uenv + Compile-Umbraco $uenv $buildConfiguration } elseif ($target -eq "pre-packages") { @@ -522,7 +509,7 @@ function Build-Umbraco Prepare-Build $uenv Restore-NuGet $uenv Compile-Belle $uenv $version - Compile-Umbraco $uenv + Compile-Umbraco $uenv $buildConfiguration Prepare-Tests $uenv Compile-Tests $uenv # not running tests... @@ -544,5 +531,6 @@ Export-ModuleMember -function Get-UmbracoBuildEnv Export-ModuleMember -function Set-UmbracoVersion Export-ModuleMember -function Get-UmbracoVersion Export-ModuleMember -function Build-Umbraco +Export-ModuleMember -function Build-UmbracoDocs #eof \ No newline at end of file diff --git a/build/Modules/Umbraco.Build/Utilities.ps1 b/build/Modules/Umbraco.Build/Utilities.ps1 index a90a85b11f..29b3c47429 100644 --- a/build/Modules/Umbraco.Build/Utilities.ps1 +++ b/build/Modules/Umbraco.Build/Utilities.ps1 @@ -81,3 +81,40 @@ function Replace-FileText($filename, $source, $replacement) $utf8bom = New-Object System.Text.UTF8Encoding $true [System.IO.File]::WriteAllText($filepath, $text, $utf8bom) } + +# store web.config +function Store-WebConfig($webUi) +{ + if (test-path "$webUi\web.config") + { + if (test-path "$webUi\web.config.temp-build") + { + Write-Host "Found existing web.config.temp-build" + $i = 0 + while (test-path "$webUi\web.config.temp-build.$i") + { + $i = $i + 1 + } + Write-Host "Save existing web.config as web.config.temp-build.$i" + Write-Host "(WARN: the original web.config.temp-build will be restored during post-build)" + mv "$webUi\web.config" "$webUi\web.config.temp-build.$i" + } + else + { + Write-Host "Save existing web.config as web.config.temp-build" + Write-Host "(will be restored during post-build)" + mv "$webUi\web.config" "$webUi\web.config.temp-build" + } + } +} + +# restore web.config +function Restore-WebConfig($webUi) +{ + if (test-path "$webUi\web.config.temp-build") + { + Write-Host "Restoring existing web.config" + Remove-File "$webUi\web.config" + mv "$webUi\web.config.temp-build" "$webUi\web.config" + } +} \ No newline at end of file