Hello,

we provide CI for many teams in a big company. Unfortunately, we have a 
huge problem with server loads after the spin up process, after restarts 
and jobs modification. Multibranch jobs execute branch indexing on every 
single change and directly after the job creation. It is great, because 
people see what is available. On the other side, when people don't delete 
old branches, we waste a lot of resources on building old stuff. In our 
case it completely blocks servers for days. We tried to use build 
strategies, but none of them solved it. The closest solution was 
SkipInitialBuildOnFirstBranchIndexing 
<https://github.com/jenkinsci/basic-branch-build-strategies-plugin/blob/master/src/main/java/jenkins/branch/buildstrategies/basic/SkipInitialBuildOnFirstBranchIndexing.java>,
 
but unfortunately it:

   - blocks all new branches and PRs builds executed by webhooks (it always 
   skip the first build no matter how it is triggered)
   - won’t solve the problem when the branch indexing is executed for a 
   second time (again, everything is build)

For now we use the patch visible in this PR 
<https://github.com/jenkinsci/branch-api-plugin/pull/186> (I'm aware that 
it won't be merged - it is just a workaround, I skipped tests). I wanted to 
ask - do you have any ideas on how to solve this properly? We are open to 
implement the proposed solution 🙂

For now, I have two ideas to make it configurable:

   1. add an option to disable automatic builds on branch indexing
   2. extend BranchBuildStrategy 
   
<https://github.com/jenkinsci/branch-api-plugin/blob/master/src/main/java/jenkins/branch/BranchBuildStrategy.java>
 class 
   and pass information about the trigger cause

Both solutions don't cover the workaround solution, because they will only 
allow the skipping of all builds caused by branch indexing (we will lose 
the ability to execute builds of branches/PRs for which webhooks have not 
been received - for example, lost due to network problems).


Disable Automatic build on branch indexing

The first solution requires to add a new property to the multibranch 
project and simply skip the build if causeFactory instanceof 
IndexingCauseFactory. I don't know how to add this configurable property, 
but I can get this knowledge 😉

This approach does not change the API, just adds a new parameter.

Extend BranchBuildStrategy API

This approach is backward compatible, but introduces new methods to API (in 
a class which is extended by many plugins).

How could we implement it:

   - add a new BranchBuildStrategy#isAutomaticBuild method which takes one 
   more parameter (the trigger cause - indexing vs. webhook):

public boolean isAutomaticBuild(@NonNull TriggerCause cause,
                                @NonNull SCMSource source,
                                @NonNull SCMHead head,
                                @NonNull SCMRevision currRevision,
                                @CheckForNull SCMRevision lastBuiltRevision,
                                @CheckForNull SCMRevision lastSeenRevision,
                                @NonNull TaskListener listener) {
    // by default delegate to the version without the cause
    return isAutomaticBuild(source, head, currRevision, lastBuiltRevision, 
lastSeenRevision, listener);
}


   - add a new BranchBuildStrategy#automaticBuild which will be executed by 
   the MultiBranchProject:

public final boolean automaticBuild(@NonNull TriggerCause cause,
                                    @NonNull SCMSource source,
                                    @NonNull SCMHead head,
                                    @NonNull SCMRevision currRevision,
                                    @CheckForNull SCMRevision lastBuiltRevision,
                                    @CheckForNull SCMRevision lastSeenRevision,
                                    @NonNull TaskListener listener) {
        if (Util.isOverridden(BranchBuildStrategy.class, getClass(), 
"isAutomaticBuild", TriggerCause.class,
                SCMSource.class, SCMHead.class, SCMRevision.class, 
SCMRevision.class, SCMRevision.class,
                TaskListener.class)) {
            return isAutomaticBuild(cause, source, head, currRevision, 
lastBuiltRevision, lastSeenRevision, listener);
        }
        return automaticBuild(source, head, currRevision, lastBuiltRevision, 
lastSeenRevision, listener);
}


It falls back to the original automaticBuild method (backward compatible).

   - create a new build strategy (in new or existing plugin) 
   SkipBuildOnBranchIndexing

------------------------------

Let me know what do you think.


Kind regards
Adam Gabryś

-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-dev/751d8c6f-50cd-4d10-bb90-861690f5d1fc%40googlegroups.com.

Reply via email to