通过 powershell 获取压缩的 TFS 2015 (vNext) 构建输出日志(就像构建后的下载链接一样)

2024-05-09

我想知道是否有人有一个 PowerShell 脚本,可以通过 TFS 2015 (vNext) 的 Rest API 下载此构建 ID 的所有当前构建日志(直到当前步骤),为每个记录的构建步骤创建单独的文本文件,并压缩所有文本文件?

或者,如果已经有一种方法可以获取下载 URL 来执行“将所有日志下载为 zip”链接已经执行的操作(构建后),那么如何在 PowerShell 脚本中获取它?

如果给我一点时间,我可能可以自己做这个,但我想我会问,因为肯定有人已经拥有这个功能,如果你这样做了,请分享它。


回复我自己的帖子:

好的,所以我继续花时间编写了一个 powershell 脚本,该脚本完全按照我想要的方式执行,该脚本本质上重复了 TFS 2015 (vNext) 所做的“将所有日志下载为 zip”链接的功能。

您可以将其放入正在运行的构建中的步骤中,或者将其修改为在运行构建之后作为构建定义中的构建后步骤运行。

不同之处在于,在正在运行的构建中,它只会向您提供此 powershell 脚本步骤之前的步骤的日志。使用此 powershell 脚本的构建后定义允许您获取所有日志。

我选择不使用构建后定义,因为此步骤是我正在运行的构建定义中的最后步骤之一,并且后续步骤对于我来说无关紧要,无法获取日志信息(例如,我的最后 2 个步骤是 CreateZippedLogs.ps1 和 Copy将压缩日志发送到文件服务器)。

仅供参考,截至撰写本文时,我正在使用本地 TFS 2015(更新 3)。将 Invoke-RestMethod 行中的 -UseDefaultCredentials 替换为适合您情况的适当授权凭据。

这是 CreateZippedLogs.ps1,根据您的喜好修改它,然后享受:

[CmdletBinding()]
param()

# Create base URI for the REST API
$baseURI = $Env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI + $Env:SYSTEM_TEAMPROJECT + "/_apis/"

# Get Build ID from the environment variable
$buildID = $Env:BUILD_BUILDID

# Build Timeline URI for $Env:BUILD_BUILDID
$buildTimelineURI = "$baseURI/build/builds/$buildID/timeline`?api-version=2.0"

# Output intent to create Zipped Log content for this build id
Write-Output "Attempting to create Zipped Log content for Build ID $buildID from URL: ""$buildTimelineURI"""

# Get sorted build timeline (ascending by default)
$buildTimeline = (Invoke-RestMethod -Uri $buildTimelineURI -UseDefaultCredentials).records | Sort-Object { $_.log.id }

# Get log count
$logsCount = $buildTimeline.Count  # the number of timeline records (i.e. logs in the array)

# Remove sub-staging folder recursively for the logs
# Note: $Env:My_BuildLabel is defined as "$Env:BUILD_DEFINITIONNAME`_$Env:BUILD_BUILDNUMBER" for my builds; use whatever name is appropriate for your builds
$singleLogFileFolder = "$Env:BUILD_ARTIFACTSTAGINGDIRECTORY\$Env:My_BuildLabel`_Logs"
Remove-Item "$singleLogFileFolder" -recurse -ErrorAction SilentlyContinue -Verbose

# Remove any previously created Zip file with the same filename that we are about to create
Remove-Item "$singleLogFileFolder.zip" -ErrorAction SilentlyContinue -Verbose

# If number of logs in the array is > 0, create sub-staging folders for the logs
if ($logsCount -gt 0)
{
    # First, a top-level folder to hold all logs in a single .txt file
    New-Item -ItemType directory -Path "$singleLogFileFolder" -ErrorAction Stop -Verbose
    $stepLogsSingleFile = "$singleLogFileFolder\1_Build.txt"

    # Second, a subfolder to hold individual build step log files
    $stepLogFilesFolder = "$singleLogFileFolder\Build"
    New-Item -ItemType directory -Path "$stepLogFilesFolder" -ErrorAction Stop -Verbose
}
else
{
    # Output that there were no logs found for this Build ID
    Write-Output "No logs found for Build ID $buildID"
    Exit 0  # Exit successfully
}

# Get list of invalid filename characters (in a regex string)
$invalidFilenameCharactersRegexString = "[{0}]+" -f [regex]::Escape(([System.IO.Path]::GetInvalidFileNameChars() -join ""))

# Output progress
Write-Output "Getting Log content and saving to files:"

