Git Product home page Git Product logo

jenkinsci / build-history-manager-plugin Goto Github PK

View Code? Open in Web Editor NEW
4.0 3.0 12.0 475 KB

Jenkins plugin that allows to define which builds should be removed and which preserved. Several decision factors such as date, number or result can be taken into account

Home Page: https://plugins.jenkins.io/build-history-manager/

License: MIT License

Java 92.93% HTML 7.07%
jenkins plugin build history discarder logrotate job purge discard old

build-history-manager-plugin's Introduction

Build Status Appveyor status

Coverage Status Codebeat badge Sonarqube Status Vulnerabilities CII Best Practices

Installs Version

Build History Manager Plugin

This is a Jenkins plugin that allows the building of simple but powerful rules to define which builds should be removed from the history and which ones should be preserved.

The rules use conditionals to filter (select) completed builds from the build history and actions to operate on the builds selected by the conditionals.

Rules

Users can add Build History Manager rules to Jenkins jobs. The rules are composed of three types of objects:

  1. Built-in conditions that control the applications of rules to builds,
  2. Optional Conditions that are ANDed together to filter (select) builds,
  3. Optional Actions that are applied to builds when all their rule's conditions are met.

Built-in conditions

The plugin has three built-in conditions that control the flow of operations. Users cannot remove these conditions. The first one is built-in to the plugin for all rules, and the other two are configurable on a per-rule basis.

The built-in conditions are:

  1. A global check for the "Keep this build forever" state, and when it returns true, rules are not applied to the build. This currently cannot be controlled nor configured by the user.
  2. A per-rule matchAtMost counter (Process this rule at most (times) in the UI) that limits the number of times a rule can be applied (default is -1, meaning there is no limit).
  3. A per-rule continueAfterMatch boolean (Proceed to the next rule if the conditions of this rule are met in the UI) that causes the plugin to apply the next rule to the same build after the current rule has been applied (default is true, meaning to continue to apply rules to the build being processed).

Optional Conditions

Users can add a list of Conditions to each rule, in any order they need. The conditions are checked in the order they are defined.

The conditions are:

Providing the built-in conditions allow, the optional condition checks have the following effects:

  1. As soon as one of the conditions does not match, the plugin ignores the rule's Actions.
  2. When all the conditions of the rule are met, the plugin applies the rule's Actions.
  3. When no optional conditions are specified, the plugin automatically applies the rule's Actions.

Optional Actions

Users can add a list of Actions to each rule, in any order they need. The actions are applied in the order they are defined.

The actions are:

If the first action is to delete the build, the other actions will still be applied but have no real effect.

Operation

The plugin starts by initializing the internal match counters for each rule to zero.

The plugin then loops through all the completed builds in the build history, starting from the most recent, and processes each build with possibly every rule (depending on the conditions) by looping through the rule list once for each completed build.

  1. For each completed build, the following happens:
    1. If the build is marked as keep forever, the build is ignored and the loop moves on to the next completed build.
    2. For each rule, the following happens to the current build:
      1. If the "rule match counter" equals the matchAtMost value, stop processing the current rule and move on to the next rule (next iteration of "for each rule")
      2. If there are no optional conditions, or if all the optional conditions are matched, the following happens:
        1. The rule counter is incremented by one.
        2. All the actions are performed.
        3. If continueAfterMatch is true, the next rule is applied to the same build, and goes to the next iteration of the "for each rule" loop.
        4. If continueAfterMatch is false, the plugin stops applying rules to this build, and goes to the next iteration of the "for each completed build" loop.
      3. If one or more optional conditions are not met, the build continues to the next rule (next iteration of the "for each rule" loop).

Notes:

  1. If the matchAtMost value is set to zero, the rule is effectively disabled. This is useful if the user wants to disable a rule while keeping its other configuration values.
  2. Once the matchAtMost value is reached, the rule is effectively disabled and is no longer applied.
  3. It may not make sense to continue to apply rules after a build is deleted, but the plugin handles this case gracefully.
  4. Having no condition is a way to unconditionally apply actions to builds, for example to delete all the builds. Use it wisely.
  5. Having no action is a way to ignore builds and keep them in the build history.

Use cases

