diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 00000000..3f287339 --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,12 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "cake.tool": { + "version": "4.0.0", + "commands": [ + "dotnet-cake" + ] + } + } +} diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 55f9c894..6d2b3c33 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -30,7 +30,7 @@ pr: - .github/ISSUE_TEMPLATE/*.yml - .github/workflows/*.yml - src/Snap.Hutao/Snap.Hutao/Resource/Localization/*.resx - + pool: name: Default @@ -58,93 +58,10 @@ steps: version: '8.x' includePreviewVersions: true -- task: NuGetToolInstaller@1 - name: 'NuGetToolInstaller' - displayName: 'NuGet Installer' - -- task: NuGetCommand@2 - displayName: NuGet restore - inputs: - command: 'restore' - restoreSolution: '$(solution)' - feedsToUse: 'config' - nugetConfigPath: '$(Build.SourcesDirectory)/NuGet.Config' - -- task: MsixPackaging@1 - displayName: Build binary package - inputs: - outputPath: '$(Build.ArtifactStagingDirectory)/' - solution: '$(solution)' - clean: false - generateBundle: false - buildConfiguration: 'Release' - buildPlatform: 'x64' - updateAppVersion: false - appPackageDistributionMode: 'SideloadOnly' - msbuildLocationMethod: 'location' - msbuildLocation: 'C:\Program Files\Microsoft Visual Studio\2022\Enterprise\Msbuild\Current\Bin\MSBuild.exe' - -- task: MagicChunks@2 - inputs: - sourcePath: '$(Build.SourcesDirectory)\src\Snap.Hutao\Snap.Hutao\bin\x64\Release\net8.0-windows10.0.22621.0\win-x64\AppxManifest.xml' - fileType: 'Xml' - targetPathType: 'source' - transformationType: 'json' - transformations: | - { - "Package/Identity/@Name": "7f0db578-026f-4e0b-a75b-d5d06bb0a74c", - "Package/Identity/@Publisher": "CN=DGP Studio CI", - "Package/Identity/@Version": "$(build_date).$(rev_number)", - "Package/Properties/DisplayName": "胡桃 Alpha", - "Package/Properties/PublisherDisplayName":"DGP Studio CI", - "Package/Applications/Application/uap:VisualElements/@DisplayName": "胡桃 Alpha" - } - - task: CmdLine@2 - displayName: Create resources folder + displayName: dotnet cake inputs: - script: | - mkdir Assets - - mkdir Resource - workingDirectory: '$(Build.SourcesDirectory)\src\Snap.Hutao\Snap.Hutao\bin\x64\Release\net8.0-windows10.0.22621.0\win-x64' - - -- task: CopyFiles@2 - displayName: Copy Assets Folder - inputs: - SourceFolder: '$(Build.SourcesDirectory)\src\Snap.Hutao\Snap.Hutao\Assets' - Contents: '**' - TargetFolder: '$(Build.SourcesDirectory)\src\Snap.Hutao\Snap.Hutao\bin\x64\Release\net8.0-windows10.0.22621.0\win-x64\Assets' - -- task: CopyFiles@2 - displayName: Copy Resource Folder - inputs: - SourceFolder: '$(Build.SourcesDirectory)\src\Snap.Hutao\Snap.Hutao\Resource' - Contents: '**' - TargetFolder: '$(Build.SourcesDirectory)\src\Snap.Hutao\Snap.Hutao\bin\x64\Release\net8.0-windows10.0.22621.0\win-x64\Resource' - -- task: CmdLine@2 - displayName: Build MSIX - inputs: - script: '"C:\Program Files (x86)\Windows Kits\10\bin\10.0.22621.0\x64\makeappx.exe" pack /d $(Build.SourcesDirectory)\src\Snap.Hutao\Snap.Hutao\bin\x64\Release\net8.0-windows10.0.22621.0\win-x64 /p $(Build.ArtifactStagingDirectory)/Snap.Hutao.Alpha-$(build_date).$(rev_number).msix' - -- task: MsixSigning@1 - name: signMsix - displayName: Sign MSIX package - inputs: - package: '$(Build.ArtifactStagingDirectory)/Snap.Hutao.Alpha-$(build_date).$(rev_number).msix' - certificate: 'DGP_Studio_CI.pfx' - passwordVariable: 'pw' - condition: succeeded() - - -#- task: PublishPipelineArtifact@1 -# displayName: 'Upload Output' -# inputs: -# targetPath: '$(Build.ArtifactStagingDirectory)/' -# artifact: 'Output' -# publishLocation: 'pipeline' + script: dotnet tool restore && dotnet cake --Version=$(build_date).$(rev_number) --pw=$(pw) - task: DownloadSecureFile@1 name: cerFile @@ -152,10 +69,15 @@ steps: inputs: secureFile: 'Snap.Hutao.CI.cer' +- task: DownloadSecureFile@1 + displayName: Download PFX + inputs: + secureFile: 'DGP_Studio_CI.pfx' + - task: GitHubRelease@1 inputs: gitHubConnection: 'github.com_Masterain' - repositoryName: 'DGP-Studio/Snap.Hutao' + repositoryName: 'DGP-Studio/Snap.Hutao.CI.Test' action: 'create' target: '$(Build.SourceVersion)' tagSource: 'userSpecifiedTag' diff --git a/build.cake b/build.cake new file mode 100644 index 00000000..27344afc --- /dev/null +++ b/build.cake @@ -0,0 +1,128 @@ +#tool "nuget:?package=nuget.commandline&version=6.5.0" +var target = Argument("target", "Build"); +var configuration = Argument("configuration", "Release"); + +var version = HasArgument("Version") ? Argument("Version") : throw new Exception("Empty Version"); +var pw = HasArgument("pw") ? Argument("pw") : throw new Exception("Empty pw"); + +var solution = System.IO.Path.Combine(AzurePipelines.Environment.Build.SourcesDirectory.FullPath, "src", "Snap.Hutao", "Snap.Hutao.sln"); +var project = System.IO.Path.Combine(AzurePipelines.Environment.Build.SourcesDirectory.FullPath, "src", "Snap.Hutao", "Snap.Hutao", "Snap.Hutao.csproj"); +var binPath = System.IO.Path.Combine(AzurePipelines.Environment.Build.SourcesDirectory.FullPath, "src", "Snap.Hutao", "Snap.Hutao", "bin", "x64", "Release", "net8.0-windows10.0.22621.0", "win-x64"); +var outputPath = AzurePipelines.Environment.Build.ArtifactStagingDirectory.FullPath; + +Task("Build") + .IsDependentOn("Build binary package") + .IsDependentOn("Copy files") + .IsDependentOn("Build MSIX") + .IsDependentOn("Sign MSIX"); + +Task("NuGet Restore") + .Does(() => +{ + Information("Restoring packages..."); + DotNetRestore(project, new DotNetRestoreSettings + { + Verbosity = DotNetVerbosity.Detailed, + Interactive = false, + ConfigFile = System.IO.Path.Combine(AzurePipelines.Environment.Build.SourcesDirectory.FullPath, "NuGet.Config") + }); +}); + +Task("Generate AppxManifest") + .Does(() => +{ + Information("Generating AppxManifest..."); + + var manifestPath = System.IO.Path.Combine(AzurePipelines.Environment.Build.SourcesDirectory.FullPath, "src", "Snap.Hutao", "Snap.Hutao", "Package.appxmanifest"); + var manifest = System.IO.File.ReadAllText(manifestPath); + + manifest = manifest + .Replace("Snap Hutao", "Snap Hutao Alpha") + .Replace("胡桃", "胡桃 Alpha") + .Replace("DGP Studio", "DGP Studio CI"); + manifest = System.Text.RegularExpressions.Regex.Replace(manifest, " Name=\"([^\"]*)\"", " Name=\"7f0db578-026f-4e0b-a75b-d5d06bb0a74c\""); + manifest = System.Text.RegularExpressions.Regex.Replace(manifest, " Publisher=\"([^\"]*)\"", " Publisher=\"CN=DGP Studio CI\""); + manifest = System.Text.RegularExpressions.Regex.Replace(manifest, " Version=\"([0-9\\.]+)\"", $" Version=\"{version}\""); + + System.IO.File.WriteAllText(manifestPath, manifest); + + Information("Generated."); +}); + +Task("Build binary package") + .IsDependentOn("NuGet Restore") + .IsDependentOn("Generate AppxManifest") + .Does(() => +{ + Information("Building binary package..."); + + var settings = new DotNetBuildSettings + { + Configuration = configuration + }; + + settings.MSBuildSettings = new DotNetMSBuildSettings + { + ArgumentCustomization = args => args.Append("/p:Platform=x64") + .Append("/p:UapAppxPackageBuildMode=SideloadOnly") + .Append("/p:AppxPackageSigningEnabled=false") + .Append("/p:AppxBundle=Never") + .Append("/p:AppxPackageOutput=" + outputPath) + }; + + DotNetBuild(project, settings); +}); + +Task("Copy files") + .IsDependentOn("Build binary package") + .Does(() => +{ + Information("Copying assets..."); + CopyDirectory( + System.IO.Path.Combine(AzurePipelines.Environment.Build.SourcesDirectory.FullPath, "src", "Snap.Hutao", "Snap.Hutao", "Assets"), + System.IO.Path.Combine(binPath, "Assets") + ); + + Information("Copying resource..."); + CopyDirectory( + System.IO.Path.Combine(AzurePipelines.Environment.Build.SourcesDirectory.FullPath, "src", "Snap.Hutao", "Snap.Hutao", "Resource"), + System.IO.Path.Combine(binPath, "Resource") + ); +}); + +Task("Build MSIX") + .IsDependentOn("Build binary package") + .IsDependentOn("Copy files") + .Does(() => +{ + var p = StartProcess( + "C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.22621.0\\x64\\makeappx.exe", + new ProcessSettings + { + Arguments = "pack /d " + binPath + " /p " + System.IO.Path.Combine(outputPath, $"Snap.Hutao.Alpha-{version}.msix") + } + ); + if (p != 0) + { + throw new InvalidOperationException("Build failed with exit code " + p); + } +}); + +Task("Sign MSIX") + .IsDependentOn("Build MSIX") + .Does(() => +{ + var p = StartProcess( + "C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.22621.0\\x64\\signtool.exe", + new ProcessSettings + { + Arguments = "sign /debug /v /a /fd SHA256 /f " + System.IO.Path.Combine(AzurePipelines.Environment.Agent.HomeDirectory.FullPath, "_work", "_temp", "DGP_Studio_CI.pfx") + " /p " + pw + " " + System.IO.Path.Combine(outputPath, $"Snap.Hutao.Alpha-{version}.msix") + } + ); + if (p != 0) + { + throw new InvalidOperationException("Build failed with exit code " + p); + } +}); + +RunTarget(target);