# Iterate through each record in the build timeline array
foreach ($timelineRecord in $buildTimeline)
{
    # Extract url for each log
    $logURL = $timelineRecord.log.url

    # Don't try to get empty log URL's
    if ([string]::IsNullOrWhiteSpace($logURL))
    {
        continue
    }

    # Get log content
    $logContent = (Invoke-RestMethod -Uri $logURL -UseDefaultCredentials).value

    # Append step log output to the single file (not -Verbose because it duplicates information)
    $logContent | Out-File "$stepLogsSingleFile" -Append

    # Get log id
    $logID = $timelineRecord.log.id

    # Remove any invalid filename characters from the step name
    $stepName = $timelineRecord.name -replace "$invalidFilenameCharactersRegexString", ""

    # Create a step log output filename appropriate to the step number and name
    $stepLogFile = "$stepLogFilesFolder\$logID`_$stepName`.txt"

    # Save the step log content
    $logContent | Out-File "$stepLogFile" -Verbose
}

Write-Output "Compressing Log files:"
if ($PSVersionTable.PSVersion.Major -lt 5)
{
    Add-Type -assembly "system.io.compression.filesystem"
    [io.compression.zipfile]::CreateFromDirectory($singleLogFileFolder, $singleLogFileFolder + ".zip")
}
else
{
    Compress-Archive "$singleLogFileFolder\*" -DestinationPath "$singleLogFileFolder.zip" -Verbose
}

# ----------------------------------------------------------