By using conditions and actions, it becomes straightforward to achieve a number of scenarios, including:

  • Delete unstable or aborted builds from the build history if they do not provide any value.
  • Keep only the last builds depending on their result, so the history contains the most recent builds with the specified result(s): aborted, unstable, not built, failure, or success.
  • Keep builds only from master branch if the project builds all branches including feature branches
  • Remove any builds with a build number lower than the specified value to easily discard all old builds at once.

Examples

Keep 5 most recent builds, delete the rest

The following configuration allows to save the last 5 builds, while deleting the rest of the build history:

feature overview page

Retain most recent broken build

The following configuration has two rules. The first rule ensures that the latest build with a failure result is not deleted. The second rule deletes all builds which are not success. In other words, it keeps the most recent broken build and all stable builds.

pipeline {
    agent any

    options {
        buildDiscarder(BuildHistoryManager([
            [
                conditions: [
                    BuildResult(matchFailure: true)
                ],
                matchAtMost: 1,
                continueAfterMatch: false
            ],
            [
                conditions: [
                    BuildResult(matchNotBuilt: true, matchAborted: true, matchFailure: true, matchUnstable: true)
                ],
                actions: [DeleteBuild()]
            ]
        ]))
    }

    stages {
        stage('Demo') {
            steps {
                echo "Hello!"
            }
        }
    }
}

Remove builds based on a parameter

The following configuration has three rules. The first rule uses the token macro condition to test the value of a parameter. It removes builds where the string value of ENABLE_HISTORY is "false". The second rule preserves the most recent 24 builds that do not match the first rule. The third rule deletes the remaining build. Consequently, these three rules work together to preserve the last 24 builds where ENABLE_HISTORY is true.

pipeline {
    agent any

    options {
        buildDiscarder(BuildHistoryManager([
            [
                conditions: [
                    TokenMacro(template: '"${ENABLE_HISTORY}"', value: '"false"')
                ],
                actions: [DeleteBuild()],
                continueAfterMatch: false
            ],
            [
                matchAtMost: 24,
                continueAfterMatch: false
            ],
            [
                actions: [DeleteBuild()]
            ]
        ]))
    }

    parameters {
        booleanParam(
            name: 'ENABLE_HISTORY',
            defaultValue: true,
            description: 'Check to preserve build.'
        )
    }

    stages {
        stage('Demo') {
            steps {
                echo "Hello!"
            }
        }
    }
}

Wiki

Please refer to the Wiki for more detailed information. Additionally, make sure to review the provided guidance on avoiding issues while creating rules.

It is possible to create complex rules with multiple conditions and actions. Each rule can define multiple conditions and actions. The plugin entry point is the BuildHistoryManager class, which extends from the Jenkins core BuildDiscarder class. The Rule.perform() method serves as the core function responsible for processing conditions and actions.

Troubleshooting

The plugin is called by the Jenkins core when the build is completed. It is not tied to any particular run such as the last completed run, which could potentially be deleted by certain actions. To assist with troubleshooting and analysis, the plugin logs helpful messages to the Jenkins logs.

Test & debug

For debugging purposes, you can use the ChangeBuildDescriptionAction action. This action allows you to update the build description, making it convenient to test and debug conditions before applying actual deletions as actions.

Code quality

Once you have developed a new feature or improvement, it is essential to conduct thorough testing by implementing multiple unit or integration tests. This ensures the reliability and functionality of the implemented changes.

codecov.io

Release notes

Please refer to the release notes for the changelog and specific details about the changes made in each version.

Contribution

If you come across an issue, you can contribute by either sending a pull request to resolve it or filing a bug report. This applies similarly if you come across a missing Action or Condition. In addition, it is important to remember the following steps:

  • Conduct tests on your local Jenkins instance to ensure the changes work as expected.
  • Include new unit tests following the given -> when -> then approach to verify the behavior of the changes.
  • Remember to perform integration tests to ensure the changes integrate smoothly with the overall system.
  • Update the wiki documentation to reflect the changes made.

build-history-manager-plugin's People

Contributors

ao-apps avatar briceburg avatar damianszczepanik avatar dependabot[bot] avatar martinda avatar mtughan avatar notmyfault avatar nurgul212 avatar strangelookingnerd avatar thekbro avatar

Stargazers

 avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

build-history-manager-plugin's Issues

DeleteLogFileAction no longer working

As described in https://github.com/jenkinsci/jep/blob/master/jep/210/README.adoc
run.getLogFile() was deprecated and now an unsupported operation exception is thrown

Jenkins and plugins versions report

