Smail/deploy/workspace-lock.ps1
smail c33b8bbc2f
Some checks are pending
Security Checks / security (push) Waiting to run
修复构建与后端测试并发冲突并补充迁移验收记录
2026-09-08 18:59:50 +08:00

32 lines
1.3 KiB
PowerShell

function Enter-SmailWorkspaceLock {
param([Parameter(Mandatory = $true)][string]$Root)
# 构建会归档 Go 嵌入资源,必须与同一源码目录的后端测试互斥。
# 使用系统互斥量,进程异常退出后也不会留下需要手工删除的锁文件。
$resolved = (Resolve-Path -LiteralPath $Root -ErrorAction Stop).ProviderPath
$identity = [IO.Path]::GetFullPath($resolved).TrimEnd('\').ToUpperInvariant()
$hash = [Security.Cryptography.SHA256]::Create()
try {
$digest = [BitConverter]::ToString($hash.ComputeHash([Text.Encoding]::UTF8.GetBytes($identity))).Replace('-', '')
} finally {
$hash.Dispose()
}
$mutex = [Threading.Mutex]::new($false, "Local\SmailWorkspace-$digest")
try {
$acquired = $false
try {
$acquired = $mutex.WaitOne(0)
} catch [Threading.AbandonedMutexException] {
# 上一个持有者异常退出时,系统已把互斥量交给当前线程。
$acquired = $true
}
if (-not $acquired) {
throw '同一工作区正在构建或执行后端测试,请等待结束后重试,避免嵌入资源被并发移动。'
}
return $mutex
} catch {
$mutex.Dispose()
throw
}
}