The @N notation I was referring to was just the style of path you cited in your 
first scenario:

job1 - /Nodes/path/job
job2 - /Nodes/path/job@2
job3 - /Nodes/path/job@3

The @2 and @3 were added by Jenkins because you configured concurrent builds.

I think you're actually describing two features:


  1.  Make sure that jobs with custom workspaces work correctly when configured 
to run concurrent builds. This is what I thought you were after, and so I felt 
that this should just work, without requiring additional user configuration.
  2.  Allow the workspace a job uses to be passed as a parameter from one job 
to the next.

  -- Dean

From: Marek Gimza <marekgi...@gmail.com<mailto:marekgi...@gmail.com>>
Reply-To: 
"jenkinsci-dev@googlegroups.com<mailto:jenkinsci-dev@googlegroups.com>" 
<jenkinsci-dev@googlegroups.com<mailto:jenkinsci-dev@googlegroups.com>>
Date: Saturday, September 22, 2012 8:01 AM
To: "jenkinsci-dev@googlegroups.com<mailto:jenkinsci-dev@googlegroups.com>" 
<jenkinsci-dev@googlegroups.com<mailto:jenkinsci-dev@googlegroups.com>>
Subject: Re: Checkbox to allow the Custom Workspace be shared among different 
slaves.

Thanks Dean, I sincerely appreciate the reply.

I am not sure what you mean by @N notation.  Maybe this will help me improve my 
build-environment.
(I will google it )

I like to have this behaviour to be configurable by the user.
The reason is that I have a main (parent) project that has this checkbox set, 
but its downstream (child) projects do not.

The parent job sets the workspace for the build, gets the src from the SCM, and 
passes it on to the other jobs to compile, test,etc....
The child downstream projects just get the workspace directory as a parameter 
and perform their task(i.e. compile,test).

I have a set of jobs where each one only performs a specific task on a given 
workspace (i.e.compile,test,etc...).  Each one does not care about the SCM nor 
any other project details.  It just gets a workspace dir to perform+report its 
work and away it goes.

The beauty of this is that All of these downstream jobs are concurrently 
running across 10 build and test machines.  Each one acting on a workspace.  In 
some cases I am compiling build-targets on the same workspace dir at the same 
time from different machines.  The compile targets do not conflict with each 
other, and I save a lot of time.

I also re-use these donwstream jobs for different SCM branches.

Using the MultiJob plugin allows the main (parent) upstream project to know 
when all of its requested compiles and testing has finished.

I hope that this makes sense.

Thanks,
Marek Gimza

On Fri, Sep 21, 2012 at 4:31 PM, Dean Yu 
<d...@shutterfly.com<mailto:d...@shutterfly.com>> wrote:
To summarize, the problem that you have is that when your project is configured 
with both a custom workspace and to perform concurrent builds, the same path is 
used by all the builds, causing them to step on each other. Is that correct?

If this is the case, is there ever a case where you don't want to use the @N 
notation in this situation? In other words, why not just make this always be 
the behavior instead of having to require the user to configure it?

  -- Dean

From: mgimza <marekgi...@gmail.com<mailto:marekgi...@gmail.com>>
Reply-To: 
"jenkinsci-dev@googlegroups.com<mailto:jenkinsci-dev@googlegroups.com>" 
<jenkinsci-dev@googlegroups.com<mailto:jenkinsci-dev@googlegroups.com>>
Date: Thursday, September 20, 2012 2:28 PM
To: "jenkinsci-dev@googlegroups.com<mailto:jenkinsci-dev@googlegroups.com>" 
<jenkinsci-dev@googlegroups.com<mailto:jenkinsci-dev@googlegroups.com>>
Subject: Checkbox to allow the Custom Workspace be shared among different 
slaves.


I would like to share a change I have made to the jenkins-core that introduces 
a new checkbox called customWorkspaceRoot to a job configuration.

Please find attached a GIF file showing the CustomWorkspace path and checkbox 
setting in a job's configuration page.


