从 Azure DevOps 上的自托管代理调用系统功能
Call system capability from self hosted agent on Azure DevOps
问题:
在我的发布管道中,我想使用安装在我的自托管代理上的 sqlpackage.exe
。
调查:
- 在自托管代理上,自动检测到 SqlPackage.exe
作为 系统能力:DevOps > 系统能力 >
SQLPackage.exe
- 看来,SystemCapability 也从 Agent 作业中找到了,因为这里定义了
sqlpackage == exists
需求:Agent Job > Demand > sqlpackage == exists
- 这种调用系统能力“sqlpackage”的方法没有用:Failed function call in Pipeline
知道如何从我的托管代理调用 SqlPackage 吗?
所以你有几个选择:
- 调用完整路径
C:\......\sqlpackage.exe
(最简单的方法)
- 使用Get-SqlPackagePath函数获取SQL包的路径,然后使用这个完整路径
function Get-SqlPackagePath {
<#
.SYNOPSIS
Find path to specific version of SqlPackage.exe
.DESCRIPTION
Finds the path to specific version of SqlPackage.exe
Written by (c) Dr. John Tunnicliffe, 2019 https://github.com/DrJohnT/PublishDacPac
This PowerShell script is released under the MIT license http://www.opensource.org/licenses/MIT
.PARAMETER Version
Defines the specific version of SqlPackage.exe to which you wish to obtain the path
latest = use the latest version of SqlPackage.exe
150 = SQL Server 2019
140 = SQL Server 2017
130 = SQL Server 2016
120 = SQL Server 2014
110 = SQL Server 2012
.OUTPUTS
The full path to the specific version of SqlPackage.exe you requested
.EXAMPLE
Get-SqlPackagePath -Version 130
Return the full path to a specific version of SqlPackage.exe
.EXAMPLE
Get-SqlPackagePath -Version latest
Return the full path to a latest version of SqlPackage.exe
.NOTES
This module requires SqlPackage.exe to be installed on the host machine.
This can be done by installing Microsoft SQL Server Management Studio from https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017
#>
[OutputType([string])]
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[ValidateSet('150', '140', '130', '120', '110', 'latest')]
[string]$Version
)
$ExeName = "SqlPackage.exe";
try {
# always return x64 version if present
$SqlPackageExes = Get-Childitem -Path "${env:ProgramFiles}\Microsoft SQL Server$Version" -Recurse -Include $ExeName -ErrorAction SilentlyContinue;
foreach ($SqlPackageExe in $SqlPackageExes) {
$SqlPackageExePath = $SqlPackageExe.FullName;
$ProductVersion = $SqlPackageExe.VersionInfo | Select-Object ProductVersion;
break;
}
if (!($SqlPackageExePath)) {
# try to find x86 version
$SqlPackageExes = Get-Childitem -Path "${env:ProgramFiles(x86)}\Microsoft SQL Server$Version" -Recurse -Include $ExeName -ErrorAction SilentlyContinue;
foreach ($SqlPackageExe in $SqlPackageExes) {
$SqlPackageExePath = $SqlPackageExe.FullName;
$ProductVersion = $SqlPackageExe.VersionInfo | Select-Object ProductVersion;
break;
}
}
if (!($SqlPackageExePath)) {
$VsPaths = Resolve-Path "${env:ProgramFiles(x86)}\Microsoft Visual Studio\*\*\Common7\IDE\Extensions\Microsoft\SQLDB\DAC$Version";
foreach ($VsPath in $VsPaths) {
$SqlPackageExes = Get-Childitem -Path $VsPath -Recurse -Include $ExeName -ErrorAction SilentlyContinue;
foreach ($SqlPackageExe in $SqlPackageExes) {
$SqlPackageExePath = $SqlPackageExe.FullName;
$ProductVersion = $SqlPackageExe.VersionInfo | Select-Object ProductVersion;
break;
break;
}
}
}
if (!($SqlPackageExePath)) {
$VsPaths = Resolve-Path "${env:ProgramFiles(x86)}\Microsoft Visual Studio*\Common7\IDE\Extensions\Microsoft\SQLDB\DAC$Version";
foreach ($VsPath in $VsPaths) {
$SqlPackageExes = Get-Childitem -Path $VsPath -Recurse -Include $ExeName -ErrorAction SilentlyContinue;
foreach ($SqlPackageExe in $SqlPackageExes) {
$SqlPackageExePath = $SqlPackageExe.FullName;
$ProductVersion = $SqlPackageExe.VersionInfo | Select-Object ProductVersion;
break;
break;
}
}
}
Write-Verbose "SqlPackage $ProductVersion found here $SqlPackageExePath";
}
catch {
Write-Error "Get-SqlPackagePath failed with error $Error";
}
return $SqlPackageExePath;
}
- 调用 Agent REST API 启用
includeCapabilities
的端点,然后解析响应以获取 sqlpackage 完整路径并使用完整路径
问题:
在我的发布管道中,我想使用安装在我的自托管代理上的 sqlpackage.exe
。
调查:
- 在自托管代理上,自动检测到 SqlPackage.exe 作为 系统能力:DevOps > 系统能力 > SQLPackage.exe
- 看来,SystemCapability 也从 Agent 作业中找到了,因为这里定义了
sqlpackage == exists
需求:Agent Job > Demand > sqlpackage == exists - 这种调用系统能力“sqlpackage”的方法没有用:Failed function call in Pipeline
知道如何从我的托管代理调用 SqlPackage 吗?
所以你有几个选择:
- 调用完整路径
C:\......\sqlpackage.exe
(最简单的方法) - 使用Get-SqlPackagePath函数获取SQL包的路径,然后使用这个完整路径
function Get-SqlPackagePath {
<#
.SYNOPSIS
Find path to specific version of SqlPackage.exe
.DESCRIPTION
Finds the path to specific version of SqlPackage.exe
Written by (c) Dr. John Tunnicliffe, 2019 https://github.com/DrJohnT/PublishDacPac
This PowerShell script is released under the MIT license http://www.opensource.org/licenses/MIT
.PARAMETER Version
Defines the specific version of SqlPackage.exe to which you wish to obtain the path
latest = use the latest version of SqlPackage.exe
150 = SQL Server 2019
140 = SQL Server 2017
130 = SQL Server 2016
120 = SQL Server 2014
110 = SQL Server 2012
.OUTPUTS
The full path to the specific version of SqlPackage.exe you requested
.EXAMPLE
Get-SqlPackagePath -Version 130
Return the full path to a specific version of SqlPackage.exe
.EXAMPLE
Get-SqlPackagePath -Version latest
Return the full path to a latest version of SqlPackage.exe
.NOTES
This module requires SqlPackage.exe to be installed on the host machine.
This can be done by installing Microsoft SQL Server Management Studio from https://docs.microsoft.com/en-us/sql/ssms/download-sql-server-management-studio-ssms?view=sql-server-2017
#>
[OutputType([string])]
[CmdletBinding()]
param(
[Parameter(Mandatory = $true)]
[ValidateSet('150', '140', '130', '120', '110', 'latest')]
[string]$Version
)
$ExeName = "SqlPackage.exe";
try {
# always return x64 version if present
$SqlPackageExes = Get-Childitem -Path "${env:ProgramFiles}\Microsoft SQL Server$Version" -Recurse -Include $ExeName -ErrorAction SilentlyContinue;
foreach ($SqlPackageExe in $SqlPackageExes) {
$SqlPackageExePath = $SqlPackageExe.FullName;
$ProductVersion = $SqlPackageExe.VersionInfo | Select-Object ProductVersion;
break;
}
if (!($SqlPackageExePath)) {
# try to find x86 version
$SqlPackageExes = Get-Childitem -Path "${env:ProgramFiles(x86)}\Microsoft SQL Server$Version" -Recurse -Include $ExeName -ErrorAction SilentlyContinue;
foreach ($SqlPackageExe in $SqlPackageExes) {
$SqlPackageExePath = $SqlPackageExe.FullName;
$ProductVersion = $SqlPackageExe.VersionInfo | Select-Object ProductVersion;
break;
}
}
if (!($SqlPackageExePath)) {
$VsPaths = Resolve-Path "${env:ProgramFiles(x86)}\Microsoft Visual Studio\*\*\Common7\IDE\Extensions\Microsoft\SQLDB\DAC$Version";
foreach ($VsPath in $VsPaths) {
$SqlPackageExes = Get-Childitem -Path $VsPath -Recurse -Include $ExeName -ErrorAction SilentlyContinue;
foreach ($SqlPackageExe in $SqlPackageExes) {
$SqlPackageExePath = $SqlPackageExe.FullName;
$ProductVersion = $SqlPackageExe.VersionInfo | Select-Object ProductVersion;
break;
break;
}
}
}
if (!($SqlPackageExePath)) {
$VsPaths = Resolve-Path "${env:ProgramFiles(x86)}\Microsoft Visual Studio*\Common7\IDE\Extensions\Microsoft\SQLDB\DAC$Version";
foreach ($VsPath in $VsPaths) {
$SqlPackageExes = Get-Childitem -Path $VsPath -Recurse -Include $ExeName -ErrorAction SilentlyContinue;
foreach ($SqlPackageExe in $SqlPackageExes) {
$SqlPackageExePath = $SqlPackageExe.FullName;
$ProductVersion = $SqlPackageExe.VersionInfo | Select-Object ProductVersion;
break;
break;
}
}
}
Write-Verbose "SqlPackage $ProductVersion found here $SqlPackageExePath";
}
catch {
Write-Error "Get-SqlPackagePath failed with error $Error";
}
return $SqlPackageExePath;
}
- 调用 Agent REST API 启用
includeCapabilities
的端点,然后解析响应以获取 sqlpackage 完整路径并使用完整路径