Azure pipeline refactor (#12428)

* Skip symbols for Umbraco.Templates

* Resolve some test issues

+ Fixed whitespace dependant tests to pass regardless of build OS vs
run OS.

+ Snap dictionary tests were failing when Configuration was release

+ Removed hardcoded baseUrl from one of the acceptance tests

* Move docfx setup to ./build and fix

* Update UI docs title

* Added dockerfile that can be used when running the acceptance tests.

* Take explicit dependency on System.Security.Cryptography.Pkcs

* Refactor ci/cd pipeline
This commit is contained in:
Paul Johnson
2022-05-19 09:02:50 +01:00
committed by GitHub
parent ee8359af75
commit c2d548039a
31 changed files with 679 additions and 1333 deletions

3
.artifactignore Normal file
View File

@@ -0,0 +1,3 @@
**/*
!**/bin/**
!**/obj/**

6
.gitignore vendored
View File

@@ -54,6 +54,10 @@ preserve.belle
/src/Umbraco.Web.UI.Docs/api/
/src/Umbraco.Web.UI.Docs/package-lock.json
# csharp-docs
/build/csharp-docs/api/
/build/csharp-docs/_site/
# Build
/build.out/
/build.tmp/
@@ -64,8 +68,6 @@ preserve.belle
/build/docs.zip
/build/ui-docs.zip
/build/csharp-docs.zip
/build/ApiDocs/
/src/ApiDocs/api/
/src/Umbraco.Cms.StaticAssets/wwwroot/umbraco/
# Environment specific data

View File

@@ -4,4 +4,15 @@
<ItemGroup>
<PackageReference Include="StyleCop.Analyzers" Version="1.2.0-beta.406" PrivateAssets="all" IsImplicitlyDefined="true" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Nerdbank.GitVersioning" Condition="!Exists('packages.config')">
<PrivateAssets>all</PrivateAssets>
<Version>3.5.103</Version>
</PackageReference>
<PackageReference Include="Umbraco.GitVersioning.Extensions" Version="0.1.0">
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
</Project>

File diff suppressed because it is too large Load Diff

View File

@@ -1,95 +0,0 @@
# this script should be dot-sourced into the build.ps1 scripts
# right after the parameters declaration
# ie
# . "$PSScriptRoot\build-bootstrap.ps1"
# THIS FILE IS DISTRIBUTED AS PART OF UMBRACO.BUILD
# DO NOT MODIFY IT - ALWAYS USED THE COMMON VERSION
# ################################################################
# BOOTSTRAP
# ################################################################
# reset errors
$error.Clear()
# ensure we have temp folder for downloads
$scriptRoot = "$PSScriptRoot"
$scriptTemp = "$scriptRoot\temp"
if (-not (test-path $scriptTemp)) { mkdir $scriptTemp > $null }
# get NuGet
$cache = 4
$nuget = "$scriptTemp\nuget.exe"
# ensure the correct NuGet-source is used. This one is used by Umbraco
$nugetsourceUmbraco = "https://www.myget.org/F/umbracoprereleases/api/v3/index.json"
if (-not $local)
{
$source = "https://dist.nuget.org/win-x86-commandline/latest/nuget.exe"
if ((test-path $nuget) -and ((ls $nuget).CreationTime -lt [DateTime]::Now.AddDays(-$cache)))
{
Remove-Item $nuget -force -errorAction SilentlyContinue > $null
}
if (-not (test-path $nuget))
{
Write-Host "Download NuGet..."
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
Invoke-WebRequest $source -OutFile $nuget
if (-not $?) { throw "Failed to download NuGet." }
}
}
elseif (-not (test-path $nuget))
{
throw "Failed to locate NuGet.exe."
}
# NuGet notes
# As soon as we use -ConfigFile, NuGet uses that file, and only that file, and does not
# merge configuration from system level. See comments in NuGet.Client solution, class
# NuGet.Configuration.Settings, method LoadDefaultSettings.
# For NuGet to merge configurations, it needs to "find" the file in the current directory,
# or above. Which means we cannot really use -ConfigFile but instead have to have Umbraco's
# NuGet.config file at root, and always run NuGet.exe while at root or in a directory below
# root.
$solutionRoot = "$scriptRoot\.."
$testPwd = [System.IO.Path]::GetFullPath($pwd.Path) + "\"
$testRoot = [System.IO.Path]::GetFullPath($solutionRoot) + "\"
if (-not $testPwd.ToLower().StartsWith($testRoot.ToLower()))
{
throw "Cannot run outside of the solution's root."
}
# get the build system
if (-not $local)
{
$params = "-OutputDirectory", $scriptTemp, "-Verbosity", "quiet", "-PreRelease", "-Source", $nugetsourceUmbraco
&$nuget install Umbraco.Build @params
if (-not $?) { throw "Failed to download Umbraco.Build." }
}
# ensure we have the build system
$ubuildPath = ls "$scriptTemp\Umbraco.Build.*" | sort -property CreationTime -descending | select -first 1
if (-not $ubuildPath)
{
throw "Failed to locate the build system."
}
# boot the build system
# this creates $global:ubuild
return &"$ubuildPath\ps\Boot.ps1"
# at that point the build.ps1 script must boot the build system
# eg
# $ubuild.Boot($ubuildPath.FullName, [System.IO.Path]::GetFullPath("$scriptRoot\.."),
# @{ Local = $local; With7Zip = $false; WithNode = $false },
# @{ continue = $continue })
# if (-not $?) { throw "Failed to boot the build system." }
#
# and it's good practice to report
# eg
# Write-Host "Umbraco.Whatever Build"
# Write-Host "Umbraco.Build v$($ubuild.BuildVersion)"
# eof

View File

@@ -1,488 +0,0 @@
param (
# get, don't execute
[Parameter(Mandatory=$false)]
[Alias("g")]
[switch] $get = $false,
# run local, don't download, assume everything is ready
[Parameter(Mandatory=$false)]
[Alias("l")]
[Alias("loc")]
[switch] $local = $false,
# enable docfx
[Parameter(Mandatory=$false)]
[Alias("doc")]
[switch] $docfx = $false,
# keep the build directories, don't clear them
[Parameter(Mandatory=$false)]
[Alias("c")]
[Alias("cont")]
[switch] $continue = $false,
# execute a command
[Parameter(Mandatory=$false, ValueFromRemainingArguments=$true)]
[String[]]
$command
)
# ################################################################
# BOOTSTRAP
# ################################################################
# create and boot the buildsystem
$ubuild = &"$PSScriptRoot\build-bootstrap.ps1"
if (-not $?) { return }
$ubuild.Boot($PSScriptRoot,
@{ Local = $local; WithDocFx = $docfx },
@{ Continue = $continue })
if ($ubuild.OnError()) { return }
Write-Host "Umbraco CMS Build"
Write-Host "Umbraco.Build v$($ubuild.BuildVersion)"
# ################################################################
# TASKS
# ################################################################
$ubuild.DefineMethod("SetMoreUmbracoVersion",
{
param ( $semver )
$port = "" + $semver.Major + $semver.Minor + ("" + $semver.Patch).PadLeft(2, '0')
Write-Host "Update port in launchSettings.json to $port"
$filePath = "$($this.SolutionRoot)\src\Umbraco.Web.UI\Properties\launchSettings.json"
$this.ReplaceFileText($filePath, `
"http://localhost:(\d+)?", `
"http://localhost:$port")
})
$ubuild.DefineMethod("SandboxNode",
{
$global:node_path = $env:path
$nodePath = $this.BuildEnv.NodePath
$gitExe = (Get-Command git).Source
if (-not $gitExe) { $gitExe = (Get-Command git).Path }
$gitPath = [System.IO.Path]::GetDirectoryName($gitExe)
$env:path = "$nodePath;$gitPath"
$global:node_nodepath = $this.ClearEnvVar("NODEPATH")
$global:node_npmcache = $this.ClearEnvVar("NPM_CONFIG_CACHE")
$global:node_npmprefix = $this.ClearEnvVar("NPM_CONFIG_PREFIX")
# https://github.com/gruntjs/grunt-contrib-connect/issues/235
$this.SetEnvVar("NODE_NO_HTTP2", "1")
})
$ubuild.DefineMethod("RestoreNode",
{
$env:path = $node_path
$this.SetEnvVar("NODEPATH", $node_nodepath)
$this.SetEnvVar("NPM_CONFIG_CACHE", $node_npmcache)
$this.SetEnvVar("NPM_CONFIG_PREFIX", $node_npmprefix)
$this.ClearEnvVar("NODE_NO_HTTP2")
})
$ubuild.DefineMethod("CompileBelle",
{
$src = "$($this.SolutionRoot)\src"
$log = "$($this.BuildTemp)\belle.log"
Write-Host "Compile Belle"
Write-Host "Logging to $log"
# get a temp clean node env (will restore)
$this.SandboxNode()
# stupid PS is going to gather all "warnings" in $error
# so we have to take care of it else they'll bubble and kill the build
if ($error.Count -gt 0) { return }
try {
Push-Location "$($this.SolutionRoot)\src\Umbraco.Web.UI.Client"
Write-Output "" > $log
Write-Output "### node version is:" > $log
node -v >> $log 2>&1
if (-not $?) { throw "Failed to report node version." }
Write-Output "### npm version is:" >> $log 2>&1
npm -v >> $log 2>&1
if (-not $?) { throw "Failed to report npm version." }
Write-Output "### clean npm cache" >> $log 2>&1
npm cache clean --force >> $log 2>&1
$error.Clear() # that one can fail 'cos security bug - ignore
Write-Output "### npm ci" >> $log 2>&1
npm ci >> $log 2>&1
Write-Output ">> $? $($error.Count)" >> $log 2>&1
# Don't really care about the messages from npm ci making us think there are errors
$error.Clear()
Write-Output "### gulp build for version $($this.Version.Release)" >> $log 2>&1
npm run build --buildversion=$this.Version.Release >> $log 2>&1
# We can ignore this warning, we need to update to node 12 at some point - https://github.com/jsdom/jsdom/issues/2939
$indexes = [System.Collections.ArrayList]::new()
$index = 0;
$error | ForEach-Object {
# Find which of the errors is the ExperimentalWarning
if($_.ToString().Contains("ExperimentalWarning: The fs.promises API is experimental")) {
[void]$indexes.Add($index)
}
$index++
}
$indexes | ForEach-Object {
# Loop through the list of indexes and remove the errors that we expect and feel confident we can ignore
$error.Remove($error[$_])
}
if (-not $?) { throw "Failed to build" } # that one is expected to work
} finally {
Pop-Location
# FIXME: should we filter the log to find errors?
#get-content .\build.tmp\belle.log | %{ if ($_ -match "build") { write $_}}
# restore
$this.RestoreNode()
}
# setting node_modules folder to hidden
# used to prevent VS13 from crashing on it while loading the websites project
# also makes sure aspnet compiler does not try to handle rogue files and chokes
# in VSO with Microsoft.VisualC.CppCodeProvider -related errors
# use get-item -force 'cos it might be hidden already
Write-Host "Set hidden attribute on node_modules"
$dir = Get-Item -force "$src\Umbraco.Web.UI.Client\node_modules"
$dir.Attributes = $dir.Attributes -bor ([System.IO.FileAttributes]::Hidden)
})
$ubuild.DefineMethod("CompileUmbraco",
{
$buildConfiguration = "Release"
$src = "$($this.SolutionRoot)\src"
$log = "$($this.BuildTemp)\build.umbraco.log"
Write-Host "Compile Umbraco"
Write-Host "Logging to $log"
& dotnet build "$src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" `
--configuration $buildConfiguration `
--output "$($this.BuildTemp)\bin\\" `
> $log
# get files into WebApp\bin
& dotnet publish "$src\Umbraco.Web.UI\Umbraco.Web.UI.csproj" `
--configuration Release --output "$($this.BuildTemp)\WebApp\bin\\" `
> $log
# remove extra files
$webAppBin = "$($this.BuildTemp)\WebApp\bin"
$excludeDirs = @("$($webAppBin)\refs","$($webAppBin)\runtimes","$($webAppBin)\umbraco","$($webAppBin)\wwwroot")
$excludeFiles = @("$($webAppBin)\appsettings.*","$($webAppBin)\*.deps.json","$($webAppBin)\*.exe","$($webAppBin)\*.config","$($webAppBin)\*.runtimeconfig.json")
$this.RemoveDirectory($excludeDirs)
$this.RemoveFile($excludeFiles)
# copy rest of the files into WebApp
$excludeUmbracoDirs = @("$($this.BuildTemp)\WebApp\umbraco\lib","$($this.BuildTemp)\WebApp\umbraco\Data","$($this.BuildTemp)\WebApp\umbraco\Logs")
$this.RemoveDirectory($excludeUmbracoDirs)
$this.CopyFiles("$($this.SolutionRoot)\src\Umbraco.Web.UI\Views", "*", "$($this.BuildTemp)\WebApp\Views")
Copy-Item "$($this.SolutionRoot)\src\Umbraco.Web.UI\appsettings.json" "$($this.BuildTemp)\WebApp"
if (-not $?) { throw "Failed to compile Umbraco.Web.UI." }
# /p:UmbracoBuild tells the csproj that we are building from PS, not VS
})
$ubuild.DefineMethod("CompileJsonSchema",
{
Write-Host "Generating JSON Schema for AppSettings"
Write-Host "Logging to $($this.BuildTemp)\json.schema.log"
## NOTE: Need to specify the outputfile to point to the build temp folder
&dotnet run --project "$($this.SolutionRoot)\src\JsonSchema\JsonSchema.csproj" `
-c Release > "$($this.BuildTemp)\json.schema.log" `
-- `
--outputFile "$($this.BuildTemp)\WebApp\umbraco\config\appsettings-schema.json"
})
$ubuild.DefineMethod("PrepareTests",
{
Write-Host "Prepare Tests"
# FIXME: - idea is to avoid rebuilding everything for tests
# but because of our weird assembly versioning (with .* stuff)
# everything gets rebuilt all the time...
#Copy-Files "$tmp\bin" "." "$tmp\tests"
# data
Write-Host "Copy data files"
if (-not (Test-Path -Path "$($this.BuildTemp)\tests\Packaging" ))
{
Write-Host "Create packaging directory"
mkdir "$($this.BuildTemp)\tests\Packaging" > $null
}
#$this.CopyFiles("$($this.SolutionRoot)\src\Umbraco.Tests\Packaging\Packages", "*", "$($this.BuildTemp)\tests\Packaging\Packages")
# required for package install tests
if (-not (Test-Path -Path "$($this.BuildTemp)\tests\bin" ))
{
Write-Host "Create bin directory"
mkdir "$($this.BuildTemp)\tests\bin" > $null
}
})
$ubuild.DefineMethod("CompileTests",
{
$buildConfiguration = "Release"
$log = "$($this.BuildTemp)\msbuild.tests.log"
Write-Host "Compile Tests"
Write-Host "Logging to $log"
# beware of the weird double \\ at the end of paths
# see http://edgylogic.com/blog/powershell-and-external-commands-done-right/
&dotnet msbuild "$($this.SolutionRoot)\tests\Umbraco.Tests\Umbraco.Tests.csproj" `
-target:Build `
-property:WarningLevel=0 `
-property:Configuration=$buildConfiguration `
-property:Platform=AnyCPU `
-property:UseWPP_CopyWebApplication=True `
-property:PipelineDependsOnBuild=False `
-property:OutDir="$($this.BuildTemp)\tests\\" `
-property:Verbosity=minimal `
-property:UmbracoBuild=True `
> $log
if (-not $?) { throw "Failed to compile tests." }
# /p:UmbracoBuild tells the csproj that we are building from PS
})
$ubuild.DefineMethod("PreparePackages",
{
Write-Host "Prepare Packages"
$src = "$($this.SolutionRoot)\src"
$tmp = "$($this.BuildTemp)"
# cleanup build
Write-Host "Clean build"
$this.RemoveFile("$tmp\bin\*.dll.config")
$this.RemoveFile("$tmp\WebApp\bin\*.dll.config")
# cleanup presentation
Write-Host "Cleanup presentation"
$this.RemoveDirectory("$tmp\WebApp\umbraco.presentation")
# create directories
Write-Host "Create directories"
mkdir "$tmp\WebApp\App_Data" > $null
#mkdir "$tmp\WebApp\Media" > $null
#mkdir "$tmp\WebApp\Views" > $null
# copy various files
Write-Host "Copy xml documentation"
Copy-Item -force "$tmp\bin\*.xml" "$tmp\WebApp\bin"
# offset the modified timestamps on all umbraco dlls, as WebResources
# break if date is in the future, which, due to timezone offsets can happen.
Write-Host "Offset dlls timestamps"
Get-ChildItem -r "$tmp\*.dll" | ForEach-Object {
$_.CreationTime = $_.CreationTime.AddHours(-11)
$_.LastWriteTime = $_.LastWriteTime.AddHours(-11)
}
})
$ubuild.DefineMethod("PrepareBuild",
{
Write-host "Set environment"
$env:UMBRACO_VERSION=$this.Version.Semver.ToString()
$env:UMBRACO_RELEASE=$this.Version.Release
$env:UMBRACO_COMMENT=$this.Version.Comment
$env:UMBRACO_BUILD=$this.Version.Build
$env:UMBRACO_TMP="$($this.SolutionRoot)\build.tmp"
if ($args -and $args[0] -eq "vso")
{
Write-host "Set VSO environment"
# set environment variable for VSO
# https://github.com/Microsoft/vsts-tasks/issues/375
# https://github.com/Microsoft/vsts-tasks/blob/master/docs/authoring/commands.md
Write-Host ("##vso[task.setvariable variable=UMBRACO_VERSION;]$($this.Version.Semver.ToString())")
Write-Host ("##vso[task.setvariable variable=UMBRACO_RELEASE;]$($this.Version.Release)")
Write-Host ("##vso[task.setvariable variable=UMBRACO_COMMENT;]$($this.Version.Comment)")
Write-Host ("##vso[task.setvariable variable=UMBRACO_BUILD;]$($this.Version.Build)")
Write-Host ("##vso[task.setvariable variable=UMBRACO_TMP;]$($this.SolutionRoot)\build.tmp")
}
})
$nugetsourceUmbraco = "https://api.nuget.org/v3/index.json"
$ubuild.DefineMethod("RestoreNuGet",
{
Write-Host "Restore NuGet"
Write-Host "Logging to $($this.BuildTemp)\nuget.restore.log"
$params = "-Source", $nugetsourceUmbraco
&$this.BuildEnv.NuGet restore "$($this.SolutionRoot)\umbraco.sln" > "$($this.BuildTemp)\nuget.restore.log" @params
if (-not $?) { throw "Failed to restore NuGet packages." }
})
$ubuild.DefineMethod("PackageNuGet",
{
Write-Host "Create NuGet packages"
&dotnet pack "$($this.SolutionRoot)\umbraco.sln" `
--output "$($this.BuildOutput)" `
--verbosity detailed `
-c Release `
-p:PackageVersion="$($this.Version.Semver.ToString())" > "$($this.BuildTemp)\pack.umbraco.log"
# run hook
if ($this.HasMethod("PostPackageNuGet"))
{
Write-Host "Run PostPackageNuGet hook"
$this.PostPackageNuGet();
if (-not $?) { throw "Failed to run hook." }
}
})
$ubuild.DefineMethod("VerifyNuGet",
{
$this.VerifyNuGetConsistency(
@(),
(
"Umbraco.Cms",
"Umbraco.Cms.Persistence.Sqlite",
"Umbraco.Cms.Persistence.SqlServer",
"Umbraco.Cms.StaticAssets",
"Umbraco.Core",
"Umbraco.Examine.Lucene",
"Umbraco.Infrastructure",
"Umbraco.PublishedCache.NuCache",
"Umbraco.Web.BackOffice",
"Umbraco.Web.Common",
"Umbraco.Web.UI",
"Umbraco.Web.Website"
))
if ($this.OnError()) { return }
})
$ubuild.DefineMethod("PrepareCSharpDocs",
{
Write-Host "Prepare C# Documentation"
$src = "$($this.SolutionRoot)\src"
$tmp = $this.BuildTemp
$out = $this.BuildOutput
$DocFxJson = Join-Path -Path $src "\ApiDocs\docfx.json"
$DocFxSiteOutput = Join-Path -Path $tmp "\_site\*.*"
# run DocFx
$DocFx = $this.BuildEnv.DocFx
& $DocFx metadata $DocFxJson
& $DocFx build $DocFxJson
# zip it
& $this.BuildEnv.Zip a -tzip -r "$out\csharp-docs.zip" $DocFxSiteOutput
})
$ubuild.DefineMethod("PrepareAngularDocs",
{
Write-Host "Prepare Angular Documentation"
$src = "$($this.SolutionRoot)\src"
$out = $this.BuildOutput
# Check if the solution has been built
if (!(Test-Path "$src\Umbraco.Web.UI.Client\node_modules")) {throw "Umbraco needs to be built before generating the Angular Docs"}
"Moving to Umbraco.Web.UI.Docs folder"
cd $src\Umbraco.Web.UI.Docs
"Generating the docs and waiting before executing the next commands"
& npm ci
& npx gulp docs
Pop-Location
# change baseUrl
$BaseUrl = "https://apidocs.umbraco.com/v9/ui/"
$IndexPath = "./api/index.html"
(Get-Content $IndexPath).replace('origin + location.href.substr(origin.length).replace(rUrl, indexFile)', "`'" + $BaseUrl + "`'") | Set-Content $IndexPath
# zip it
& $this.BuildEnv.Zip a -tzip -r "$out\ui-docs.zip" "$src\Umbraco.Web.UI.Docs\api\*.*"
})
$ubuild.DefineMethod("Build",
{
$error.Clear()
$this.PrepareBuild()
if ($this.OnError()) { return }
$this.RestoreNuGet()
if ($this.OnError()) { return }
$this.CompileBelle()
if ($this.OnError()) { return }
$this.CompileUmbraco()
if ($this.OnError()) { return }
$this.CompileJsonSchema()
if ($this.OnError()) { return }
$this.PrepareTests()
if ($this.OnError()) { return }
$this.CompileTests()
if ($this.OnError()) { return }
# not running tests
$this.PreparePackages()
if ($this.OnError()) { return }
$this.VerifyNuGet()
if ($this.OnError()) { return }
$this.PackageNuGet()
if ($this.OnError()) { return }
$this.PostPackageHook()
if ($this.OnError()) { return }
Write-Host "Done"
})
$ubuild.DefineMethod("PostPackageHook",
{
# run hook
if ($this.HasMethod("PostPackage"))
{
Write-Host "Run PostPackage hook"
$this.PostPackage();
if (-not $?) { throw "Failed to run hook." }
}
})
# ################################################################
# RUN
# ################################################################
# configure
$ubuild.ReleaseBranches = @( "master" )
# run
if (-not $get)
{
if ($command.Length -eq 0)
{
$command = @( "Build" )
}
$ubuild.RunMethod($command);
if ($ubuild.OnError()) { return }
}
if ($get) { return $ubuild }

View File

@@ -3,18 +3,17 @@
{
"src": [
{
"src": "../",
"src": "../../src",
"files": [
"**/*.csproj",
"**/Umbraco.Infrastructure/**/*.cs"
"**/*.csproj"
],
"exclude": [
"**/obj/**",
"**/bin/**",
"**/Umbraco.Web.csproj",
"**/Umbraco.Infrastructure.csproj",
"**/Umbraco.Web.UI.csproj",
"**/**.Test**/*.csproj"
"**/Umbraco.Cms.StaticAssets.csproj",
"**/JsonSchema.csproj"
]
}
],