Objective
========
To let Jenkins use the CustomWorkspace path (set in a Job's configuration page) 
in the same manner as the "Remote FS root" path that is set in the Node's 
configuration page.

Normally the customWorkspace is static, in the sense that Jenkins does not 
alter the workspace path for different concurrently running instances of the 
same job.
The intent of this code-change is to be able to allow Jenkins to run the same 
job multiple times, where the CustomWorkspace path is used to create a unique 
workspace path for each concurrently running instance of the same Job.


For example:
-----------------------
Scenario 1. Normally when the customWorkspace is NOT set, the selected Node's 
"Remote FS root" path is used for each concurrently running instance of the job:
job1 - /Nodes/path/job
job2 - /Nodes/path/job@2
job3 - /Nodes/path/job@3
etc...


Scenario 2. Normally when the customWorkspace is set, the 'same' 
customWorkspace path is used for each concurrently running instance of the job:
job1 - /Nodes/path/job
job2 - /Nodes/path/job
job3 - /Nodes/path/job
etc...



Scenario 3. In scenario 2, the same path is used, causing the jobs to overwrite 
each other..  This code change introduces scenario 3:
When the customWorkspace is set AND the new checkbox called customWorkspaceRoot 
is also set, the customWorkspace path is used for each concurrently running 
instance of the job as follows:
job1 - /Nodes/path/job
job2 - /Nodes/path/job@2
job3 - /Nodes/path/job@3
etc...



Purpose/Advantage
===============
To allow a job to share its workspace path with its downstream projects, where 
the downstream projects can run from any slave and not be mandated to run on 
the same machine as its parent upstream project.

notes:
---------
The workspace is passed to the downstream projects as a parameter.
The workspace must be on a shared disk that is accessible from the candidate 
slaves.


CODE-CHANGES
=============
Jenkins Version
-------------------------
The changes were done to org.jenkins-ci.main 1.479-SNAPSHOT and org.jenins-ci 
1.25:

  <parent>
    <groupId>org.jenkins-ci</groupId>
    <artifactId>jenkins</artifactId>
    <version>1.25</version>
  </parent>

  <groupId>org.jenkins-ci.main</groupId>
  <artifactId>pom</artifactId>
  <version>1.479-SNAPSHOT</version>
  <packaging>pom</packaging>

AFFECTED FILES
-----------------------------
FILE: jenkins-core/src/main/java/hudson/model/AbstractProject.java
DESCRIPTION: Added a new Boolean for the checkbox called CustomWorkspaceRoot.

PATCH:
249a250
>     protected volatile boolean customWorkspaceRoot = false;
1770a1772
>         customWorkspaceRoot = 
> req.getParameter("customWorkspace.directoryRoot")!=null;
2125a2128,2131
>     public Boolean getCustomWorkspaceRoot() {
>         return this.customWorkspaceRoot;
>     }
>
2142a2149,2150
>         if ( this.customWorkspaceRoot )
>             this.customWorkspace = this.customWorkspace + "/" + 
> this.name<http://this.name/> + "_TEST";
2146c2154,2157
<
---
>     public void setCustomWorkspaceRoot(Boolean c) throws IOException {
>         this.customWorkspaceRoot= c;
>         save();
>     }


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

FILE: jenkins-core/src/main/java/hudson/model/AbstractBuild.java
DESCRIPTION: Modified decideWorkspace() to allocate the given CustomWorkspace 
in the same way as the "Remote FS root" would be allocated if the 
customWorkspaceRoot is enabled.

PATCH:
460a461,464
>                 if ( getProject().getCustomWorkspaceRoot()) {
>                     FilePath fp = 
> n.getRootPath().child(getEnvironment(listener).expand(customWorkspace));
>                     return wsl.allocate(fp, getBuild());
>                 } else {
463a468,471
>             } else {
>                 FilePath fp = n.getWorkspaceFor((TopLevelItem)getProject());
>                 return wsl.allocate(fp, getBuild());
>             }
465c473
<             return 
wsl.allocate(n.getWorkspaceFor((TopLevelItem)getProject()), getBuild());
---
>             //return 
> wsl.allocate(n.getWorkspaceFor((TopLevelItem)getProject()), getBuild());

----------------------------------------------------------------------
FILE: 
jenkins-core/src/main/resources/lib/hudson/project/config-customWorkspace.jelly
DESCRIPTION: Added the checkbox that maps to the new customWorkspaceRoot 
variable in AbstractProject.java and used in AbstractBuild.java

PATCH:
31a32,34
>     <f:entry title="${%DirectoryRoot}">
>       <f:checkbox name="customWorkspace.directoryRoot" 
> field="customWorkspaceRoot" />
>     </f:entry>


Reply via email to