using System; using System.Collections.Generic; using System.IO; using System.IO.Compression; using System.Runtime.InteropServices; using Microsoft.DotNet.Cli.Build.Framework; using Microsoft.DotNet.InternalAbstractions; using static Microsoft.DotNet.Cli.Build.Framework.BuildHelpers; using Microsoft.Build.Utilities; namespace Microsoft.DotNet.Cli.Build { public class DebTargets : Task { public override bool Execute() { BuildContext context = new BuildSetup("MSBuild").UseAllTargetsFromAssembly().CreateBuildContext(); BuildTargetContext c = new BuildTargetContext(context, null, null); return GenerateDebs(c).Success; } public static BuildTargetResult GenerateDebs(BuildTargetContext c) { if (CurrentPlatform.IsPlatform(BuildPlatform.Ubuntu)) { PrepareTargets.Init(c); GenerateSdkDeb(c); } return c.Success(); } public static BuildTargetResult GenerateSdkDeb(BuildTargetContext c) { if (CurrentPlatform.IsPlatform(BuildPlatform.Ubuntu)) { InstallSharedFramework(c); // Ubuntu 16.04 Jenkins Machines don't have docker or debian package build tools // So we need to skip this target if the tools aren't present. // https://github.com/dotnet/core-setup/issues/167 if (DebuildNotPresent()) { c.Info("Debuild not present, skipping target: {nameof(RemovePackages)}"); return c.Success(); } var channel = c.BuildContext.Get("Channel").ToLower(); var packageName = CliMonikers.GetSdkDebianPackageName(c); var version = c.BuildContext.Get("BuildVersion").NuGetVersion; var debFile = c.BuildContext.Get("SdkInstallerFile"); var manPagesDir = Path.Combine(Dirs.RepoRoot, "Documentation", "manpages"); var previousVersionURL = $"https://dotnetcli.blob.core.windows.net/dotnet/{channel}/Installers/Latest/dotnet-ubuntu-x64.latest.deb"; var sdkPublishRoot = c.BuildContext.Get("CLISDKRoot"); var sharedFxDebianPackageName = Monikers.GetDebianSharedFrameworkPackageName(CliDependencyVersions.SharedFrameworkVersion); var objRoot = Path.Combine(Dirs.Output, "obj", "debian", "sdk"); if (Directory.Exists(objRoot)) { Directory.Delete(objRoot, true); } Directory.CreateDirectory(objRoot); Cmd(Path.Combine(Dirs.RepoRoot, "scripts", "package", "package-debian.sh"), "-v", version, "-i", sdkPublishRoot, "-o", debFile, "-p", packageName, "-b", Monikers.CLISdkBrandName, "-m", manPagesDir, "--framework-debian-package-name", sharedFxDebianPackageName, "--framework-nuget-name", Monikers.SharedFrameworkName, "--framework-nuget-version", CliDependencyVersions.SharedFrameworkVersion, "--previous-version-url", previousVersionURL, "--obj-root", objRoot) .Execute() .EnsureSuccessful(); } return c.Success(); } public static BuildTargetResult TestDebInstaller(BuildTargetContext c) { if (CurrentPlatform.IsPlatform(BuildPlatform.Ubuntu)) { InstallSDK(c); RunE2ETest(c); RemovePackages(c); } return c.Success(); } public static BuildTargetResult InstallSharedHost(BuildTargetContext c) { // Ubuntu 16.04 Jenkins Machines don't have docker or debian package build tools // So we need to skip this target if the tools aren't present. // https://github.com/dotnet/core-setup/issues/167 if (DebuildNotPresent()) { c.Info("Debuild not present, skipping target: {nameof(RemovePackages)}"); return c.Success(); } InstallPackage(c.BuildContext.Get("SharedHostInstallerFile")); return c.Success(); } public static BuildTargetResult InstallHostFxr(BuildTargetContext c) { InstallSharedHost(c); // Ubuntu 16.04 Jenkins Machines don't have docker or debian package build tools // So we need to skip this target if the tools aren't present. // https://github.com/dotnet/core-setup/issues/167 if (DebuildNotPresent()) { c.Info("Debuild not present, skipping target: {nameof(RemovePackages)}"); return c.Success(); } InstallPackage(c.BuildContext.Get("HostFxrInstallerFile")); return c.Success(); } public static BuildTargetResult InstallSharedFramework(BuildTargetContext c) { InstallHostFxr(c); // Ubuntu 16.04 Jenkins Machines don't have docker or debian package build tools // So we need to skip this target if the tools aren't present. // https://github.com/dotnet/core-setup/issues/167 if (DebuildNotPresent()) { c.Info("Debuild not present, skipping target: {nameof(RemovePackages)}"); return c.Success(); } InstallPackage(c.BuildContext.Get("SharedFrameworkInstallerFile")); return c.Success(); } public static BuildTargetResult InstallSDK(BuildTargetContext c) { InstallSharedFramework(c); // Ubuntu 16.04 Jenkins Machines don't have docker or debian package build tools // So we need to skip this target if the tools aren't present. // https://github.com/dotnet/core-setup/issues/167 if (DebuildNotPresent()) { c.Info("Debuild not present, skipping target: {nameof(RemovePackages)}"); return c.Success(); } InstallPackage(c.BuildContext.Get("SdkInstallerFile")); return c.Success(); } public static BuildTargetResult RunE2ETest(BuildTargetContext c) { if (CurrentPlatform.IsPlatform(BuildPlatform.Ubuntu)) { // Ubuntu 16.04 Jenkins Machines don't have docker or debian package build tools // So we need to skip this target if the tools aren't present. // https://github.com/dotnet/core-setup/issues/167 if (DebuildNotPresent()) { c.Info("Debuild not present, skipping target: {nameof(RemovePackages)}"); return c.Success(); } Directory.SetCurrentDirectory(Path.Combine(Dirs.RepoRoot, "test", "EndToEnd")); Cmd("dotnet", "build") .Execute() .EnsureSuccessful(); var testResultsPath = Path.Combine(Dirs.Output, "obj", "debian", "test", "debian-endtoend-testResults.xml"); Cmd("dotnet", "test", "-xml", testResultsPath) .Execute() .EnsureSuccessful(); } return c.Success(); } public static BuildTargetResult RemovePackages(BuildTargetContext c) { if (CurrentPlatform.IsPlatform(BuildPlatform.Ubuntu)) { // Ubuntu 16.04 Jenkins Machines don't have docker or debian package build tools // So we need to skip this target if the tools aren't present. // https://github.com/dotnet/core-setup/issues/167 if (DebuildNotPresent()) { c.Info("Debuild not present, skipping target: {nameof(RemovePackages)}"); return c.Success(); } IEnumerable orderedPackageNames = new List() { CliMonikers.GetSdkDebianPackageName(c), Monikers.GetDebianSharedFrameworkPackageName(CliDependencyVersions.SharedFrameworkVersion), Monikers.GetDebianHostFxrPackageName(CliDependencyVersions.HostFxrVersion), Monikers.GetDebianSharedHostPackageName(c) }; foreach (var packageName in orderedPackageNames) { RemovePackage(packageName); } } return c.Success(); } private static void InstallPackage(string packagePath) { Cmd("sudo", "dpkg", "-i", packagePath) .Execute() .EnsureSuccessful(); } private static void RemovePackage(string packageName) { Cmd("sudo", "dpkg", "-r", packageName) .Execute() .EnsureSuccessful(); } private static bool DebuildNotPresent() { return Cmd("/usr/bin/env", "debuild", "-h").Execute().ExitCode != 0; } } }