Conditionally execute a TeamCity build step

前端 未结 4 2063
野趣味
野趣味 2020-12-16 09:16

I am working on defining a general-purpose build template for all our projects -- which I have placed at the \"root project\" level (thanks to this new feature of TeamCity 8

相关标签:
4条回答
  • 2020-12-16 09:25

    I've had need for conditional build steps on numerous occasions but alas, the feature does not exist at the moment. http://youtrack.jetbrains.com/issue/TW-17939

    There's no reason you can't have a template used by many build configurations and then simply disable the build step in the build configs/projects that do not need to create the installer. Disabling the step in an individual build config does not affect the parent template it is based on.

    Not as tidy as having a runtime/dynamic method built in to TC but I use it on occasion. I've done iwo has suggested as well.

    0 讨论(0)
  • 2020-12-16 09:30

    As of 2020.1, it appears this feature is now supported.

    See https://www.jetbrains.com/help/teamcity/what-s-new-in-teamcity-2020-1.html#WhatsNewinTeamCity2020.1-Conditionalbuildsteps

    Now, you get granular control over build steps with the new execution conditions. When running a build, TeamCity will execute each step only if all its preconditions, configured by you, are satisfied in the current run.

    In the advanced build step settings, click Add condition and specify a logical condition for any build parameter provided by the TeamCity server or agent. You can quickly select among the example conditions, such as:

    • Run the step only in the default branch
    • Run the step only in the release branch
    • Skip the step in personal builds

    Or, create a custom condition, and TeamCity will automatically suggest supported parameters and values. A wide set of logical conditions and parameters is available.

    0 讨论(0)
  • 2020-12-16 09:42

    I've been researching this use case as I have a very similar problem to solve. The best solution I've found so far is the one stated in fwise's answer - to include all possible steps you might need within your template, but then on a case-by-case basis disable the unrequired steps for each project.

    So in your case you would include your 'installer' build step at the root level, but disable it for any projects which inherit this template and don't have an installer.

    For a single optional step this feels like a good approach but admittedly it wouldn't scale very well to large complex templates with many optional steps.

    I picked this up from the TeamCity documentation here:

    • You can reorder build steps as needed. Note, that if you have a build configuration inherited from a template, you cannot reorder inherited build steps. However, you can insert custom build steps (not inherited) at any place and in any order, even before or between inherited build steps. Inherited build steps can be reordered in the original template only.
    • You can disable a build step temporarily or permanently, even if it is inherited from a build configuration template.
    0 讨论(0)
  • 2020-12-16 09:47

    It seems TC does not support conditional runner step execution at their level except the execution policy (only if build status is successful, if all previous steps finished successfully, even if some prev steps failed, always) but that is not what you want.

    So it seems you need to provide a custom system build param for your installer generator powershell build step like system.Generate which should be a bool (you can make it hidden, prompt, get its value based a on a config param, etc), and then in your powershell runner, add this:

    param([int]$Generate)
    if ($Generate) {
      Write-Host "generating installer..."
       # call your func()
    } else {
       Write-Host "skip installer"
    }
    

    In your runner config, add -Generate %system.Generate% as a script argument (careful, not additional command argument!). %system.Generate% should expand to 1 or 0 based on its runtime value.

    0 讨论(0)
提交回复
热议问题