Jenkins: 2.375.3
OS: Linux - 4.18.0-425.10.1.el8_7.x86_64

Reproduction steps

configure a delete log action for any job

Expected Results

The log should be deleted and no exception should be thrown

Actual Results

java.lang.UnsupportedOperationException
at org.jenkinsci.plugins.workflow.job.WorkflowRun.getLogFile(WorkflowRun.java:1189)
at pl.damianszczepanik.jenkins.buildhistorymanager.model.actions.DeleteLogFileAction.perform(DeleteLogFileAction.java:25)
at pl.damianszczepanik.jenkins.buildhistorymanager.model.Rule.performActions(Rule.java:105)
at pl.damianszczepanik.jenkins.buildhistorymanager.BuildHistoryManager.perform(BuildHistoryManager.java:64)
at hudson.model.Job.logRotate(Job.java:472)
at jenkins.model.JobGlobalBuildDiscarderStrategy.apply(JobGlobalBuildDiscarderStrategy.java:54)
at jenkins.model.BackgroundGlobalBuildDiscarder.lambda$processJob$0(BackgroundGlobalBuildDiscarder.java:67)
at java.base/java.lang.Iterable.forEach(Iterable.java:75)
at jenkins.model.BackgroundGlobalBuildDiscarder.processJob(BackgroundGlobalBuildDiscarder.java:61)
at jenkins.model.BackgroundGlobalBuildDiscarder.execute(BackgroundGlobalBuildDiscarder.java:55)
at hudson.model.AsyncPeriodicWork.lambda$doRun$0(AsyncPeriodicWork.java:102)
at java.base/java.lang.Thread.run(Thread.java:829)

Anything else?

No response

Request for new features: 'Keep Forever Condition' and 'Action of Unkeep Forever, Then Delete After N Days'

What feature do you want to see added?

Feature Request

We propose adding the Keep Forever Condition and Action of Unkeep Forever (or Ignore Keep Forever) options to the plugin's functionality.

Functionality

This new feature would allow users to:

  1. Apply a Keep Forever condition to certain builds
  2. Implement an action of Unkeep Forever or Ignore Keep Forever after a specified number of days, then delete builds after a set period (N days)

Question to the Maintainer:

  • Would you be open to accepting and supporting this proposed feature if we were to develop and submit a pull request with the implementation?

Thank you!!!

Upstream changes

n/a

condition based on build description

What feature do you want to see added?

hi!

the way we would work:

  • when we decide to use a build for a customer, we manually set the build description "use by customer x". it may not be the last successful build
  • if a successful build has NO description and is too old, then it can be automatically deleted

the too old part is good, but i can't manage to get the description part
i guess there can be a token macro that can gives me it, but i can't find it
Capture d'écran 2024-06-07 111936
in this case, when the "too old" condition is met, only build 154 should be kept

thanks

Upstream changes

No response

Are you interested in contributing this feature?

No response

Test methods named *_ReturnsTrue when is testing for returns false

The test methods are named *_ReturnsTrue even when method ends with isFalse().

I'll submit a PR renaming these methods once #72 is merged.

public void match_OnNotMatchSuccessAndResultSuccess_ReturnsTrue() throws IOException {
// given
BuildResultCondition condition = new BuildResultCondition();
condition.setMatchSuccess(false);
Run<?, ?> run = new RunStub(Result.SUCCESS);
// when
boolean matched = condition.matches(run, null);
// then
assertThat(matched).isFalse();
}

Is it possible to mimic the "delete build" button?

What feature do you want to see added?

The API used (run.delete()) deletes all of the build files except for build.xml. The delete build button on an individual build page deletes build.xml as well. Is it possible to mimic this behavior?

Upstream changes

No response

Actions: mark the build to be kept forever (Missing source code)

Describe your use-case which is not covered by existing documentation.

Hello,

In Actions section of README.md, you mentioned that Plugin can: mark the build to be kept forever. However, upon reviewing the source code, I couldn't locate any implementation related to this feature.

I would greatly appreciate it if you could clarify this matter and provide guidance regarding the missing source code.

Thank you.
Nurgul

Reference any relevant documentation, other materials or issues/pull requests that can be used for inspiration.

No response

Can we express these requirements with the plugin?

What feature do you want to see added?

Given these requirements:

  • Builds 10 days and younger are always kept, regardless of their position in the build history
  • The 15 most recent builds are always kept, regardless of their age
  • Discard everything else

