The versions page shows each node's update state with update buttons, API tokens get a release scope that can only register releases (used by CI), and the CI image and release builds now pass the tag, commit and build time.
82 lines
3.0 KiB
PowerShell
82 lines
3.0 KiB
PowerShell
param(
|
|
[Parameter(Mandatory)]
|
|
[ValidateSet(
|
|
'linux-x64', 'linux-arm64',
|
|
'linux-musl-x64', 'linux-musl-arm64',
|
|
'osx-x64', 'osx-arm64', 'win-x64', 'win-arm64'
|
|
)]
|
|
[string]$RuntimeIdentifier,
|
|
[Parameter(Mandatory)]
|
|
[ValidateSet('agent', 'probe', 'fleet-enroll')]
|
|
[string]$Component
|
|
)
|
|
|
|
$ErrorActionPreference = 'Stop'
|
|
Set-StrictMode -Version Latest
|
|
|
|
if (-not $env:CI_COMMIT_TAG -or $env:CI_COMMIT_TAG -notmatch '^v(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)$') {
|
|
throw 'Release must run from a vMAJOR.MINOR.PATCH tag.'
|
|
}
|
|
$version = $Matches[1]
|
|
$root = Split-Path -Parent $PSScriptRoot
|
|
$backend = Join-Path $root 'backend'
|
|
$projectVersion = [regex]::Match((Get-Content (Join-Path $backend 'Directory.Build.props') -Raw), '<Version>([^<]+)</Version>').Groups[1].Value
|
|
if ($version -ne $projectVersion) {
|
|
throw "Tag version $version does not match project version $projectVersion."
|
|
}
|
|
|
|
if ($RuntimeIdentifier -in @('win-x64', 'win-arm64')) {
|
|
$vcArchitecture = if ($RuntimeIdentifier -eq 'win-x64') { 'x64' } else { 'arm64' }
|
|
$vsWhere = Join-Path ${env:ProgramFiles(x86)} 'Microsoft Visual Studio\Installer\vswhere.exe'
|
|
$vsPath = & $vsWhere -latest -products * -requires Microsoft.VisualStudio.Component.VC.Tools.x86.x64 -property installationPath
|
|
if (-not $vsPath) {
|
|
throw 'Visual Studio C++ Build Tools were not found.'
|
|
}
|
|
$devCmd = Join-Path $vsPath 'Common7\Tools\VsDevCmd.bat'
|
|
$environmentLines = & cmd.exe /d /s /c "call `"$devCmd`" -no_logo -arch=$vcArchitecture -host_arch=x64 && set"
|
|
foreach ($line in $environmentLines) {
|
|
$separator = $line.IndexOf('=')
|
|
if ($separator -gt 0) {
|
|
[Environment]::SetEnvironmentVariable($line.Substring(0, $separator), $line.Substring($separator + 1), 'Process')
|
|
}
|
|
}
|
|
}
|
|
|
|
$project = switch ($Component) {
|
|
'agent' { 'agent/src/Monitor.Agent' }
|
|
'probe' { 'probe/src/Monitor.Probe' }
|
|
'fleet-enroll' { 'fleet/tools/fleet-enroll' }
|
|
}
|
|
$output = Join-Path $root ".release\publish\$RuntimeIdentifier\$Component"
|
|
$buildRoot = Join-Path $root ".release\build\$RuntimeIdentifier-$Component"
|
|
$null = New-Item -ItemType Directory -Force -Path $output
|
|
|
|
# 构建信息:程序里显示的 tag、提交、构建时间
|
|
$env:MONITOR_TAG = if ($env:CI_COMMIT_TAG) { $env:CI_COMMIT_TAG } else { "main-$($env:CI_COMMIT_SHA.Substring(0, 10))" }
|
|
$env:MONITOR_COMMIT = $env:CI_COMMIT_SHA.Substring(0, 10)
|
|
$env:MONITOR_BUILT_AT = (Get-Date).ToUniversalTime().ToString('yyyy-MM-ddTHH:mm:ssZ')
|
|
|
|
Push-Location $backend
|
|
try {
|
|
& dotnet publish $project `
|
|
-m:1 `
|
|
-c Release `
|
|
-r $RuntimeIdentifier `
|
|
--self-contained true `
|
|
-p:PublishAot=true `
|
|
-p:UseAotAnywhere=true `
|
|
-p:StripSymbols=true `
|
|
-p:DebugType=none `
|
|
-p:DebugSymbols=false `
|
|
--artifacts-path $buildRoot `
|
|
-o $output
|
|
if ($LASTEXITCODE -ne 0) {
|
|
throw "NativeAOT publish failed for $project ($RuntimeIdentifier)."
|
|
}
|
|
}
|
|
finally {
|
|
Pop-Location
|
|
}
|
|
|
|
Write-Output "built $Component for $RuntimeIdentifier"
|