# Remove temporary sub-staging folder recursively for the logs (don't leave it hanging around)
Write-Output "Removing temporary Log folders and files:"
Remove-Item "$singleLogFileFolder" -recurse -ErrorAction SilentlyContinue -Verbose
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过 powershell 获取压缩的 TFS 2015 (vNext) 构建输出日志(就像构建后的下载链接一样) 的相关文章

  • 如何获取Android崩溃日志?

    我有一个不在市场上的应用程序 使用调试证书签名 但希望在我的应用程序崩溃时获取崩溃日志数据 在哪里可以找到我的应用程序崩溃原因的日志 如果您的应用程序正在被其他人下载并在远程设备上崩溃 您可能需要查看 Android 错误报告库 参考这个帖
  • log4j2 SMTP Appender:如何包含另一个级别的先前消息?

    我正在使用 log4j2 beta9 并且有以下配置 其中一部分
  • TFS API - 缓慢的 foreach 变更集迭代

    问题背景 我正在使用 TFS api 查询 TFS 服务器上的大范围 1 600 文件 我从每个文件中收集其所有 ChangesetId 然后将其收集在列表中 代码 这是我正在使用的代码 它可以正确生成 QueryHistory 方法中指定
  • PowerShell 输出在函数之间交叉

    我正在 Windows 10 上的 5 1 版本中编写一个 PowerShell 脚本 该脚本获取有关本地系统 以及最终其子网 的某些信息并将其输出到文本文件中 起初 我将所有方面都集中在一个函数中 我在输出时遇到了输出问题getUsers
  • cURL 命令在 git bash 中有效,但在 cmd 和 powershell 中无效

    以下命令在 git bash 中有效 但在 cmd 和 powershell 中无效 curl X POST http localhost 5678 api findgen H Content Type application json d
  • Powershell Invoke-SSHCommand:使用“1”个参数调用“EndExecute”时出现异常

    我正在尝试通过 powershell 中的 Posh SSH 模块连接到 Netscaler SDX 服务器 以搜索特定文件 然后下载它 如果我用 putty 连接到服务器 它就可以工作 然后我可以输入 shell 来打开普通的 bash
  • 如何在Powershell控制台中分配多行字符串

    当我在 powershell 控制台中输入此内容时 test Test Test 并且输入多次 它会一直打印 gt gt 所以我永远无法完成命令 该怎么办 应该是行中的第一件事 或者它被认为只是字符串的一部分 test Test Test
  • 使用搜索模式 '...\**\TEST-*.xml 找不到测试结果文件

    我正在 TFS Nunit 加带有适配器的 Visual Studio 中运行测试 并且我已设置构建定义如下 构建成功但没有生成测试结果文件 TFS 是否写入此 Xml 文件 日志 2017 02 08T08 08 40 8151428Z
  • 我可以在 Emacs 的 shell 模式下使用 PowerShell 吗?

    我可以在 emacs 的 shell 模式下使用 powershell 作为 shell 吗 How 请参阅 Jeffrey Snover 的博客文章在 Emacs 内运行的 PowerShell http blogs msdn com p
  • 在 C# 中编写批处理脚本的好方法是什么?

    我想用 C 编写简单的脚本 我通常会使用 bat 或 4NT btm 文件 复制文件 解析文本 询问用户输入等等 相当简单 但在批处理文件中正确执行这些操作确实很困难 例如没有例外 我熟悉像 AxScript 这样的命令行 脚本 包装器 这
  • 如何使用 python(版本 2.5)压缩文件夹的内容?

    一旦我在特定文件夹中拥有了所需的所有文件 我希望我的 python 脚本能够压缩文件夹内容 这可能吗 我该如何去做呢 在 python 2 7 上你可以使用 Shutil make archive base name 格式 root dir
  • 在 Spring Boot 应用程序中启用 Spring 框架的日志记录

    我已经使用 spring boot 创建了简单的网络应用程序 我想为 springframework 包启用调试日志 我知道如何在普通 spring mvc 项目中启用日志记录 我在这里尝试了相同的操作 但它不起作用 有人可以帮我吗 我的
  • 拖放到 Powershell 脚本

    我以为我已经找到了这个问题的答案 但我玩得越多 我就越发现它是 Powershell 的设计缺陷 我想拖放 或使用发送到机制 将多个文件和 或文件夹作为数组传递到 Powershell 脚本 测试脚本 Test ps1 param stri
  • 在 git 中记录前 10 个

    两个问题 如何从头到尾显示 git 中的前 10 个提交 无分行 如何指定提交索引并记录它 显示第二个或第三个 我知道 git 使用父级来链接提交 很容易从头到尾记录提交 喜欢 git log HEAD 10 但我需要从头到尾查询 可以吗
  • TFS 构建代理无法找到 npm

    在本地托管的 TFS 上 我在构建定义中使用 npm install 构建步骤 在我安装的代理机器上nodejs https nodejs org en 并且可以运行npm从命令行 当我尝试对构建进行排队时 我会弹出一条消息 找不到具有以下
  • Flask 的“app.logger”的 Pylint 误报:E1101:方法“logger”没有“debug”成员(无成员)

    使用烧瓶的app logger成员函数 例如app logger error 原因pylint报告E1101 no member 错误 即使这些成员app logger是在运行时定义的 这可以通过使用以下文件来重现 app py impor
  • PowerShell 中转义反引号“`”和反斜杠“\”有什么区别?

    我知道两者都在 PowerShell 中使用 但用于不同的上下文 互联网上关于这个主题的信息很少 唯一谈论这个主题的网站 没有让我理解这个概念 是 https www rlmueller net PowerShellEscape htm h
  • Start-Job 输出去了哪里?

    W gt job start job Write Output hi there throw an error Wait Job W gt job select State Failed HasMoreData True StatusMes
  • log4j.RollingFileAppender 不压缩文件

    如何在 log4j 中压缩备份文件RollingFileAppender 我有以下log4j 属性file 当超过大小限制时 它会创建备份文件但不会压缩它 log4j appender request org apache log4j Ro
  • 如何忽略警告错误?

    我有以下 PowerShell 脚本 它获取给定 IP 地址内计算机的 NetBIOS 名称 我正在使用管道将结果转储到文本文件中 问题是 如果 IP 地址不可用 则会打印警告 这是 PowerShell 脚本 function Get C

随机推荐

  • MYSQL数据库删除行后需要进行后期优化

    我有一个当前为 10GB 的日志表 它有很多过去两年的数据 我真的觉得目前我不需要那么多 我是否错误地认为在表中保存多年的数据不好 表越小越好 我的桌子都有 MYISAM 引擎 我想删除 2014 年和 2015 年的所有数据 很快我就会删
  • 正确使用“extern”关键字

    有一些来源 书籍 在线材料 解释了extern如下 extern int i declaration has extern int i 1 definition specified by the absence of extern 并且有支
  • 奇怪的 ASP.NET 错误!

    我正在运行带有 IIS 7 5 的 Windows 7 x64 版本 我有一个简单的 asp net 网站 我在其他版本的 Windows 和 IIS 上运行该网站 但现在在某些页面上出现以下错误 异常信息 异常类型 HttpParseEx
  • 为什么jdk中没有ConcurrentLinkedHashMap类?

    这个问题直接接着问从我之前的问题来看 https stackoverflow com q 12299731 1527084 我想我的第二个问题的答案是否定的 所以我想了解为什么 java util concurrent 包中没有 Concu
  • 有没有任何工具可以将 PVR 纹理分割成一组图块?

    我有一张大的 png 纹理 4096x4096 我需要将其部分加载到内存中 我已经将大 png 纹理分割成 16 个 1024x1024 块 然后将它们转换为 PVR 压缩文件 问题是 当我绘制这些图块时 图块之间的边缘与 png 的边缘不
  • 使用 Flask-SQLAlchemy 进行多对多多数据库连接

    我正在尝试使这个多对多联接与 Flask SQLAlchemy 和两个 MySQL 数据库一起工作 并且它非常接近 只是它为联接表使用了错误的数据库 这是基础知识 我有main db and vendor db 表格设置为main db u
  • Flutter 分析/构建在 GitHub 操作中失败

    当运行以下操作时 它会失败flutter analyze 如果我删除它 稍后会失败flutter build 这两个命令在本地都可以正常工作 我理解该消息 但无法理解包路径可能有什么问题 GitHub 操作错误 flutter analyz
  • 如何在Webview中保存用户名和密码

    目前 我还在学习Android开发的过程中 所以如果我的这个问题对你来说不太容易理解 请原谅 我创建了一个 Android 应用程序 它使用 RecyclerView 显示一组列表 当用户单击列表中的每个名称时 它会将它们重定向到一组不同的
  • 我们可以使用 EWS 托管 API 连接到 Exchange 2016 吗?

    我使用的是 EWS 托管 API 2 2 它的枚举中没有显示 Exchange 版本 2016 我可以看到 Exchange 2013 之前的版本 那么如何连接到 Exchange Server 2016 该 API 是否尚未从 Micro
  • Android - 保持用户登录状态

    我正在尝试使用 PHP 和 MySQLi for Android 进行登录 我不明白的是如何保持用户登录状态 我看到一个简单的教程 其中有人使用 SQLite 来保护信息 但我不知道这是否真的安全 如何保存用户信息以保持用户登录状态 谢谢
  • 将enable_nestloop设置为OFF有哪些陷阱

    当我的表中有大量行时 我的应用程序中有一个查询运行得非常快 但是 当行数适中 既不大也不小 时 相同的查询运行速度会慢 15 倍 解释计划显示对中等规模数据集的查询正在使用嵌套循环其连接算法 大数据集使用散列连接 我可以阻止查询规划器在数据
  • MySQL 连接逗号分隔字段

    我有两张桌子 第一个表是batch在字段 batch 中包含逗号分隔的学生 ID 的表 batch id batch 1 1 2 2 3 4 第二个表是分数 marks id studentid subject marks 1 1 Engl
  • 注解和装饰器有什么区别?

    我很困惑何时使用术语注释以及何时使用装饰器 Component selector tabs template export class Tabs 装饰器对应于在类上调用的函数 而注释是使用 Reflect Metadata 库在类上设置的
  • 如何在 flutter 中用动画 POP

    我正在触发 Navigator pop 事件 并且想要淡出到页面的过渡 我尝试过 Fluro 但没有尝试过 我对实施它不感兴趣 这就是我正在做的 Widget build BuildContext context return Scaffo
  • “if”在 ASP.NET MVC View (.aspx) 文件中被认为有害?

    我记得看到一个博客 或其他内容 说你不应该在 ASP NET MVC 的 aspx 文件中使用 但我不记得它说的替代方案是什么 有人记得看过这个并指出我吗 基本上 这意味着您的视图中不应该有大量的 if 语句 您的控制器和视图模型应该能够处
  • 对数据框的行进行排序

    我有以下数据框 adjusted RFC df Node Feature Indicator Scaled Class Direction True False 0 0 km lt 0 181 class 4 0 gt 1 NA 125 1
  • 导入 CSS 文件时出现“找不到所需模块”的流程

    当我尝试通过 webpack import index css 导入 CSS 时 出现此错误 3 import index css index css Required module not found 我有一个类似 ComponentNa
  • jQuery 在提交的数据中附加一些奇怪的字符串

    重现该bug的代码 在html页面中放入以下代码并读取Fiddler中提交的数据 jQuery 1 4 2工作正常 问题发生在1 5 1和1 5 2
  • maven 构建 OSGi 的问题(包括依赖项)

    我目前正在从 OSGi iPOJO 和 iPOJO Annotations 开始 并尝试构建一个要在 Felix 中部署的简单组件 不幸的是 我遇到了各种问题 这些问题需要我花几个小时才能解决 或者在浪费时间后我什至无法解决 如下所示 我想
  • 通过 powershell 获取压缩的 TFS 2015 (vNext) 构建输出日志(就像构建后的下载链接一样)

    我想知道是否有人有一个 PowerShell 脚本 可以通过 TFS 2015 vNext 的 Rest API 下载此构建 ID 的所有当前构建日志 直到当前步骤 为每个记录的构建步骤创建单独的文本文件 并压缩所有文本文件 或者 如果已经