Package hudson.model

Class AbstractBuild<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>

All Implemented Interfaces:
ExtensionPoint, DescriptorByNameOwner, ModelObject, PersistenceRoot, Queue.Executable, Saveable, SearchableModelObject, SearchItem, AccessControlled, Comparable<R>, Runnable, LazyBuildMixIn.LazyLoadingRun<P,R>, ModelObjectWithContextMenu, RunWithSCM<P,R>, OnMaster, org.kohsuke.stapler.StaplerProxy
Direct Known Subclasses:
Build

public abstract class AbstractBuild<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>> extends Run<P,R> implements Queue.Executable, LazyBuildMixIn.LazyLoadingRun<P,R>, RunWithSCM<P,R>
Base implementation of Runs that build software. For now this is primarily the common part of Build and MavenBuild.
Author:
Kohsuke Kawaguchi
See Also:
  • Field Details

  • Constructor Details

  • Method Details

    • getProject

      public final P getProject()
    • getRunMixIn

      public final LazyBuildMixIn.RunMixIn<P,R> getRunMixIn()
      Specified by:
      getRunMixIn in interface LazyBuildMixIn.LazyLoadingRun<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
    • createReference

      @NonNull protected final BuildReference<R> createReference()
      Description copied from class: Run
      Called by RunMap to obtain a reference to this run.
      Overrides:
      createReference in class Run<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
      Returns:
      Reference to the build. Never null
      See Also:
    • dropLinks

      protected final void dropLinks()
      Description copied from class: Run
      Called by RunMap to drop bi-directional links in preparation for deleting a build.
      Overrides:
      dropLinks in class Run<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
      See Also:
    • getPreviousBuild

      public R getPreviousBuild()
      Overrides:
      getPreviousBuild in class Run<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
      See Also:
    • getNextBuild

      public R getNextBuild()
      Overrides:
      getNextBuild in class Run<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
      See Also:
    • getBuiltOn

      @CheckForNull public Node getBuiltOn()
      Returns a Slave on which this build was done.
      Returns:
      null, for example if the agent that this build run no longer exists.
    • getBuiltOnStr

      @Exported(name="builtOn") public String getBuiltOnStr()
      Returns the name of the agent it was built on; null or "" if built by the built-in node. (null happens when we read old record that didn't have this information.)
    • setBuiltOnStr

      protected void setBuiltOnStr(String builtOn)
      Allows subtypes to set the value of builtOn. This is used for those implementations where an AbstractBuild is made 'built' without actually running its run() method.
      Since:
      1.429
    • getRootBuild

      public AbstractBuild<?,?> getRootBuild()
      Gets the nearest ancestor AbstractBuild that belongs to the root project of getProject() that dominates/governs/encompasses this build.

      Some projects (such as matrix projects, Maven projects, or promotion processes) form a tree of jobs, and still in some of them, builds of child projects are related/tied to that of the parent project. In such a case, this method returns the governing build.

      Returns:
      never null. In the worst case the build dominates itself.
      Since:
      1.421
      See Also:
    • getParentExecutable

      public Queue.Executable getParentExecutable()
      Description copied from interface: Queue.Executable
      An umbrella executable (such as a Run) of which this is one part. Some invariants:
      • getParent().getOwnerTask() == getParent() || getParentExecutable().getParent() == getParent().getOwnerTask()
      • getParent().getOwnerExecutable() == null || getParentExecutable() == getParent().getOwnerExecutable()
      Specified by:
      getParentExecutable in interface Queue.Executable
      Returns:
      a distinct executable (never this, unlike the default of SubTask.getOwnerTask()!); or null if this executable was already at top level
      See Also:
    • getUpUrl

      @Deprecated(since="2.364") public String getUpUrl()
      Deprecated.
      navigation through a hierarchy should be done through breadcrumbs, do not add a link using this method
      Used to render the side panel "Back to project" link.

      In a rare situation where a build can be reached from multiple paths, returning different URLs from this method based on situations might be desirable.

      If you override this method, you'll most likely also want to override Run.getDisplayName().

    • getWorkspace

      @CheckForNull public final FilePath getWorkspace()
      Gets the directory where this build is being built.

      Note to implementors: to control where the workspace is created, override AbstractBuild.AbstractBuildExecution.decideWorkspace(Node,WorkspaceList).

      Returns:
      null if the workspace is on an agent that's not connected. Note that once the build is completed, the workspace may be used to build something else, so the value returned from this method may no longer show a workspace as it was used for this build.
      Since:
      1.319
    • setWorkspace

      protected void setWorkspace(@NonNull FilePath ws)
      Normally, a workspace is assigned by Run.RunExecution, but this lets you set the workspace in case AbstractBuild is created without a build.
    • getModuleRoot

      public final FilePath getModuleRoot()
      Returns the root directory of the checked-out module.

      This is usually where pom.xml, build.xml and so on exists.

    • getModuleRoots

      public FilePath[] getModuleRoots()
      Returns the root directories of all checked-out modules.

      Some SCMs support checking out multiple modules into the same workspace. In these cases, the returned array will have a length greater than one.

      Returns:
      The roots of all modules checked out from the SCM.
    • getCulpritIds

      @CheckForNull public Set<String> getCulpritIds()
      Description copied from interface: RunWithSCM
      Gets the ids for all Users included in RunWithSCM.getChangeSets() for this item.
      Specified by:
      getCulpritIds in interface RunWithSCM<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
      Returns:
      A set of user IDs, or null if this was the first time the method was called or the build is still running for a RunWithSCM instance with no culprits.
    • getCulprits

      @Exported @NonNull public Set<User> getCulprits()
      Description copied from interface: RunWithSCM
      List of users who committed a change since the last non-broken build till now.

      This list at least always include people who made changes in this build, but if the previous build was a failure it also includes the culprit list from there.

      Missing Users will be created on-demand.

      Specified by:
      getCulprits in interface RunWithSCM<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
      Returns:
      can be empty but never null.
    • shouldCalculateCulprits

      public boolean shouldCalculateCulprits()
      Description copied from interface: RunWithSCM
      Determines whether culprits should be recalcuated or the existing RunWithSCM.getCulpritIds() should be used instead.
      Specified by:
      shouldCalculateCulprits in interface RunWithSCM<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
      Returns:
      True if culprits should be recalcuated, false otherwise.
    • calculateCulprits

      @NonNull public Set<User> calculateCulprits()
      Description copied from interface: RunWithSCM
      Method used for actually calculating the culprits from scratch. Called by RunWithSCM.getCulprits() and overrides of RunWithSCM.getCulprits(). Does not persist culprits information.
      Specified by:
      calculateCulprits in interface RunWithSCM<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
      Returns:
      a non-null Set of Users associated with this item.
    • getHudsonVersion

      public String getHudsonVersion()
      Gets the version of Hudson that was used to build this job.
      Since:
      1.246
    • getChangeSet

      @Exported @NonNull public ChangeLogSet<? extends ChangeLogSet.Entry> getChangeSet()
      Gets the changes incorporated into this build.
      Returns:
      never null.
    • getChangeSets

      @NonNull public List<ChangeLogSet<? extends ChangeLogSet.Entry>> getChangeSets()
      Description copied from interface: RunWithSCM
      Gets all ChangeLogSets currently associated with this item.
      Specified by:
      getChangeSets in interface RunWithSCM<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
      Returns:
      A possibly empty list of ChangeLogSets.
    • hasChangeSetComputed

      public boolean hasChangeSetComputed()
      Returns true if the changelog is already computed.
    • getEnvironment

      @NonNull public EnvVars getEnvironment(@NonNull TaskListener log) throws IOException, InterruptedException
      Description copied from class: Run
      Returns the map that contains environmental variables to be used for launching processes for this build.

      BuildSteps that invoke external processes should use this. This allows BuildWrappers and other project configurations (such as JDK selection) to take effect.

      Unlike earlier Run.getEnvVars(), this map contains the whole environment, not just the overrides, so one can introspect values to change its behavior.

      Overrides:
      getEnvironment in class Run<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
      Returns:
      the map with the environmental variables.
      Throws:
      IOException
      InterruptedException
    • getEnvironments

      public EnvironmentList getEnvironments()
      During the build, expose the environments contributed by BuildWrappers and others.

      Since 1.444, executor thread that's doing the build can access mutable underlying list, which allows the caller to add/remove environments. The recommended way of adding environment is through BuildWrapper, but this might be handy for build steps who wants to expose additional environment variables to the rest of the build.

      Returns:
      can be empty list, but never null. Immutable.
      Since:
      1.437
    • due

      public Calendar due()
    • addAction

      public void addAction(@NonNull Action a)
      Adds a new action. Note: calls to Actionable.getAllActions() that happen before calls to this method may not see the update. Note: this method will always modify the actions A RunAction2 is handled specially. The action may have a summary.jelly view containing a <t:summary> or other <tr>.
      Overrides:
      addAction in class Run<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
    • getPersistentActions

      public List<Action> getPersistentActions()
    • getSensitiveBuildVariables

      public Set<String> getSensitiveBuildVariables()
      Builds up a set of variable names that contain sensitive values that should not be exposed. The expectation is that this set is populated with keys returned by getBuildVariables() that should have their values masked for display purposes.
      Since:
      1.378
    • getBuildVariables

      public Map<String,String> getBuildVariables()
      Provides additional variables and their values to Builders.

      This mechanism is used by MatrixConfiguration to pass the configuration values to the current build. It is up to Builders to decide whether they want to recognize the values or how to use them.

      This also includes build parameters if a build is parameterized.

      Returns:
      The returned map is mutable so that subtypes can put more values.
    • getBuildVariableResolver

      public final VariableResolver<String> getBuildVariableResolver()
    • getTestResultAction

      @Deprecated public Action getTestResultAction()
      Deprecated.
      Use Actionable.getAction(Class) on AbstractTestResultAction.
    • getAggregatedTestResultAction

      @Deprecated public Action getAggregatedTestResultAction()
      Deprecated.
      Use Actionable.getAction(Class) on AggregatedTestResultAction.
    • run

      public abstract void run()
      Invoked by Executor to performs a build.
      Specified by:
      run in interface Queue.Executable
      Specified by:
      run in interface Runnable
    • getWhyKeepLog

      public String getWhyKeepLog()
      Description copied from class: Run
      If Run.isKeepLog() returns true, returns a short, human-readable sentence that explains why it's being kept.
      Overrides:
      getWhyKeepLog in class Run<P extends AbstractProject<P,R>,R extends AbstractBuild<P,R>>
    • getDownstreamRelationship

      public Fingerprint.RangeSet getDownstreamRelationship(AbstractProject that)
      Gets the dependency relationship from this build (as the source) and that project (as the sink.)
      Returns:
      range of build numbers that represent which downstream builds are using this build. The range will be empty if no build of that project matches this (or there is no Fingerprinter.FingerprintAction), but it'll never be null.
    • getDownstreamBuilds

      public Iterable<AbstractBuild<?,?>> getDownstreamBuilds(AbstractProject<?,?> that)
      Works like getDownstreamRelationship(AbstractProject) but returns the actual build objects, in ascending order.
      Since:
      1.150
    • getUpstreamRelationship

      public int getUpstreamRelationship(AbstractProject that)
      Gets the dependency relationship from this build (as the sink) and that project (as the source.)
      Returns:
      Build number of the upstream build that feed into this build, or -1 if no record is available (for example if there is no Fingerprinter.FingerprintAction, even if there is an Cause.UpstreamCause).
    • getUpstreamRelationshipBuild

      public AbstractBuild<?,?> getUpstreamRelationshipBuild(AbstractProject<?,?> that)
      Works like getUpstreamRelationship(AbstractProject) but returns the actual build object.
      Returns:
      null if no such upstream build was found, or it was found but the build record is already lost.
    • getDownstreamBuilds

      public Map<AbstractProject,Fingerprint.RangeSet> getDownstreamBuilds()
      Gets the downstream builds of this build, which are the builds of the downstream projects that use artifacts of this build.
      Returns:
      For each project with fingerprinting enabled, returns the range of builds (which can be empty if no build uses the artifact from this build or downstream is not AbstractProject.isFingerprintConfigured().)
    • getUpstreamBuilds

      public Map<AbstractProject,Integer> getUpstreamBuilds()
      Gets the upstream builds of this build, which are the builds of the upstream projects whose artifacts feed into this build.
      Returns:
      empty if there is no Fingerprinter.FingerprintAction (even if there is an Cause.UpstreamCause)
      See Also:
    • getTransitiveUpstreamBuilds

      public Map<AbstractProject,Integer> getTransitiveUpstreamBuilds()
      Works like getUpstreamBuilds() but also includes all the transitive dependencies as well.
    • getDependencyChanges

      public Map<AbstractProject,AbstractBuild.DependencyChange> getDependencyChanges(AbstractBuild from)
      Gets the changes in the dependency between the given build and this build.
      Returns:
      empty if there is no Fingerprinter.FingerprintAction
    • doStop

      @Deprecated public void doStop(org.kohsuke.stapler.StaplerRequest req, org.kohsuke.stapler.StaplerResponse rsp) throws IOException, javax.servlet.ServletException
      Deprecated.
      as of 1.489 Use doStop()
      Throws:
      IOException
      javax.servlet.ServletException
    • doStop

      public org.kohsuke.stapler.HttpResponse doStop() throws IOException, javax.servlet.ServletException
      Stops this build if it's still going. If we use this/executor/stop URL, it causes 404 if the build is already killed, as Run.getExecutor() returns null.
      Throws:
      IOException
      javax.servlet.ServletException
      Since:
      1.489