Is it possible to implement with the build-history-manager plugin?

Here are some examples/test scenarios:

  1. Suppose my job has 1 run a day, for each of 20 days. We should end up with the last 15 runs kept.
  2. Suppose my job has 2 runs a day, for each of 20 days. We should end up with the last 20 runs kept (i.e. 2 runs a day for the last 10 days - runs older than 10 days are gone).
  3. Suppose my job has 2 runs a day, for the first 10 days, then 10 days without runs. We should end up with the last 15 runs kept (i.e. we're only keeping based on "The 15 most recent builds are always kept, no matter their age", because the other runs have been deleted).
  4. Suppose my job has 15 runs a day, for each of 20 days. We should end up with the last 150 runs kept (15 * 10).

It feels like we would need a BuildPosition condition, which compares against a monotonically-increasing counter of runs (assuming the latest run starts at 1), such that we would be able to craft the configuration to have the following rules:

  1. conditions: [BuildPosition(maxBuildPosition: 15)], continueAfterMatch: false
  2. conditions: [BuildAgeRange(maxDaysAge: 10)], continueAfterMatch: false
  3. actions: [DeleteBuild()]

What do you think?

Thanks!

Upstream changes

n/a

Expressions for conditions

Feature Request

I have a pipeline that can basically execute two kinds of builds (snapshots and releases) and I can distinguish them via a job parameter (empty string -> snapshot; anything else -> release). I'd like to keep a certain amount of builds for each kind of build.
The only condition I could use for something like this seems to be the TokenMacro. So this is the closest I could get to what I would need:

        [
          conditions: [TokenMacro(template: '${RELEASE_VERSION}', value: '')],
          matchAtMost: 2,
          continueAfterMatch: false
        ],
        [
          matchAtMost: 2,
          continueAfterMatch: false
        ],
        [
          actions: [DeleteBuild()]
        ]

The first rule properly matches all snapshot builds. But the problem is, that I don't have a fitting condition for the second rule which should only match release builds. So, the first rule preserves two snapshot builds, but release builds will eventually be flushed out. Unfortunately neither the Token Macro plug-in nor the TokenMacro condition provide anything but a strict "equals".

I have tried to set an environment variable via the environment block (I'm using the declarative pipeline syntax btw) based on the job parameter RELEASE_VERSION to two simple values that I could compare, but it seems the token macro can't pick it up. I tried '${IS_RELEASE}' and '${ENV,var="IS_RELEASE"}'. Do you know, if this should work and I just did something wrong?

While having the full power of Groovy would be nice to create expressions (e.g. by reusing Jenkins' when conditions or maybe via a closure, if that's even technically feasible), at least for my use case an additional not-flag in the TokenMacro condition that turns it into a "not equals" would already be enough.

Unless there's something else that I'm missing?

delete builds if a certain parameter is true or matches a value

I have a parameterized job for running running taurus tests. It is triggered by other jobs that pass in paramaters specific to the test to be run. E.g. a smoke test, a large load test, a small load test, etc -- and thus functions as a test coordinator and handles locking, reporting, etc. etc. in a single place.

We have a scheduled job that triggers our test runner job telling it to run a smoke test every 5 minutes.

As such, we are getting a lot of build history. these scheduled smoke tests builds don't need to be stored. but we'd like to store the manually run builds.

A boolean parameter is used to differentiate between the manual and scheduled tests, e.g.

parameters {
    booleanParam(name: 'ENABLE_HISTORY', defaultValue: true, description: 'Check to preserve build history.')
    ...

and we pass ENABLE_HISTORY as false on scheduled builds.

Is it possible to use this plugin to match this condition? I see the Token macro implementation but am confused as to how it works / don't see any examples.

Many thanks!

Patterns for Artifacts Deletion

What feature do you want to see added?

Hi,

It seems that Build History Manager plugin does not support patterns for artifacts deletion. I am interested in adding this feature.
I wonder if you would consider to add this new feature to the plugin?

Thanks!

Upstream changes

No response

Build cause as a condition

What feature do you want to see added?

Is it possible to add a build cause condition?

The actual use case is:
I have builds that runs every night.
I want to abort some of them, then delete them.
So if the build result is aborted and the build cause/trigger is TimerTriggerCause, it should be deleted.

Upstream changes

No response

Plugin spews MANY, MANY log messages.

Version report

Jenkins and plugins versions report:

Jenkins: 2.277.4.3
OS: Linux - 4.15.0-47-generic
---
Parameterized-Remote-Trigger: "3.1.5.1"
ace-editor: "1.1"
analysis-collector: "2.0.0"
analysis-core: "1.96"
analysis-model-api: "10.0.0"
ansicolor: "1.0.0"
ant: "1.11"
antisamy-markup-formatter: "2.1"
any-buildstep: "0.1"
apache-httpcomponents-client-4-api: "4.5.13-1.0"
artifactdeployer: "0.33"
async-http-client: "1.7.24.3"
audit-trail: "3.8"
authentication-tokens: "1.4"
authorize-project: "1.4.0"
aws-credentials: "1.28.1"
aws-java-sdk: "1.11.995"
blame-upstream-commiters: "1.2"
blueocean: "DISABLED:1.24.6"
blueocean-autofavorite: "DISABLED:1.2.4"
blueocean-bitbucket-pipeline: "DISABLED:1.24.6"
blueocean-commons: "DISABLED:1.24.6"
blueocean-config: "DISABLED:1.24.6"
blueocean-core-js: "DISABLED:1.24.6"
blueocean-dashboard: "DISABLED:1.24.6"
blueocean-display-url: "DISABLED:2.4.1"
blueocean-events: "DISABLED:1.24.6"
blueocean-git-pipeline: "DISABLED:1.24.6"
blueocean-github-pipeline: "DISABLED:1.24.6"
blueocean-i18n: "DISABLED:1.24.6"
blueocean-jira: "DISABLED:1.24.6"
blueocean-jwt: "DISABLED:1.24.6"
blueocean-personalization: "DISABLED:1.24.6"
blueocean-pipeline-api-impl: "DISABLED:1.24.6"
blueocean-pipeline-editor: "DISABLED:1.24.6"
blueocean-pipeline-scm-api: "DISABLED:1.24.6"
blueocean-rest: "DISABLED:1.24.6"
blueocean-rest-impl: "DISABLED:1.24.6"
blueocean-web: "DISABLED:1.24.6"
bootstrap4-api: "4.6.0-3"
bouncycastle-api: "2.20"
branch-api: "2.6.3"
>> build-history-manager: "1.3.0"  <<
build-name-setter: "2.2.0"
build-timeout: "1.20"
build-token-root: "1.7"
build-user-vars-plugin: "1.7"
build-view-column: "0.3"
build-with-parameters: "1.5.1"
built-on-column: "1.1"
checks-api: "1.7.0"
checkstyle: "4.0.0"
claim: "2.18.2"
clang-scanbuild-plugin: "1.7"
cloudbees-aborted-builds: "1.14"
cloudbees-administrative-monitors: "1.0.1"
cloudbees-analytics: "1.28"
cloudbees-assurance: "2.276.0.3"
cloudbees-aws-cli: "1.5.15"
cloudbees-aws-deployer: "1.18"
cloudbees-bitbucket-branch-source: "2.9.7"
cloudbees-blueocean-default-theme: "DISABLED:0.8"
cloudbees-consolidated-build-view: "1.6.1"
cloudbees-credentials: "3.3"
cloudbees-even-scheduler: "3.10"
cloudbees-folder: "6.15"
cloudbees-folders-plus: "3.12"
cloudbees-groovy-view: "1.13"
cloudbees-ha: "DISABLED:4.27"
cloudbees-jsync-archiver: "5.15"
cloudbees-label-throttling-plugin: "3.8"
cloudbees-license: "9.53"
cloudbees-long-running-build: "1.16"
cloudbees-monitoring: "2.11"
cloudbees-nodes-plus: "1.22"
cloudbees-platform-common: "1.7"
cloudbees-plugin-usage: "2.7"
cloudbees-quiet-start: "1.7"
cloudbees-request-filter: "1.7"
cloudbees-ssh-slaves: "2.9"
cloudbees-support: "3.26"
cloudbees-template: "4.49"
cloudbees-uc-data-api: "4.43"
cloudbees-unified-ui: "1.6"
cloudbees-update-center-plugin: "4.59"
cloudbees-view-creation-filter: "1.6"
cloudbees-workflow-template: "3.12"
cloudbees-workflow-ui: "2.6"
clover: "4.12.0"
cobertura: "1.16"
code-coverage-api: "1.3.2"
command-launcher: "1.5"
concurrent-step: "1.0.0"
conditional-buildstep: "1.4.1"
config-file-provider: "3.7.2"
configuration-as-code: "1.47"
configuration-as-code-support: "DISABLED:1.18"
copyartifact: "1.46"
cors-filter: "1.1"
coverity: "1.11.4"
create-fingerprint: "1.2"
credentials: "2.3.15.1"
credentials-binding: "1.24"
cucumber-testresult-plugin: "0.10.1"
dashboard-view: "2.16"
data-tables-api: "1.10.23-3"
depgraph-view: "1.0.5"
deployed-on-column: "1.8"
deployer-framework: "1.3"
description-setter: "1.10"
display-url-api: "2.3.4"
docker-build-publish: "1.3.3"
docker-commons: "1.17"
docker-java-api: "3.1.5.2"
docker-plugin: "1.2.2"
docker-traceability: "1.2"
docker-workflow: "1.26"
dockerhub-notification: "2.5.2"
downstream-build-cache: "1.6"
downstream-buildview: "1.9"
dropdown-viewstabbar-plugin: "1.7"
dtkit-api: "3.0.0"
durable-task: "1.35"
echarts-api: "5.0.1-1"
email-ext: "2.82"
embeddable-build-status: "2.0.3"
emma: "1.31"
envinject: "2.4.0"
envinject-api: "1.7"
external-monitor-job: "1.7"
fail-the-build-plugin: "1.0"
favorite: "DISABLED:2.3.3"
file-leak-detector: "1.6"
findbugs: "5.0.0"
flexible-publish: "0.16.1"
font-awesome-api: "5.15.2-2"
forensics-api: "1.0.0"
git: "4.7.1"
git-client: "3.7.1"
git-parameter: "0.9.13"
git-server: "1.9"
git-validated-merge: "3.30"
github: "1.33.1"
github-api: "1.123"
github-branch-source: "2.10.2"
github-pull-request-build: "1.13"
gradle: "1.36"
greenballs: "1.15.1"
groovy: "2.4"
groovy-events-listener-plugin: "1.014"
handlebars: "1.1.1"
handy-uri-templates-2-api: "2.1.8-1.0"
hsts-filter-plugin: "1.0"
htmlpublisher: "1.25"
http_request: "1.9.0"
hue-light: "1.2.0"
icon-shim: "3.0.0"
icon-shim-plugin: "1.0.0"
ignore-committer-strategy: "1.0.4"
infradna-backup: "3.38.34"
jackson2-api: "2.12.1"
jacoco: "3.1.1"
javadoc: "1.6"
jaxb: "2.3.0.1"
jdk-tool: "1.5"
jenkins-design-language: "DISABLED:1.24.6"
jenkins-multijob-plugin: "1.36"
jira: "3.2.1"
jjwt-api: "0.11.2-5.143e44951c52"
job-dsl: "1.77"
join: "1.21"
jquery: "1.12.4-1"
jquery-detached: "1.2.1"
jquery-ui: "1.0.2"
jquery3-api: "3.6.0-1"
jsch: "0.1.55.2"
junit: "1.49"
kubernetes: "1.29.2"
kubernetes-client-api: "4.13.2-1"
kubernetes-credentials: "0.8.0"
label-linked-jobs: "6.0.1"
ldap: "2.4"
lenientshutdown: "1.1.1"
lockable-resources: "2.10"
log-parser: "DISABLED:2.1"
login-theme: "1.1"
mail-watcher-plugin: "1.16"
mailer: "1.34"
managed-scripts: "1.5.4"
mapdb-api: "1.0.9.0"
matrix-auth: "2.6.6"
matrix-project: "1.18"
matrixtieparent: "1.2"
maven-plugin: "3.10"
mercurial: "2.14"
metrics: "4.0.2.7"
mission-control-view: "0.9.16"
momentjs: "1.1.1"
monitoring: "1.87.0"
msbuild: "1.30"
mstest: "1.0.0"
mstestrunner: "1.3.0"
multibranch-action-triggers: "1.8.6"
multiple-scms: "0.8"
nectar-license: "8.31"
nectar-rbac: "5.57"
next-build-number: "1.6"
node-iterator-api: "1.5"
nodelabelparameter: "1.8.1"
notification: "1.14"
okhttp-api: "3.14.9"
operations-center-agent: "2.277.0.2"
operations-center-analytics-config: "2.222.0.1"
operations-center-analytics-reporter: "2.222.0.1"
operations-center-client: "2.277.0.4"
operations-center-cloud: "2.277.0.1"
operations-center-context: "2.277.0.5"
operations-center-openid-cse: "1.8.110"
pagerduty: "0.7.0"
pam-auth: "1.6"
parameterized-trigger: "2.40"
pipeline-build-step: "2.13"
pipeline-github: "2.7"
pipeline-github-lib: "1.0"
pipeline-graph-analysis: "1.10"
pipeline-input-step: "2.12"
pipeline-milestone-step: "1.3.2"
pipeline-model-api: "1.8.4"
pipeline-model-declarative-agent: "1.1.1"
pipeline-model-definition: "1.8.4"
pipeline-model-extensions: "1.8.4"
pipeline-rest-api: "2.19"
pipeline-stage-step: "2.5"
pipeline-stage-tags-metadata: "1.8.4"
pipeline-stage-view: "2.19"
pipeline-utility-steps: "2.8.0"
plain-credentials: "1.7"
plugin-util-api: "2.1.0"
pmd: "4.0.0"
popper-api: "1.16.1-2"
postbuildscript: "2.11.0"
preSCMbuildstep: "0.3"
promoted-builds: "3.9.1"
pubsub-light: "DISABLED:1.13"
python: "1.3"
rake: "1.8.0"
rebuild: "1.32"
resource-disposer: "0.15"
run-condition: "1.5"
saml: "2.0.3"
scm-api: "2.6.4"
script-security: "1.76"
scriptler: "3.1"
secure-requester-whitelist: "1.6"
skip-plugin: "4.10"
snakeyaml-api: "1.27.0"
sse-gateway: "DISABLED:1.24"
ssh-agent: "1.22"
ssh-credentials: "1.18.1"
ssh-slaves: "1.31.5"
structs: "1.22"
subversion: "2.14.2"
support-core: "2.72.1"
suppress-stack-trace: "1.6"
testdroid-run-in-cloud: "2.114.0"
testng-plugin: "1.15"
text-file-operations: "1.3.2"
throttle-concurrents: "2.2"
timestamper: "1.12"
token-macro: "2.15"
translation: "1.15"
trigger-restrictions: "1.6"
trilead-api: "1.0.13"
unique-id: "2.2.0"
uno-choice: "2.5.6"
variant: "1.4"
view-job-filters: "2.3"
violations: "0.7.11"
warnings: "DISABLED:5.0.1"
warnings-ng: "9.0.1"
wikitext: "3.13"
windows-slaves: "1.7"
workflow-aggregator: "2.6"
workflow-api: "2.42"
workflow-basic-steps: "2.23"
workflow-cps: "2.90"
workflow-cps-checkpoint: "2.10"
workflow-cps-global-lib: "2.18"
workflow-cps-global-lib-http: "1.13.0"
workflow-durable-task-step: "2.38"
workflow-job: "2.40"
workflow-multibranch: "2.23"
workflow-remote-loader: "1.5"
workflow-scm-step: "2.12"
workflow-step-api: "2.23"
workflow-support: "3.8"
ws-cleanup: "0.39"
xcode-plugin: "2.0.15"
xunit: "3.0.2"
yet-another-build-visualizer: "1.14"
  • What Operating System are you using (both controller, and any agents involved in the problem)?
Ubuntu: OS: Linux - 4.15.0-47-generic

Reproduction steps

  • Create a pipeline script that allows one to set success/failure.
  • Build this script multiple times.
  • Observe the logs generated
#!groovy
  properties([[$class: 'JiraProjectProperty'], 
    buildDiscarder(BuildHistoryManager([[actions: [], conditions: [], continueAfterMatch: false, matchAtMost: 3],  // SKIP latest 3 builds 
        [actions: [], conditions: [BuildResult(matchSuccess: true)], continueAfterMatch: false, matchAtMost: 1],   // SKIP to and OVER the most recent SUCCESSful build.
        // to test, may want to delete the log file [$class: 'DeleteLogFileAction'] rather than the whole build.
        [actions: [DeleteBuild()], conditions: [MatchEveryBuild(), BuildResult(matchSuccess: true)], continueAfterMatch: false], // Delete all remaining successful builds.
        [actions: [], conditions: [MatchEveryBuild()], continueAfterMatch: false, matchAtMost: 4],  // keep 4 more builds (total of 8)
        [actions: [DeleteBuild()], conditions: [], continueAfterMatch: false]])), // delete all the remaining builds regardless of status
        disableConcurrentBuilds(), disableResume(), [$class: 'RebuildSettings', autoRebuild: false, rebuildDisabled: false], 
        parameters([booleanParam(defaultValue: false, description: '', name: 'FAILME')]), 
        throttleJobProperty(categories: [], limitOneJobWithMatchingParams: false, maxConcurrentPerNode: 0, maxConcurrentTotal: 0, paramsToUseForLimit: '', throttleEnabled: false, throttleOption: 'project')]
        )
    if (params.FAILME)
    {
        currentBuild.description = 'FAIL'
        sleep 5
        error "Forced to fail"
    } else {
        currentBuild.description = 'SUCCESS'
    }
  • Set up a job that can be made to succeed or fail.
  • Set up build history rules - really any will do, but this attempt was intended to: keep the latest 3 builds, the most recent successful build and all failed builds up to a total of 8 builds
  • Inspect the Jenkins log searching for p.d.j.b.BuildHistoryManager or p.d.j.b.model.Rule

Results

Expected result:

I expect perhaps one or two log messages per build - independent of the number of builds in the job or the number of rules.

Something like

Processing BuildHistory for Job X build number N with 200 builds. Applying 4 rules.
...
Done process BuildHistory for Job X build number N: 23 builds deleted, 2 logs removed, 0 artifacts removed.

I also expect that a DEBUG level log could be set to determine what rule(s) are being applied. But this level of detail should only be enabled if DEBUG level logging is enabled.

Actual result:

Info Level logging swamps the Jenkins log (this example is from kibana in reverse order). Here are 138 messages from ONE build with only 8 retained builds. Note that this came from Kibana and was resorted to restore proper order, so may not match the actual log order (since it will sort two records with the same time alphabetically). However these are all the log messages that were received.

2021-06-10 22:38:27.730+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Start evaluating build history
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 1
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 1
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 1
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 2
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #135
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #136
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #137
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #138
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #139
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 3
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 1 times
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.731+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.732+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 3
2021-06-10 22:38:27.732+0000 [id=52]	INFO	p.d.j.b.model.Rule#performActions: platform/slave/slc_monitor_TEST: Processing action 'Delete build' for build #135
2021-06-10 22:38:27.732+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.732+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.742+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #134
2021-06-10 22:38:27.742+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.742+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.742+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 1 times
2021-06-10 22:38:27.742+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 4
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 4
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #132
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 3
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 3
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 4
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 4
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Condition 'Build result' does not match
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Condition 'Build result' does not match
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 1 times
2021-06-10 22:38:27.743+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 4
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #130
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #131
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 3
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 3
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 4
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 4
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Condition 'Build result' does not match
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Condition 'Build result' does not match
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 1 times
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 1 times
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.744+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 1
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 1
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 1
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #136
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #137
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #138
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #139
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Start evaluating build history
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.745+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.745+0000 [id=52]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 4
2021-06-10 22:38:27.745+0000 [id=52]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 2
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 4
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #132
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #134
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 3
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 3
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 4
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Condition 'Build result' does not match
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 1 times
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 1 times
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.746+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 4
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #131
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 3
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 4
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Condition 'Build result' does not match
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 1 times
2021-06-10 22:38:27.747+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 4
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing build #130
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 1
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 2
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 3
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 4
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Condition 'Build result' does not match
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 1 times
2021-06-10 22:38:27.754+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Skipping rule because matched 3 times
2021-06-10 22:38:27.755+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing actions for rule no 4
2021-06-10 22:38:27.755+0000 [id=15922]	INFO	p.d.j.b.BuildHistoryManager#perform: platform/slave/slc_monitor_TEST: Processing rule no 4
2021-06-10 22:38:27.755+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Condition 'Build result' does not match
2021-06-10 22:38:27.755+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Build result'
2021-06-10 22:38:27.755+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'
2021-06-10 22:38:27.755+0000 [id=15922]	INFO	p.d.j.b.model.Rule#validateConditions: platform/slave/slc_monitor_TEST: Processing condition 'Match every build'

image

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.