From e8bb21b6119f5416a0cf49dfde5ae1c3f2bbbb99 Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Fri, 30 Jan 2026 14:29:20 -0800 Subject: [PATCH 1/2] Add new linux-64 build using Rocky Linux --- .pipelines/release.yml | 34 ++++++++++---- .../{build-alpine.yml => build-docker.yml} | 35 +++++++++----- .pipelines/templates/build-nuget.yml | 6 +-- build.psm1 | 47 +++++++++++-------- Dockerfile => docker/alpine/Dockerfile | 0 docker/rocky/Dockerfile | 11 +++++ 6 files changed, 90 insertions(+), 43 deletions(-) rename .pipelines/templates/{build-alpine.yml => build-docker.yml} (71%) rename Dockerfile => docker/alpine/Dockerfile (100%) create mode 100644 docker/rocky/Dockerfile diff --git a/.pipelines/release.yml b/.pipelines/release.yml index f6e983d..4fbff49 100644 --- a/.pipelines/release.yml +++ b/.pipelines/release.yml @@ -92,18 +92,36 @@ extends: value: mcr.microsoft.com/dotnet/sdk:10.0-alpine jobs: - - template: .pipelines/templates/build-alpine.yml@self + - template: .pipelines/templates/build-docker.yml@self parameters: - ARCHITECTURE: 'linux-musl-x64' - Name: 'Build_Linux_musl_x64' + ARCHITECTURE: 'x64' + Name: 'Linux_musl_x64' + BuildPlatform: 'alpine' + StageName: 'LinuxMuslBuild' + + + - stage: LinuxRockyBuild + displayName: Linux Rocky Build + variables: + - name: LinuxContainerImage + value: onebranch.azurecr.io/linux/rockylinux + + jobs: + - template: .pipelines/templates/build-docker.yml@self + parameters: + ARCHITECTURE: 'x64' + Name: 'Linux_rocky_x64' + LinuxContainerImage: 'onebranch.azurecr.io/linux/rockylinux' + BuildPlatform: 'rocky' + StageName: 'LinuxRockyBuild' - stage: LinuxBuild displayName: Linux Build jobs: - - template: .pipelines/templates/build-linux.yml@self - parameters: - ARCHITECTURE: 'linux-x64' - Name: 'Build_Linux_x64' + # - template: .pipelines/templates/build-linux.yml@self + # parameters: + # ARCHITECTURE: 'linux-x64' + # Name: 'Build_Linux_x64' - template: .pipelines/templates/build-linux.yml@self parameters: @@ -129,7 +147,7 @@ extends: Name: 'Build_Linux_arm' - stage: Build_Nuget - dependsOn: [WinBuildAndSign, LinuxBuild, LinuxBuildARM, LinuxMuslBuild] + dependsOn: [WinBuildAndSign, LinuxBuild, LinuxBuildARM, LinuxMuslBuild, LinuxRockyBuild] displayName: Build NuGet jobs: - template: .pipelines/templates/build-nuget.yml@self diff --git a/.pipelines/templates/build-alpine.yml b/.pipelines/templates/build-docker.yml similarity index 71% rename from .pipelines/templates/build-alpine.yml rename to .pipelines/templates/build-docker.yml index 29b1f8d..32cf75b 100644 --- a/.pipelines/templates/build-alpine.yml +++ b/.pipelines/templates/build-docker.yml @@ -8,6 +8,15 @@ parameters: - name: hostArchitecture type: string default: 'amd64' + - name: LinuxContainerImage + type: string + default: 'mcr.microsoft.com/dotnet/sdk:10.0-alpine' + - name: BuildPlatform + type: string + default: 'alpine' + - name: StageName + type: string + default: 'LinuxMuslBuild' jobs: - job: PrepareDockerBuild @@ -45,11 +54,11 @@ jobs: os: linux ${{ if eq(parameters.hostArchitecture, 'arm64') }}: hostArchitecture: 'arm64' - displayName: Linux_MUSL_${{ parameters.ARCHITECTURE }} + displayName: Linux_${{ parameters.BuildPlatform}}_${{ parameters.ARCHITECTURE }} dependsOn: PrepareDockerBuild variables: - name: LinuxContainerImage - value: mcr.microsoft.com/dotnet/sdk:10.0-alpine + value: ${{ parameters.LinuxContainerImage }} - name: ob_outputDirectory value: '$(Build.ArtifactStagingDirectory)/ONEBRANCH_ARTIFACT' - name: ob_signing_setup_enabled @@ -68,17 +77,17 @@ jobs: displayName: 'Download prepared Docker build context' inputs: buildType: 'current' - artifactName: 'drop_LinuxMuslBuild_PrepareDockerBuild' - targetPath: '$(Build.SourcesDirectory)/dst/drop_LinuxMuslBuild_PrepareDockerBuild' + artifactName: 'drop_${{ parameters.StageName }}_PrepareDockerBuild' + targetPath: '$(Build.SourcesDirectory)/dst/drop_${{ parameters.StageName }}_PrepareDockerBuild' - task: onebranch.pipeline.imagebuildinfo@1 - displayName: 'Build Alpine Image' + displayName: 'Build Image' inputs: - repositoryName: 'psnative-alpine' - dockerFileRelPath: 'drop_LinuxMuslBuild_PrepareDockerBuild/powershell-native/Dockerfile' - dockerFileContextPath: 'drop_LinuxMuslBuild_PrepareDockerBuild/powershell-native' + repositoryName: 'psnative-${{ parameters.BuildPlatform }}' + dockerFileRelPath: 'drop_${{ parameters.StageName }}_PrepareDockerBuild/powershell-native/docker/${{ parameters.BuildPlatform }}/Dockerfile' + dockerFileContextPath: 'drop_${{ parameters.StageName }}_PrepareDockerBuild/powershell-native' addPipelineData: false - saveImageToPath: docker-images/psnative-alpine.tar + saveImageToPath: docker-images/psnative-${{ parameters.BuildPlatform }}.tar build_tag: $(Build.BuildId) compress: false enable_isolated_acr_push: false @@ -103,18 +112,18 @@ jobs: clean: true - download: current - artifact: drop_LinuxMuslBuild_Build_Linux_musl_x64 - patterns: docker-images/psnative-alpine.tar + artifact: drop_${{ parameters.StageName }}_${{ parameters.Name }} + patterns: docker-images/psnative-${{ parameters.BuildPlatform}}.tar displayName: 'Download Docker image artifact' - pwsh: | - Get-ChildItem $(Pipeline.Workspace)/drop_LinuxMuslBuild_Build_Linux_musl_x64 -Recurse | Out-String -Stream | Write-Verbose -Verbose + Get-ChildItem $(Pipeline.Workspace)/drop_${{ parameters.StageName }}_${{ parameters.Name }} -Recurse | Out-String -Stream | Write-Verbose -Verbose displayName: Capture downloaded artifacts - pwsh: | New-Item -ItemType Directory -Path "$(ob_outputDirectory)" | Out-Null New-Item -ItemType Directory -Path $(Pipeline.Workspace)/temp | Out-Null - tar -xvf $(Pipeline.Workspace)/drop_LinuxMuslBuild_Build_Linux_musl_x64/docker-images/psnative-alpine.tar -C $(Pipeline.Workspace)/temp + tar -xvf $(Pipeline.Workspace)/drop_${{ parameters.StageName }}_${{ parameters.Name }}/docker-images/psnative-${{ parameters.BuildPlatform}}.tar -C $(Pipeline.Workspace)/temp $manifest = Get-Content "$(Pipeline.Workspace)/temp/manifest.json" $manifest | Out-String -Stream | Write-Verbose -Verbose diff --git a/.pipelines/templates/build-nuget.yml b/.pipelines/templates/build-nuget.yml index e688049..c3d5064 100644 --- a/.pipelines/templates/build-nuget.yml +++ b/.pipelines/templates/build-nuget.yml @@ -35,7 +35,7 @@ jobs: - pwsh: | $platforms = @("drop_LinuxBuild_Build_Linux_arm64", "drop_LinuxMuslBuild_ExtractLibPSL", - "drop_LinuxBuild_Build_Linux_x64", + "drop_LinuxRockyBuild_ExtractLibPSL", "drop_LinuxBuildARM_Build_Linux_arm", "drop_WinBuildAndSign_Build_Sign_x64", "drop_WinBuildAndSign_Build_Sign_x86", @@ -47,10 +47,10 @@ jobs: $WindowsX86ZipPath = "$(ob_outputDirectory)/drop_WinBuildAndSign_Build_Sign_x86.zip" $WindowsARMZipPath = "$(ob_outputDirectory)/drop_WinBuildAndSign_Build_Sign_arm.zip" $WindowsARM64ZipPath = "$(ob_outputDirectory)/drop_WinBuildAndSign_Build_Sign_x64_arm64.zip" - $LinuxZipPath = "$(ob_outputDirectory)/drop_LinuxBuild_Build_Linux_x64.zip" $LinuxARMZipPath = "$(ob_outputDirectory)/drop_LinuxBuildARM_Build_Linux_arm.zip" $LinuxARM64ZipPath = "$(ob_outputDirectory)/drop_LinuxBuild_Build_Linux_arm64.zip" $LinuxAlpineZipPath = "$(ob_outputDirectory)/drop_LinuxMuslBuild_ExtractLibPSL.zip" + $LinuxRockyZipPath = "$(ob_outputDirectory)/drop_LinuxRockyBuild_ExtractLibPSL.zip" $macOSZipPath = "$(ob_outputDirectory)/drop_osx.zip" $symbolsRoot = "$(ob_outputDirectory)/symbols" @@ -72,7 +72,7 @@ jobs: Import-Module $(Build.SourcesDirectory)/build.psm1 -Force $PackageRoot = New-Item -ItemType Directory -Path $(ob_outputDirectory)\NugetPackageSrc - Start-BuildPowerShellNativePackage -PackageRoot $PackageRoot -Version $(PackageVersion) -WindowsX64ZipPath $WindowsX64ZipPath -WindowsX86ZipPath $WindowsX86ZipPath -WindowsARM64ZipPath $WindowsARM64ZipPath -LinuxZipPath $LinuxZipPath -LinuxARMZipPath $LinuxARMZipPath -LinuxARM64ZipPath $LinuxARM64ZipPath -LinuxAlpineZipPath $LinuxAlpineZipPath -macOSZipPath $macOSZipPath + Start-BuildPowerShellNativePackage -PackageRoot $PackageRoot -Version $(PackageVersion) -WindowsX64ZipPath $WindowsX64ZipPath -WindowsX86ZipPath $WindowsX86ZipPath -WindowsARM64ZipPath $WindowsARM64ZipPath -LinuxZipPath $LinuxRockyZipPath -LinuxARMZipPath $LinuxARMZipPath -LinuxARM64ZipPath $LinuxARM64ZipPath -LinuxAlpineZipPath $LinuxAlpineZipPath -macOSZipPath $macOSZipPath Write-Verbose -Verbose "Enumerating $symbolsRoot" Get-ChildItem -Path $symbolsRoot -Recurse diff --git a/build.psm1 b/build.psm1 index 21e59c2..0e905ff 100644 --- a/build.psm1 +++ b/build.psm1 @@ -154,8 +154,9 @@ function Get-EnvironmentInformation $environment += @{'IsRedHat7' = $environment.IsRedHat -and $LinuxInfo.VERSION_ID -match '7' } $environment += @{'IsOpenSUSE13' = $environment.IsOpenSUSE -and $LinuxInfo.VERSION_ID -match '13'} $environment += @{'IsOpenSUSE42.1' = $environment.IsOpenSUSE -and $LinuxInfo.VERSION_ID -match '42.1'} + $environment += @{'IsRocky8' = $LinuxInfo.ID -match 'rocky' -and $LinuxInfo.VERSION_ID -match '8'} $environment += @{'IsDebianFamily' = $environment.IsDebian -or $environment.IsUbuntu} - $environment += @{'IsRedHatFamily' = $environment.IsCentOS -or $environment.IsFedora -or $environment.IsRedHat} + $environment += @{'IsRedHatFamily' = $environment.IsCentOS -or $environment.IsFedora -or $environment.IsRedHat -or $environment.IsRocky8} $environment += @{'IsSUSEFamily' = $environment.IsSLES -or $environment.IsOpenSUSE} $environment += @{'IsAlpine' = $LinuxInfo.ID -match 'alpine'} $environment += @{'IsMariner' = $LinuxInfo.ID -match 'mariner' -or $LinuxInfo.ID -match 'azurelinux'} @@ -530,7 +531,8 @@ function Start-BuildNativeUnixBinaries { Start-NativeExecution { ctest --verbose } } else { - Start-NativeExecution { cmake -DCMAKE_BUILD_TYPE=Debug . } + Start-NativeExecution { cmake -DCMAKE_POLICY_VERSION_MINIMUM='3.5' -DCMAKE_BUILD_TYPE=Debug . } + Get-ChildItem . -Recurse | Out-String -Stream | Write-Verbose -Verbose Start-NativeExecution { make -j } Start-NativeExecution { ctest --verbose } } @@ -1946,7 +1948,7 @@ function Install-Dotnet { function Get-RedHatPackageManager { if ($environment.IsCentOS -or (Get-Command -Name yum -CommandType Application -ErrorAction SilentlyContinue)) { "yum install -y -q" - } elseif ($environment.IsFedora -or (Get-Command -Name dnf -CommandType Application -ErrorAction SilentlyContinue)) { + } elseif ($environment.IsFedora -or $environment.IsRocky8 -or (Get-Command -Name dnf -CommandType Application -ErrorAction SilentlyContinue)) { "dnf install -y -q" } elseif ($environment.IsMariner -or (Get-Command -Name tdnf -CommandType Application -ErrorAction SilentlyContinue)) { "tdnf install -y" @@ -1985,6 +1987,12 @@ function Start-PSBootstrap { try { # Update googletest submodule for linux native cmake Push-Location $PSScriptRoot + + if (-not (Test-Path "$PSScriptRoot/.git")) { + Write-Log "Git repository not initialized. Initializing..." + Start-NativeExecution { git init } + } + $Submodule = "$PSScriptRoot/src/libpsl-native/test/googletest" Remove-Item -Path $Submodule -Recurse -Force -ErrorAction SilentlyContinue git submodule --quiet update --init -- $submodule @@ -2033,13 +2041,13 @@ function Start-PSBootstrap { } } elseif ($Environment.IsRedHatFamily -or $Environment.IsMariner) { # Build tools - $Deps += "which", "curl", "wget" + $Deps += "which", "curl", "wget", "gcc", "gcc-c++", "cmake", "make", "git" # .NET Core required runtime libraries $Deps += "libicu", "openssl-libs" # Packaging tools - if ($Package) { $Deps += "ruby-devel", "rpm-build", "groff", 'libffi-devel', "gcc-c++" } + if ($Package) { $Deps += "rpm-build", "gcc-c++" } $PackageManager = Get-RedHatPackageManager @@ -2114,21 +2122,22 @@ function Start-PSBootstrap { Start-NativeExecution { apk add $Deps } } + <# Not needed any more #> # Install [fpm](https://github.com/jordansissel/fpm) and [ronn](https://github.com/rtomayko/ronn) - if ($Package) { - try { - # We cannot guess if the user wants to run gem install as root on linux and windows, - # but macOs usually requires sudo - $gemsudo = '' - if($Environment.IsMacOS) { - $gemsudo = $sudo - } - Start-NativeExecution ([ScriptBlock]::Create("$gemsudo gem install fpm -v 1.9.3")) - Start-NativeExecution ([ScriptBlock]::Create("$gemsudo gem install ronn -v 0.7.3")) - } catch { - Write-Warning "Installation of fpm and ronn gems failed! Must resolve manually." - } - } + # if ($Package) { + # try { + # # We cannot guess if the user wants to run gem install as root on linux and windows, + # # but macOs usually requires sudo + # $gemsudo = '' + # if($Environment.IsMacOS) { + # $gemsudo = $sudo + # } + # Start-NativeExecution ([ScriptBlock]::Create("$gemsudo gem install fpm -v 1.9.3")) + # Start-NativeExecution ([ScriptBlock]::Create("$gemsudo gem install ronn -v 0.7.3")) + # } catch { + # Write-Warning "Installation of fpm and ronn gems failed! Must resolve manually." + # } + # } } # Try to locate dotnet-SDK before installing it diff --git a/Dockerfile b/docker/alpine/Dockerfile similarity index 100% rename from Dockerfile rename to docker/alpine/Dockerfile diff --git a/docker/rocky/Dockerfile b/docker/rocky/Dockerfile new file mode 100644 index 0000000..bce251d --- /dev/null +++ b/docker/rocky/Dockerfile @@ -0,0 +1,11 @@ +FROM onebranch.azurecr.io/linux/rockylinux:latest AS build + +RUN dnf update +RUN dnf install -y gcc git python3 cmake gcc-c++ rpm-build + +COPY . . + +RUN pwsh -c "Import-Module ./build.psm1; Start-BuildNativeUnixBinaries"; + +FROM scratch AS export +COPY --from=build /src/powershell-unix/libpsl-native.so /libpsl-native.so From 78bf05a29f339dbd1cc8a7afad02221aa5dabd8a Mon Sep 17 00:00:00 2001 From: Aditya Patwardhan Date: Mon, 2 Feb 2026 14:40:04 -0800 Subject: [PATCH 2/2] Remove dead code --- .pipelines/release.yml | 5 ----- build.psm1 | 17 ----------------- 2 files changed, 22 deletions(-) diff --git a/.pipelines/release.yml b/.pipelines/release.yml index 4fbff49..356874d 100644 --- a/.pipelines/release.yml +++ b/.pipelines/release.yml @@ -118,11 +118,6 @@ extends: - stage: LinuxBuild displayName: Linux Build jobs: - # - template: .pipelines/templates/build-linux.yml@self - # parameters: - # ARCHITECTURE: 'linux-x64' - # Name: 'Build_Linux_x64' - - template: .pipelines/templates/build-linux.yml@self parameters: ARCHITECTURE: 'linux-arm64' diff --git a/build.psm1 b/build.psm1 index 0e905ff..a83ee0c 100644 --- a/build.psm1 +++ b/build.psm1 @@ -2121,23 +2121,6 @@ function Start-PSBootstrap { Start-NativeExecution { apk update } Start-NativeExecution { apk add $Deps } } - - <# Not needed any more #> - # Install [fpm](https://github.com/jordansissel/fpm) and [ronn](https://github.com/rtomayko/ronn) - # if ($Package) { - # try { - # # We cannot guess if the user wants to run gem install as root on linux and windows, - # # but macOs usually requires sudo - # $gemsudo = '' - # if($Environment.IsMacOS) { - # $gemsudo = $sudo - # } - # Start-NativeExecution ([ScriptBlock]::Create("$gemsudo gem install fpm -v 1.9.3")) - # Start-NativeExecution ([ScriptBlock]::Create("$gemsudo gem install ronn -v 0.7.3")) - # } catch { - # Write-Warning "Installation of fpm and ronn gems failed! Must resolve manually." - # } - # } } # Try to locate dotnet-SDK before installing it