View File

@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
@@ -50,6 +50,7 @@
<PackageReference Include="Serilog.Sinks.Map" Version="1.0.2" />
<PackageReference Include="SixLabors.ImageSharp" Version="2.1.1" />
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="5.0.0" />
<PackageReference Include="System.Security.Cryptography.Pkcs" Version="6.0.1" />
<PackageReference Include="System.Text.Encodings.Web" Version="6.0.0" /> <!-- Explicit updated this nested dependency due to this https://github.com/dotnet/announcements/issues/178-->
<PackageReference Include="System.Threading.Tasks.Dataflow" Version="6.0.0" />
<PackageReference Include="Examine.Core" Version="3.0.0-beta.9" />

View File

@@ -18,7 +18,7 @@ gulp.task('docs', [], function (cb) {
var options = {
html5Mode: false,
startPage: '/api',
title: "Umbraco 9 Backoffice UI API Documentation",
title: "Umbraco 10 Backoffice UI API Documentation",
dest: './api',
styles: ['./umb-docs.css'],
image: "https://our.umbraco.com/assets/images/logo.svg"

View File

@@ -8,6 +8,11 @@
<IncludeBuildOutput>false</IncludeBuildOutput>
<ContentTargetFolders>.</ContentTargetFolders>
<NoDefaultExcludes>true</NoDefaultExcludes>
<IncludeContentInPack>true</IncludeContentInPack>
<IncludeBuildOutput>false</IncludeBuildOutput>
<ContentTargetFolders>.</ContentTargetFolders>
<NoDefaultExcludes>true</NoDefaultExcludes>
<IncludeSymbols>false</IncludeSymbols>
</PropertyGroup>
<ItemGroup>

View File

@@ -34,7 +34,7 @@ context('Packages', () => {
mediaUdis: [],
mediaLoadChildNodes: false
}
const url = "https://localhost:44331/umbraco/backoffice/umbracoapi/package/PostSavePackage";
const url = "/umbraco/backoffice/umbracoapi/package/PostSavePackage";
cy.umbracoApiRequest(url, 'POST', newPackage);
}
@@ -159,4 +159,4 @@ context('Packages', () => {
cy.umbracoEnsureDocumentTypeNameNotExists(rootDocTypeName);
cy.umbracoEnsurePackageNameNotExists(packageName);
});
});
});

View File

@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="utf-8"?>
<Project></Project>

View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- see notes in dockerfile -->
<packageSources>
<add key="nuget" value="https://api.nuget.org/v3/index.json" />
<add key="local" value="./nupkg" />
</packageSources>
</configuration>

View File

@@ -0,0 +1,34 @@
############################################
## Build
############################################
FROM mcr.microsoft.com/dotnet/sdk:6.0.300 AS build
WORKDIR /nupkg
COPY nupkg .
WORKDIR /build
RUN dotnet new --install /nupkg/Umbraco.Templates.*.nupkg
RUN dotnet new umbraco --name Cypress -o . --no-restore
RUN dotnet restore -s /nupkg -s https://api.nuget.org/v3/index.json
RUN dotnet publish --no-restore --configuration Release -o /dist
############################################
## Run
############################################
FROM mcr.microsoft.com/dotnet/aspnet:6.0.5 AS run
WORKDIR /cypress
COPY --from=build dist .
ENV ASPNETCORE_URLS="http://0.0.0.0:5000"
ENV Umbraco__CMS__Global__InstallMissingDatabase="true"
ENV ConnectionStrings__umbracoDbDSN_ProviderName="Microsoft.Data.SQLite"
ENV ConnectionStrings__umbracoDbDSN="Data Source=|DataDirectory|/Umbraco.sqlite.db;Cache=Shared;Foreign Keys=True;Pooling=True"
ENV Umbraco__CMS__Unattended__InstallUnattended="true"
ENV Umbraco__CMS__Unattended__UnattendedUserName="Cypress Test"
ENV Umbraco__CMS__Unattended__UnattendedUserEmail="cypress@umbraco.com"
ENV Umbraco__CMS__Unattended__UnattendedUserPassword="UmbracoAcceptance123!"
CMD dotnet Cypress.dll

View File

@@ -0,0 +1,11 @@
namespace Umbraco.Cms.Tests.Common.Extensions;
public static class StringExtensions
{
public static string StripNewLines(this string input) =>
input.Replace("\r\n", string.Empty)
.Replace("\n", string.Empty);
public static string NormalizeNewLines(this string input) =>
input.Replace("\r\n", "\n");
}

View File

@@ -7,6 +7,7 @@
<Title>Umbraco CMS Integration Tests</Title>
<Description>Contains helper classes for integration tests with Umbraco, including all internal integration tests.</Description>
<IsPackable>true</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup Condition="'$(OS)' == 'Windows_NT'">

View File

@@ -5,6 +5,7 @@ using System.Collections.Generic;
using System.Linq;
using NUnit.Framework;
using Umbraco.Cms.Core.Strings.Css;
using Umbraco.Cms.Tests.Common.Extensions;
using Umbraco.Extensions;
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Core.ShortStringHelper
@@ -175,7 +176,7 @@ world */p{font-size: 1em;}")]
/**umb_name:Test2*/
.test2 {
#font-color: green;
}"), result);
}").NormalizeNewLines(), result.NormalizeNewLines());
}
[Test]
@@ -204,7 +205,7 @@ world */p{font-size: 1em;}")]
Assert.AreEqual(".test", rules.First().Selector);
Assert.AreEqual(
@"font-color: red;
margin: 1rem;", rules.First().Styles);
margin: 1rem;".NormalizeNewLines(), rules.First().Styles.NormalizeNewLines());
Assert.AreEqual("Test2", rules.Last().Name);
Assert.AreEqual(".test2", rules.Last().Selector);

View File

@@ -564,12 +564,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.PublishedCache.NuCache
GC.Collect();
await d.CollectAsync();
// in Release mode, it works, but in Debug mode, the weak reference is still alive
// and for some reason we need to do this to ensure it is collected
#if DEBUG
GC.Collect();
await d.CollectAsync();
#endif
Assert.AreEqual(1, d.SnapCount);
v2 = s2.Get(1);
@@ -611,12 +607,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.PublishedCache.NuCache
GC.Collect();
await d.CollectAsync();
// in Release mode, it works, but in Debug mode, the weak reference is still alive
// and for some reason we need to do this to ensure it is collected
#if DEBUG
GC.Collect();
await d.CollectAsync();
#endif
Assert.AreEqual(1, d.SnapCount);
v2 = s2.Get(1);

View File

@@ -5,6 +5,7 @@
<TargetFramework>net6.0</TargetFramework>
<RootNamespace>Umbraco.Cms.Tests.UnitTests</RootNamespace>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup Condition="'$(OS)' == 'Windows_NT'">

View File

@@ -5,6 +5,7 @@ using System;
using System.Collections.Generic;
using NUnit.Framework;
using Umbraco.Cms.Infrastructure.Macros;
using Umbraco.Cms.Tests.Common.Extensions;
using Umbraco.Cms.Tests.Common.TestHelpers;
namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Macros
@@ -35,8 +36,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Macros
<div class=""umb-macro-holder mceNonEditable"" test1=""value1"" test2=""value2"">
<!-- <?UMBRACO_MACRO macroAlias=""My.Map.isCool eh[boy!]"" /> -->
<ins>Macro alias: <strong>My.Map.isCool eh[boy!]</strong></ins></div>
<p>asdfasdf</p>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
<p>asdfasdf</p>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -54,8 +55,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Macros
<div class=""umb-macro-holder mceNonEditable"" test1=""value1"" test2=""value2"">
<!-- <?UMBRACO_MACRO macroAlias=""Map"" /> -->
<ins>Macro alias: <strong>Map</strong></ins></div>
<p>asdfasdf</p>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
<p>asdfasdf</p>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -73,8 +74,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Macros
<div class=""umb-macro-holder mceNonEditable"" test1=""value1"" test2=""value2"">
<!-- <?UMBRACO_MACRO macroAlias=""Map"" /> -->
<ins>Macro alias: <strong>Map</strong></ins></div>
<p>asdfasdf</p>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
<p>asdfasdf</p>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -92,8 +93,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Macros
<div class=""umb-macro-holder mceNonEditable"" test1=""value1"" test2=""value2"">
<!-- <?UMBRACO_MACRO macroAlias=""Map"" test1=""value1"" test2=""value2"" /> -->
<ins>Macro alias: <strong>Map</strong></ins></div>
<p>asdfasdf</p>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
<p>asdfasdf</p>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -111,8 +112,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Macros
<div class=""umb-macro-holder mceNonEditable"" test1=""value1"" test2=""value2"">
<!-- <?UMBRACO_MACRO test1=""value1"" test2=""value2"" macroAlias=""Map"" /> -->
<ins>Macro alias: <strong>Map</strong></ins></div>
<p>asdfasdf</p>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
<p>asdfasdf</p>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -130,8 +131,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Macros
<div class=""umb-macro-holder mceNonEditable"" test1=""value1"" test2=""value2"">
<!-- <?UMBRACO_MACRO macroAlias=""Map"" test1=""value1"" test2=""value2"" /> -->
<ins>Macro alias: <strong>Map</strong></ins></div>
<p>asdfasdf</p>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
<p>asdfasdf</p>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -161,8 +162,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Macros
<div class=""umb-macro-holder mceNonEditable"" test1=""value1"" test2=""value2"">
<!-- <?UMBRACO_MACRO macroAlias=""Map"" test1=""value1"" test2=""value2"" /> -->
<ins>Macro alias: <strong>Map</strong></ins></div>
<p>asdfasdf</p>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
<p>asdfasdf</p>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -186,8 +187,8 @@ namespace Umbraco.Cms.Tests.UnitTests.Umbraco.Web.Common.Macros
<div class=""umb-macro-holder mceNonEditable"">
<!-- <?UMBRACO_MACRO macroAlias=""login"" /> -->
<ins>Macro alias: <strong>login</strong></ins></div>
<p> </p>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
<p> </p>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -223,8 +224,8 @@ dfdsfds"" />
asdfsdf
</div>
</body>
</html>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
</html>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -242,8 +243,8 @@ asdfsdf
<div class=""umb-macro-holder mceNonEditable"" test1=""value1"" test2=""value2"">
<!-- <?UMBRACO_MACRO macroAlias=""Map"" test1=""value1"" test2=""value2"" /> -->
<ins>Macro alias: <strong>Map</strong></ins></div>
<p>asdfasdf</p>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
<p>asdfasdf</p>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -261,8 +262,8 @@ asdfsdf
<div class=""umb-macro-holder mceNonEditable"" test1=""value1"" test2=""value2"">
<!-- <?UMBRACO_MACRO macroAlias=""Map"" test1=""value1"" test2=""value2"" /> -->
<ins>Macro alias: <strong>Map</strong></ins></div>
<p>asdfasdf</p>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
<p>asdfasdf</p>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -318,8 +319,8 @@ asdfsdf
asdfsdf
</div>
</body>
</html>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
</html>".StripNewLines(),
result.StripNewLines());
}
[Test]
@@ -353,8 +354,8 @@ asdfsdf
asdfsdf
</div>
</body>
</html>".Replace(Environment.NewLine, string.Empty),
result.Replace(Environment.NewLine, string.Empty));
</html>".StripNewLines(),
result.StripNewLines());
}
[Test]

21
version.json Normal file
View File

@@ -0,0 +1,21 @@
{
"$schema": "https://raw.githubusercontent.com/dotnet/Nerdbank.GitVersioning/master/src/NerdBank.GitVersioning/version.schema.json",
"version": "10.0.0-rc2",
"assemblyVersion": {
"precision": "Build" // optional. Use when you want a more precise assembly version than the default major.minor.
},
"gitCommitIdShortFixedLength": 7,
"publicReleaseRefSpec": [
"^refs/heads/master$",
"^refs/heads/main$",
"^refs/heads/release/\\d+\\.\\d+\\.\\d+"
],
"cloudBuild": {
"buildNumber": {
"enabled": true
}
},
"nugetPackageVersion": {
"semVer": 2
}
}