Add alpine source build CI leg (#15765)
This commit is contained in:
parent
32e54381c3
commit
e65d04254c
7 changed files with 89 additions and 11 deletions
|
@ -13,6 +13,7 @@ parameters:
|
||||||
|
|
||||||
# The following parameters aren't expected to be passed in rather they are used for encapsulation
|
# The following parameters aren't expected to be passed in rather they are used for encapsulation
|
||||||
# -----------------------------------------------------------------------------------------------
|
# -----------------------------------------------------------------------------------------------
|
||||||
|
alpine317Container: mcr.microsoft.com/dotnet-buildtools/prereqs:alpine-3.17
|
||||||
centOSStream8Container: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8
|
centOSStream8Container: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream8
|
||||||
centOSStream9Container: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9
|
centOSStream9Container: mcr.microsoft.com/dotnet-buildtools/prereqs:centos-stream9
|
||||||
debian11Arm64Container: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-arm64v8
|
debian11Arm64Container: mcr.microsoft.com/dotnet-buildtools/prereqs:debian-11-arm64v8
|
||||||
|
@ -65,6 +66,9 @@ stages:
|
||||||
value: ${{ replace(replace(variables['Build.SourceBranch'], 'refs/heads/', ''), 'refs/pull/', '') }}
|
value: ${{ replace(replace(variables['Build.SourceBranch'], 'refs/heads/', ''), 'refs/pull/', '') }}
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|
||||||
|
# PR and CI legs ------------------------------------
|
||||||
|
|
||||||
- template: ../jobs/vmr-build.yml
|
- template: ../jobs/vmr-build.yml
|
||||||
parameters:
|
parameters:
|
||||||
buildName: CentOSStream8_Online_MsftSdk
|
buildName: CentOSStream8_Online_MsftSdk
|
||||||
|
@ -84,6 +88,27 @@ stages:
|
||||||
withPreviousSDK: false # 🚫
|
withPreviousSDK: false # 🚫
|
||||||
|
|
||||||
- ${{ if ne(variables['Build.Reason'], 'PullRequest') }}:
|
- ${{ if ne(variables['Build.Reason'], 'PullRequest') }}:
|
||||||
|
|
||||||
|
# CI - Stage 1 x64 legs ------------------------------------
|
||||||
|
|
||||||
|
- template: ../jobs/vmr-build.yml
|
||||||
|
parameters:
|
||||||
|
buildName: Alpine317_Offline_MsftSdk
|
||||||
|
isBuiltFromVmr: ${{ parameters.isBuiltFromVmr }}
|
||||||
|
vmrBranch: ${{ variables.VmrBranch }}
|
||||||
|
architecture: x64
|
||||||
|
pool:
|
||||||
|
name: ${{ variables.defaultPoolName }}
|
||||||
|
demands: ${{ variables.defaultPoolDemands }}
|
||||||
|
container: ${{ parameters.alpine317Container }}
|
||||||
|
buildFromArchive: false # ✅
|
||||||
|
enablePoison: false # 🚫
|
||||||
|
excludeOmniSharpTests: true # ✅
|
||||||
|
overrideDistroDisablingSha1: false # 🚫
|
||||||
|
runOnline: false # 🚫
|
||||||
|
useMonoRuntime: false # 🚫
|
||||||
|
withPreviousSDK: false # 🚫
|
||||||
|
|
||||||
- template: ../jobs/vmr-build.yml
|
- template: ../jobs/vmr-build.yml
|
||||||
parameters:
|
parameters:
|
||||||
buildName: CentOSStream8_Online_PreviousSourceBuiltSdk
|
buildName: CentOSStream8_Online_PreviousSourceBuiltSdk
|
||||||
|
@ -192,6 +217,8 @@ stages:
|
||||||
useMonoRuntime: false # 🚫
|
useMonoRuntime: false # 🚫
|
||||||
withPreviousSDK: false # 🚫
|
withPreviousSDK: false # 🚫
|
||||||
|
|
||||||
|
# CI - Stage 1 arm64 Legs ------------------------------------
|
||||||
|
|
||||||
- template: ../jobs/vmr-build.yml
|
- template: ../jobs/vmr-build.yml
|
||||||
parameters:
|
parameters:
|
||||||
buildName: Debian11_Offline_MsftSdk
|
buildName: Debian11_Offline_MsftSdk
|
||||||
|
@ -208,6 +235,8 @@ stages:
|
||||||
useMonoRuntime: false # 🚫
|
useMonoRuntime: false # 🚫
|
||||||
withPreviousSDK: false # 🚫
|
withPreviousSDK: false # 🚫
|
||||||
|
|
||||||
|
# CI - Stage 2 x64 Legs ------------------------------------
|
||||||
|
|
||||||
- template: ../jobs/vmr-build.yml
|
- template: ../jobs/vmr-build.yml
|
||||||
parameters:
|
parameters:
|
||||||
buildName: CentOSStream8_Online_CurrentSourceBuiltSdk
|
buildName: CentOSStream8_Online_CurrentSourceBuiltSdk
|
||||||
|
|
|
@ -36,7 +36,7 @@ internal class DotNetHelper
|
||||||
}
|
}
|
||||||
|
|
||||||
Directory.CreateDirectory(Config.DotNetDirectory);
|
Directory.CreateDirectory(Config.DotNetDirectory);
|
||||||
ExecuteHelper.ExecuteProcessValidateExitCode("tar", $"xzf {Config.SdkTarballPath} -C {Config.DotNetDirectory}", outputHelper);
|
Utilities.ExtractTarball(Config.SdkTarballPath, Config.DotNetDirectory);
|
||||||
}
|
}
|
||||||
IsMonoRuntime = DetermineIsMonoRuntime(Config.DotNetDirectory);
|
IsMonoRuntime = DetermineIsMonoRuntime(Config.DotNetDirectory);
|
||||||
|
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
<PackageReference Include="Microsoft.Extensions.FileSystemGlobbing" Version="7.0.0" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||||
<PackageReference Include="xunit" Version="2.4.2" />
|
<PackageReference Include="xunit" Version="2.4.2" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
||||||
|
|
|
@ -65,7 +65,7 @@ public class OmniSharpTests : SmokeTests
|
||||||
await client.DownloadFileAsync(omniSharpTarballUrl, omniSharpTarballFile, OutputHelper);
|
await client.DownloadFileAsync(omniSharpTarballUrl, omniSharpTarballFile, OutputHelper);
|
||||||
|
|
||||||
Directory.CreateDirectory(OmniSharpDirectory);
|
Directory.CreateDirectory(OmniSharpDirectory);
|
||||||
ExecuteHelper.ExecuteProcessValidateExitCode("tar", $"xzf {omniSharpTarballFile} -C {OmniSharpDirectory}", OutputHelper);
|
Utilities.ExtractTarball(omniSharpTarballFile, OmniSharpDirectory);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,7 +43,7 @@ public class SdkContentTests : SmokeTests
|
||||||
throw new InvalidOperationException($"Tarball path '{tarballPath}' does not exist.");
|
throw new InvalidOperationException($"Tarball path '{tarballPath}' does not exist.");
|
||||||
}
|
}
|
||||||
|
|
||||||
string fileListing = ExecuteHelper.ExecuteProcessValidateExitCode("tar", $"tf {tarballPath}", OutputHelper);
|
string fileListing = Utilities.GetTarballContentNames(tarballPath).Aggregate((a, b) => $"{a}{Environment.NewLine}{b}");
|
||||||
fileListing = BaselineHelper.RemoveRids(fileListing, isPortable);
|
fileListing = BaselineHelper.RemoveRids(fileListing, isPortable);
|
||||||
fileListing = BaselineHelper.RemoveVersions(fileListing);
|
fileListing = BaselineHelper.RemoveVersions(fileListing);
|
||||||
IEnumerable<string> files = fileListing.Split(Environment.NewLine).OrderBy(path => path);
|
IEnumerable<string> files = fileListing.Split(Environment.NewLine).OrderBy(path => path);
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
using System;
|
// Licensed to the .NET Foundation under one or more agreements.
|
||||||
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
@ -22,7 +26,7 @@ public class SourceBuiltArtifactsTests : SmokeTests
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// Extract the .version file
|
// Extract the .version file
|
||||||
ExtractFileFromTarball(Config.SourceBuiltArtifactsPath, ".version", outputDir);
|
Utilities.ExtractTarball(Config.SourceBuiltArtifactsPath, outputDir, ".version");
|
||||||
|
|
||||||
string[] versionLines = File.ReadAllLines(Path.Combine(outputDir, ".version"));
|
string[] versionLines = File.ReadAllLines(Path.Combine(outputDir, ".version"));
|
||||||
Assert.Equal(2, versionLines.Length);
|
Assert.Equal(2, versionLines.Length);
|
||||||
|
@ -48,7 +52,7 @@ public class SourceBuiltArtifactsTests : SmokeTests
|
||||||
string sdkVersion = versionLines[1];
|
string sdkVersion = versionLines[1];
|
||||||
|
|
||||||
// Find the expected SDK version by getting it from the SDK tarball
|
// Find the expected SDK version by getting it from the SDK tarball
|
||||||
ExtractFileFromTarball(Config.SdkTarballPath ?? string.Empty, "./sdk/*/.version", outputDir);
|
Utilities.ExtractTarball(Config.SdkTarballPath ?? string.Empty, outputDir, "./sdk/*/.version");
|
||||||
DirectoryInfo sdkDir = new DirectoryInfo(Path.Combine(outputDir, "sdk"));
|
DirectoryInfo sdkDir = new DirectoryInfo(Path.Combine(outputDir, "sdk"));
|
||||||
string sdkVersionPath = sdkDir.GetFiles(".version", SearchOption.AllDirectories).Single().FullName;
|
string sdkVersionPath = sdkDir.GetFiles(".version", SearchOption.AllDirectories).Single().FullName;
|
||||||
string[] sdkVersionLines = File.ReadAllLines(Path.Combine(outputDir, sdkVersionPath));
|
string[] sdkVersionLines = File.ReadAllLines(Path.Combine(outputDir, sdkVersionPath));
|
||||||
|
@ -61,9 +65,4 @@ public class SourceBuiltArtifactsTests : SmokeTests
|
||||||
Directory.Delete(outputDir, recursive: true);
|
Directory.Delete(outputDir, recursive: true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ExtractFileFromTarball(string tarballPath, string filePath, string outputDir)
|
|
||||||
{
|
|
||||||
ExecuteHelper.ExecuteProcessValidateExitCode("tar", $"--wildcards -xzf {tarballPath} -C {outputDir} {filePath}", OutputHelper);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,12 @@
|
||||||
// The .NET Foundation licenses this file to you under the MIT license.
|
// The .NET Foundation licenses this file to you under the MIT license.
|
||||||
// See the LICENSE file in the project root for more information.
|
// See the LICENSE file in the project root for more information.
|
||||||
|
|
||||||
|
using Microsoft.Extensions.FileSystemGlobbing;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Formats.Tar;
|
||||||
|
using System.IO;
|
||||||
|
using System.IO.Compression;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Xunit.Abstractions;
|
using Xunit.Abstractions;
|
||||||
|
@ -11,6 +16,50 @@ namespace Microsoft.DotNet.SourceBuild.SmokeTests;
|
||||||
|
|
||||||
public static class Utilities
|
public static class Utilities
|
||||||
{
|
{
|
||||||
|
public static void ExtractTarball(string tarballPath, string outputDir)
|
||||||
|
{
|
||||||
|
using FileStream fileStream = File.OpenRead(tarballPath);
|
||||||
|
using GZipStream decompressorStream = new(fileStream, CompressionMode.Decompress);
|
||||||
|
TarFile.ExtractToDirectory(decompressorStream, outputDir, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void ExtractTarball(string tarballPath, string outputDir, string targetFilePath)
|
||||||
|
{
|
||||||
|
Matcher matcher = new();
|
||||||
|
matcher.AddInclude(targetFilePath);
|
||||||
|
|
||||||
|
using FileStream fileStream = File.OpenRead(tarballPath);
|
||||||
|
using GZipStream decompressorStream = new(fileStream, CompressionMode.Decompress);
|
||||||
|
using TarReader reader = new(decompressorStream);
|
||||||
|
|
||||||
|
TarEntry entry;
|
||||||
|
while ((entry = reader.GetNextEntry()) is not null)
|
||||||
|
{
|
||||||
|
if (matcher.Match(entry.Name).HasMatches)
|
||||||
|
{
|
||||||
|
string outputPath = Path.Join(outputDir, entry.Name);
|
||||||
|
Directory.CreateDirectory(Path.GetDirectoryName(outputPath));
|
||||||
|
|
||||||
|
using FileStream outputFileStream = File.Create(outputPath);
|
||||||
|
entry.DataStream.CopyTo(outputFileStream);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static IEnumerable<string> GetTarballContentNames(string tarballPath)
|
||||||
|
{
|
||||||
|
using FileStream fileStream = File.OpenRead(tarballPath);
|
||||||
|
using GZipStream decompressorStream = new(fileStream, CompressionMode.Decompress);
|
||||||
|
using TarReader reader = new(decompressorStream);
|
||||||
|
|
||||||
|
TarEntry entry;
|
||||||
|
while ((entry = reader.GetNextEntry()) is not null)
|
||||||
|
{
|
||||||
|
yield return entry.Name;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static async Task RetryAsync(Func<Task> executor, ITestOutputHelper outputHelper)
|
public static async Task RetryAsync(Func<Task> executor, ITestOutputHelper outputHelper)
|
||||||
{
|
{
|
||||||
await Utilities.RetryAsync(
|
await Utilities.RetryAsync(
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue