PowerShell
PowerShell 构建运行程序是专门设计用于运行 PowerShell 脚本的。
负责 PowerShell 集成的插件已经在 GitHub 上开源。
跨平台 PowerShell
跨平台 PowerShell(PowerShell Core)支持 Windows、macOS 和 Linux:为您的平台下载一个 PowerShell 软件包,并将其安装在 TeamCity 代理上。
在 Windows 下,支持并存安装 PowerShell Desktop 和 PowerShell Core。
构建代理上已安装 PowerShell 的检测
在启动过程中,TeamCity 代理会在标准位置,例如 程序文件
和 Windows
目录,或者在 ARM64 系统中的 ~/powershell
和 /opt/microsoft/powershell/<版本>/
中,寻找 PowerShell 安装。 您可以在 teamcity.powershell.detector.search.paths
代理属性 中指定一个自定义位置,这样代理就可以检测到此目录(及其子目录)中的 PowerShell。
要列出多个位置,可以用 ;
分隔它们的路径。
PowerShell 设置
选项 | 描述 |
---|---|
版本 | TeamCity 支持的 PowerShell 版本列表。 它被传递给 |
PowerShell 运行模式 | 在 x64 机器上选择所需的执行模式: 版本 指定一个版本(例如,1.0 或 2.0)。 将会与代理上安装的版本进行比较,并将添加适当的要求。 对于 Core 版本,它将被用作下限。 在桌面版中,将使用确切的版本(会添加 如果版本字段留空,将不会添加版本要求的下限,Desktop 版本的 PowerShell 也不会使用 平台 选择平台位数:
版本 选择要使用的 PowerShell 版本:
|
将 stderr 输出格式化为: | 指定运行器如何处理错误输出:
|
工作目录 | 指定到 构建工作目录 的路径。 |
脚本 | 选择您是希望直接在 TeamCity 中输入脚本,还是指定脚本的路径:
|
脚本执行模式 | 指定 PowerShell 脚本的执行模式。 默认情况下,PowerShell 可能不允许执行任意的
|
脚本实参 | 如果"脚本执行模式"选项设置为"从外部文件执行 .ps1 脚本",则此选项可用。 指定构建参数以作为参数传递到 PowerShell 脚本中。 |
附加命令行参数 | 指定要传递给 PowerShell 可执行文件的参数。 |
Docker 设置
在此部分,您可以指定将被用于运行构建步骤的 Docker 镜像。
当前限制
在 Docker 下执行需要将 PowerShell 可执行文件添加到 PATH。
当使用 Docker 运行构建步骤时,只有与 Docker 相关的构建代理要求才适用于构建。
在 PowerShell 构建步骤中选择的 Edition 会影响使用的可执行文件(
powershell.exe
用于桌面,pwsh
用于 Core)。<Auto> 默认为
pwsh
(核心)。要指定自定义的 PowerShell 可执行文件,必须将
teamcity.powershell.virtual.executable
配置参数设置为提供的镜像内此可执行文件的完整路径。Container Wrapper 的当前限制不允许在 Windows 系统下运行 Linux 容器。
已知问题
如果通过 PowerShell Desktop 版本 5.1.17763 或更高版本运行
docker-compose
命令,尽管构建日志中只有误报警告,但 PowerShell 脚本可能会出现错误。
为了解决这个问题,我们建议您使用 PowerShell Core。 另外,您可以通过在docker-compose
命令中添加--log-level ERROR
属性来限制其日志级别。
与 TeamCity 的交互
在使用 PowerShell 与 TeamCity 通过服务消息进行交互时,必须要格外注意。 PowerShell 倾向于使用像 Write-Output
、 Write-Error
等命令将写入控制台的字符串进行包装(参见 TW-15080)。 为了避免这种情况,您可以使用 Write-Host
命令,或者手动调整缓冲区长度:
错误处理
由于 PowerShell 问题导致始终向调用者返回零退出代码,TeamCity 无法始终检测脚本是否正确执行。 我们推荐以下几种方法,可以帮助检测脚本执行失败:
手动捕获异常并明确返回退出代码
PowerShell 插件并未在powershell.exe
周围使用 cmd 包装器。 它使返回显式退出代码成为可能。try { # your code here } Catch { $ErrorMessage = $_.Exception.Message Write-Output $ErrorMessage exit(1) }设置并添加构建失败条件:
如果存在语法错误和异常,PowerShell 将它们写入stderr
。 为了让 TeamCity 判定构建失败,将 错误输出 选项设置为错误
,并添加一个 构建失败条件 ,以在任何错误输出时使构建失败。构建日志中的特定信息导致构建失败:
添加一种 构建失败条件,当构建日志中出现特定信息(例如 "POWERSHELL ERROR")时,将导致构建失败。$ErrorMessage = "POWERSHELL ERROR" try { # your code here } Catch { Write-Output $ErrorMessage exit(1) }
处理输出
为了正确处理 PowerShell 的非 ASCII 输出,必须同时在 PowerShell 端和 TeamCity 端设置正确的编码。
要将 PowerShell 的输出编码设置为 UTF-8,请在您的 PowerShell 脚本开头添加以下行:
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8要在 TeamCity 代理端设置编码,可以设置 Java 启动选项
-Dfile.encoding=UTF-8
,或者将构建 配置参数teamcity.runner.commandline.stdstreams.encoding
的值设置为UTF-8
。
临时文件
TeamCity PowerShell 插件使用临时文件作为入口点;这些文件在构建临时目录中创建,并在 PowerShell 构建步骤完成后移除。 为了保留这些文件,将 powershell.keep.generated
或 teamcity.dont.delete.temp.files
配置参数设置为 true
。
开发链接
PowerShell 支持是以开源插件的形式实现的。 对于开发链接,请参考 插件的页面。