如何在TFS 2015中链接构建?

时间:2015-08-28 12:02:34

标签: tfs tfsbuild tfs2015

在TFS 2015中是否有一种方法可以有两个构建,以便第一个构建在第一个构建完成(成功)时被触发?对于旧的基于XAML的构建系统,有are solutions,但对于我正在使用的基于脚本的新系统没有任何内容。

3 个答案:

答案 0 :(得分:6)

我通过创建自定义BuildTask实现了构建的“链接”,它基本上只是对TFS REST Api进行了适当的调用。它允许我然后定义一个我想要触发的构建定义(按名称)并在顶部添加一些条件(例如,检查是否已经排队了这个定义的构建,或者检查某个定义的最后构建是否成功)。

如果有兴趣,我将源代码上传到github

使用tfx,您可以将任务上传到您的TFS see details here
简而言之,只需从github获取文件,通过node安装tfx并运行

tfx build tasks upload --task-path ./triggerbuildtask

在此之后,您可以选择Trigger new Build Task并对其进行配置: enter image description here

希望这可以帮助一些试图达到同样目标的人。

修改
我将任务打包并在Marketplace上发布,因此可以轻松地在您的环境中使用该任务:
Trigger Build Task

答案 1 :(得分:5)

这个问题时不时会出现。官方文档literally say "not yet"(参见最后的Q& A条目)。还有an ancient suggestion on UserVoice,自今年3月以来一直处于计划状态。这很有希望,让我希望这将首先在vNext构建系统中实现。

答案 2 :(得分:1)

此答案仅适用于

  • 您使用Git with TFS2015
  • 您希望在超级项目下构建子模块
  • 所有相关版本都是持续集成构建。

如果是这种情况,那么你可以" chain-build"作弊(对我有用):

  1. 在每个子模块中添加一个批处理文件(提交给源代码控制),其中包含一个脚本,该脚本将此子模块的分支(正在构建的)的最新提交重新添加到其超级项目中。 这意味着(侧面)效果是引入一个"变化"在超级项目的状态下,足以触发该超级项目的CI构建。
  2. 在每个子模块的构建定义中,添加一个"批处理脚本" v下一步。
  3. 将该步骤指向相应子模块的批处理文件。
  4. 这个构建步骤需要是构建的最后一步,以确保它只在构建成功时执行,然后执行它的" mod"并在超级项目上触发CI构建。
  5. 要开始使用,请参阅下面的示例脚本。此特定脚本仅适用于嵌套"的子模块。在文件系统中彼此 - matreshka风格。否则,每个子模块都需要有一个自定义脚本。

    请注意,它包含一些解决方法,用于解决我在执行我需要它做的事情时遇到的一些问题(例如,在将更改推送到服务器之前,本地计算机上的克隆/ init子模块,然后整理文件)。

    如果需要更多评论,请与我们联系。

    REM Name of your submodule repository...
    set subRepo=%1
    REM Name of your superproject (with respect to this submodule) repository...
    set superRepo=%2
    REM Name of the folder into which the content of submodule will be cloned ...
    REM Without this alias the folder will be called the same as the repo you are cloning.
    set subAlias=%3
    REM Branch to link to, given by $(Build.SourceBranchName) in the parameters you pass 
    REM to the "Run Batch" build step (that will be executing this batch file)...
    set branch=%4
    
    REM Repositories' URLs - ONLY SAMPLE URLS - Please use your own !!!
    set superUrl="http://<YourTfsServerName>:8080/tfs/DefaultCollection/_git/%superRepo%"
    set subUrl="http://<YourTfsServerName>:8080/tfs/DefaultCollection/<YourSuperProjectName>/_git/%subRepo%"
    
    REM Get the latest commit on current branch...
    git log -1 --pretty=format:"%%h" > Output.txt
    for /f %%i in (Output.txt) do set commit=%%i
    
    IF NOT EXIST %superRepo% GOTO NOWINDIR
    
    cd %superRepo%
    REM Handle the .git directory specifically...
    cd .git
    for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
    cd ..
    rmdir .git
    REM Remove the rest of files and folders...
    for /F "delims=" %%i in ('dir /b') do (rmdir "%%i" /s/q || del "%%i" /s/q)
    cd ..
    rmdir %superRepo%
    
    :NOWINDIR
    REM Clone superproject and checkout the required branch *********************************************
    git clone %superUrl%
    cd %superRepo%
    git checkout %branch%
    git pull origin %branch%
    git submodule update --init --recursive -f
    cd %subAlias%
    git checkout %commit% 
    cd ..
    
    git add %subAlias%
    
    git commit %subAlias% -m "Updated %subRepo% reference to %commit% as %subAlias%"
    git push origin %branch%