CloudBees CD/RO provides a powerful data model based around the notion of a property.
-
A property is a string value with a name.
-
Properties can have arbitrary names and values.
-
You can attach properties to any object in the CloudBees CD/RO system, such as a project, procedure, or job.
-
After a property is created, it is stored in the CloudBees CD/RO database.
-
You can retrieve and modify the property value later.
-
You can delete properties that you no longer need.
Properties are used extensively throughout the CloudBees CD/RO system and provide a flexible and powerful mechanism to manage data about your builds.
Property use case examples
-
When a job starts, it computes a unique identifier for that build and saves it in a property. Later build steps can retrieve the property value to embed the build number in binaries generated during the job.
-
When a build executes, it can set a property on the procedure to identify the source code version used for the build (for example, a tag or timestamp from your source code control system). The next time the build executes, it can retrieve the property value from the procedure and use it to extract information from your source code control system about the files that changed since the last run.
-
Suppose you have a collection of machines for testing, and some machines have older test hardware and some machines have newer hardware with slightly different characteristics. You can set a property on each test machine resource to indicate which version of test hardware is available on which machine. Later, when a test executes, the test can retrieve the property for the machine where it ran and configure tests appropriately for that hardware. If you upgrade test hardware on a machine, all you need to do is change the property on that resource to reflect the new version.
-
You can set job properties to indicate the build status produced by that job. For example, if your QA team finds fatal flaws in a build, it can mark the job accordingly. Builds that need to be preserved (release candidates or builds undergoing beta testing at customer sites) can be marked with properties so those builds are not deleted.
-
When a job executes, properties are set for its job steps that hold metrics such as how many files compiled during a build step, how many tests executed during a test step, or how many errors were detected in the step. These property values are included in reports and can be examined later to compute trends over time. You can define additional properties for metrics useful to you.
CloudBees CD/RO provides intrinsic properties and allows you to create custom properties. This topic enumerates intrinsic properties available within CloudBees CD/RO, distinguishes between relative and absolute property paths, and describes property hierarchies.
-
Intrinsic properties: These properties represent attributes that describe the object to which they are attached, and are provided automatically by CloudBees CD/RO for each similar type object. For example, every project has a
Description
property that can be referenced with a non-local property path such as/projects/Examples/description
. -
Custom properties: These properties are identical to intrinsic properties and when placed on the same object, are referenced in the same manner, and behave in every way like an intrinsic object-level property with one exception: they are not created automatically when the object is created. Instead, custom properties can be added to objects already in the database before a job is started, or created dynamically by procedure steps during step execution.
Intrinsic properties are case-sensitive. Custom properties, like all other object names in the CloudBees CD/RO system, are "case-preserving," but not case-sensitive. |
Creating or modifying properties
The examples below show how to set a property value via the UI, the ectool
command-line application, and the Perl API. This is a subset of the methods; refer to the CloudBees CD/RO APIs for more ways to use the API.
-
Using the web interface, via tables labeled Custom Properties on the pages that display details for projects, procedures, and so on. Click Create New Property to create a new property for that object, or click on an existing property to change its value.
-
Using the
ectool
application, set a property value with a command like:ectool setProperty /myJob/installStatus complete
This command sets the property named
/myJob/installStatus
to the valuecomplete
, and creates the property if it did not already exist (the meaning of property names like/myJob/installStatus
is explained below). You can useectool
from within one job step to set properties accessed by later steps in the same job. -
Using the Perl API, you can use an external script or a script in a step with
cb-perl
as the shell. A Perl code example:use ElectricCommander; my $ec = new ElectricCommander(); $ec->setProperty("/myJob/installStatus", "complete", {jobStepId => $ENV{COMMANDER_JOBSTEPID})
Using the Perl API may yield better performance if you are requesting multiple API calls in one step. |
This is a subset of the methods; refer to the CloudBees CD/RO APIs for more ways to use the API.
Using property values
A job step can access a property value by two methods. The first method is substitution, using the $[ ]
notation. Suppose you enter the following text as a command for a step:
make PLATFORM=$[platform]
Before running the step, CloudBees CD/RO finds the property named platform
and substitutes its value in the command string in place of $[platform]
. For example, if the property contains the value windows
, the actual command executed is:
make PLATFORM=windows
The substitution method can be used for a command in a step and for any step fields, such as the resource or working directory. This method allows you to compute configuration information in an early step of a job, then use that configuration information to control later steps in the job.
Another way for a step to access the property value is with the ectool getProperty
command. For example, the following command returns the property value named platform
:
ectool getProperty platform
Property sheets and intrinsic properties
A property value can be a simple string or a nested property sheet containing its own properties. Property sheets can be nested to any depth, which allows you to create hierarchical collections of information.
Most objects have an associated property sheet that contains custom properties created by user scripts. The property sheet is an intrinsic property of the containing object called property sheet, so to reference a project custom property branchName
, you could specify /projects/aProject/propertySheet/branchName
.
As a convenience, CloudBees CD/RO allows the property sheet path element to be omitted and the path written as /projects/aProject/branchName
. If there is no intrinsic property with the same name, the path finds the property on the property sheet.
Custom properties in a property sheet can be one of two types: string property or a property sheet property. String properties hold simple text values. Property sheet properties hold nested properties. Nested properties are accessed via the property sheet property of their containing sheet.
For example:
/projects/aProject/propertySheet/topSheet/propertySheet/propB
or
/projects/aProject/topSheet/propB
All information managed by CloudBees CD/RO exists in the form of properties and property sheets and your own custom-created properties. For example, each project, procedure, and step is represented internally as a property sheet—the command for a step is actually a property associated with the step, and so on. Every value in the CloudBees CD/RO system can be accessed as a property, using the naming facilities described below. These properties are called intrinsic properties.
CloudBees CD/RO enforces some restrictions on intrinsic property values, whereas custom properties can have any value you choose. |
To learn more about intrinsic properties defined for an object by CloudBees CD/RO, refer to Use the CloudBees CD/RO Perl API. For example, to learn about intrinsic properties associated with each project, find the documentation for the getProject
ectool command. The result of running this command is an XML document whose field names and values represent the properties for the project.
Refer to Intrinsic properties listed by object type for further information.
Property names and paths
Properties are named using multi-level paths such as first/second/third
, which refers to a property named third
in a property sheet named second
in a property sheet named first
. CloudBees CD/RO also supports an equivalent notation using brackets instead of slashes. In this format, slashes are not considered separators when they appear between brackets.
For example, first[second]/third
and first[second][third]
both refer to the same property as first/second/third
. The bracket []
notation is based on matching brackets. For example, steps[build[1]]
refers to a property named build[1]
inside a property sheet named steps
; it does not treat build
as a property sheet containing a property named 1
.
Property names/paths have two forms: absolute and relative .
Absolute property paths
Absolute property paths are referenced by a fully-qualified path syntax that begins with a slash character (/
) followed by a top-level name. This path syntax is similar to a file system path specification. The first component after the slash must be one of several reserved words that select a starting location to look up the property name. For example, consider the property name /server/Electric Cloud/installDirectory
. /server
means lookup starts in the topmost property sheet associated with the CloudBees CD/RO server. This property name refers to the "installDirectory" property inside the server property sheet.
The system defines the following top-level absolute property names:
Absolute property path | Description | ||
---|---|---|---|
|
Start in the property sheet containing all artifacts. For example, |
||
|
Start in the property sheet containing all artifact versions. For example,
|
||
|
Start in the property sheet containing all groups. For example, |
||
|
Start in the property sheet containing all jobs. For example, |
||
|
Start in the property sheet containing all plugins. For example, There is a subtle difference between:
and
The former places the property on the plugin’s project and can be referenced by |
||
|
Start in the property sheet containing all projects. For example, |
||
|
Start in the property sheet containing all artifact repositories. For example, |
||
|
Start in the property sheet containing all resource pools. For example, |
||
|
Start in the property sheet containing all resources. For example, |
||
|
Start in the top-level server property sheet. For example, |
||
|
Start in the property sheet containing all users. For example, |
||
|
Start in the property sheet containing all workspaces. For example, |
Relative property paths
Property names that do not begin with /
are relative and looked up starting in the current context. For example, when executing a job step, the current context includes properties defined for the job step, parameters for the current procedure, and global properties on the current job.
Relative property paths are distinguished from absolute property paths because they do not begin with one of the top-level names. To avoid having to construct full property paths, CloudBees CD/RO supports the concept of a relative property path.
In use, the relative property path value is resolved by its context and a defined search order, which results in accessing the value of an absolute fully-specified property value. Contexts and search orders are as follows:
-
In a job step context, CloudBees CD/RO searches for relative property paths in the following order:
-
a property on the job step object
-
a property of the parent job step object, which includes parameters of the procedure on which the step is defined
-
a property on the job object
The search can be enabled or disabled by using the --extendedContextSearch
option on the ectoolgetProperty
orsetProperty
commands. When searching for a property value, disable the search by setting the--extendedContextSearch
switch tofalse
, requiring the property to exist on the job step object or returnfalse
. When writing a new value to a property, enable the search by setting the--extendedContextSearch
switch totrue
, allowing the search for a property within the search order before creating a new one. New properties are created on the job step object.-
Parameters for subprocedure calls from job steps are searched for in a job step context.
-
For procedure parameters for nested subprocedures, properties referenced by parameters are looked up as described [above] for job steps.
-
-
-
When expanding schedule parameters, CloudBees CD/RO searches the relative property path in the following order:
-
A property on the procedure being called
-
A property on the project on which the procedure being called is defined
-
A property on the server
-
-
In a job name template context, CloudBees CD/RO searches for the relative property path as a property on the job.
-
In any other context, CloudBees CD/RO searches for the relative property path as a property on the context object.
Property name substitutions
Property names can contain references to other properties, which are then substituted into the property name before looking it up. For example, consider the following property name:
/myStep/$[/myProcedure/procedureName]
If the value of /myProcedure/procedureName
is xyz
, the property above is equivalent to /myStep/xyz
.
Expandable properties
Property values can contain property references using the $[]
notation.
For example:
-
Create a property named "foo" with a value of
hello $[bar]
. -
Create a property named "bar" with a value of
world
. -
Reference "foo" (either using
$[foo]
orectool getProperty foo
). The value "hello world" is returned.
If you want just the literal value of "foo" (useful in the UI, for example), you can use the expand
option in ectool:
ectool getProperty foo --expand false
The value hello $[bar]
is returned.
Properties are expanded by default when you use getProperty
or getProperties
.
If the value of a property contains $[]
but you do not want it to be interpreted as a property reference, you can use the expandable option:
ectool setProperty symbols '$[!@]#' --expandable false
This option can be toggled in the web UI as well. Properties are expandable by default.
Because you cannot control where your expandable property might be referenced (and therefore which context is used during expansion), we recommend using absolute paths when referencing a property from the value of another property.
In the example above, if you define both foo
and bar
as properties on a project proj1
, you might assume there is no problem with the value of foo
. However, if you later reference foo
from a job under proj1
(for example, $[/myProject/foo]
), foo
is referenced with the job step as its context. Therefore, when the value of foo
is expanded, you get a PROPERTY_REFERENCE_ERROR
because bar
is not defined in the context of the job step.
Custom property names and values
The following properties are used by the standard CloudBees CD/RO UI, so you should use these property names whenever possible, and avoid using these names in ways that conflict with the definitions below.
-
compiles
: the number of files compiled during the job step -
diagFile
: the filename in the top-level directory of the job’s workspace, containing diagnostics extracted from the step’s log file -
errors
: the number of errors (compilation failures, test failures, application crashes, and so on) that occurred during the job step. When property errors are set by postp, the step outcome is set to error also. -
tests
: the number of tests executed by the job step, including successes and failures -
testsSkipped
—the number of tests skipped during the job step -
warnings
: the number of warnings that occurred during the job step. When property warnings is set by postp, the step outcome is set to warning also. -
preSummary
: if this property exists, its value is displayed in the "Status" field (on the Job Details page) for this step. This property appears before whatever would normally be displayed for status. If the property contains multiple lines separated by newline characters, each line is displayed on a separate line in the status field. -
postSummary
: if this property exists, its value is displayed in the "Status" field (on the Job Details page) for this step. This property appears after whatever would normally be displayed for status. If the property contains multiple lines separated by newline characters, each line is displayed on a separate line in the status field. -
summary
: if this property exists, its value is displayed in the "Status" field (in the job reports) for this step, replacing whatever would normally be displayed for status. If the property contains multiple lines separated by newline characters, each line is displayed on a separate line in the status field.
The property hierarchy
All CloudBees CD/RO properties fall into a hierarchical structure, and you can reference any property using an absolute path from the root of the hierarchy. This includes properties you define and intrinsic properties defined by CloudBees CD/RO.
For example, each step contains a property resource that provides the resource name to use for that step. All steps of a procedure exist as property sheets underneath the procedure. All procedures in a project exist as property sheets underneath the project, and so on.
The examples below illustrate some nesting relationships between objects.
For example, the path notation /projects[projectName]/procedures[procedureName]
(or equivalently, /projects/projectName/procedures/procedureName
) means each project object contains a property sheet named procedures
holding all procedures defined within that project. Within the procedure’s property sheet, there is a nested property sheet for each procedure, named after the procedure. Thus, the name /projects[a]/procedures[b]
refers to a procedure named b
contained in a project named a
.
-
Each project may contain procedures, schedules, credential definitions, workflow definitions, workflows and numerous other object types:
/projects[projectName]/procedures[procedureName] /projects[projectName]/schedules[scheduleName] /projects[projectName]/credentials[credentialName] /projects[projectName]/workflowDefinitions[workflowDefinitionsName] /projects[projectName]/workflows[workflowName]
-
Each procedure contains steps and parameters. The parameters are formal parameters, meaning they specify parameter names the procedure accepts, whether each parameter is required, and so on:
/projects[projectName]/procedures[procedureName]/steps[stepName]
,/projects[projectName]/procedures[procedureName]/formalParameters[parameterName]
-
Steps that invoke subprocedures contain parameter values for the subprocedure. These are called actual parameters because they provide actual values that are passed into the subprocedure:
/projects[projectName]/procedures[procedureName]/steps[stepName]/actualParameters[parameterName]
-
Each job contains a collection of job step objects for steps in the outermost procedure, along with parameter values passed into the job when it was invoked:
/jobSteps[jobStepId]
,/jobs[jobId]/actualParameters[actualParameterName]
-
If a job step invokes a nested subprocedure, its property sheet contains parameter values that were passed into the nested subprocedure, plus all job steps corresponding to that procedure:
/jobs[jobId]/steps[stepName]/steps[stepName]/actualParameters[actualParameterName]
-
Schedules contain parameter values for the procedures they invoke. These are called actual parameters because they provide actual values passed into the procedure:
/projects[projectName]/schedules[scheduleName]/actualParameters[parameterName]
-
Workflow definitions contain state definitions:
/projects[projectName]/workflowDefinitions[workflowDefinitionName]/stateDefinitions[stateDefinitionName]
-
Transition definitions contain actual parameters:
/projects[projectName]/workflowDefinitions[workflowDefinitionName]/transitionDefinition/actualParameters[parameterName]
-
State definitions contain transition definitions, actual parameters, and formal parameters:
/projects[projectName]/workflowDefinitions[workflowDefinitionName]/stateDefinitions[stateDefinitionsName]/actualParameters[parameterName]
stateDefinition/formalParameters[parameterName]
,/projects[projectName]/workflowDefinitions[workflowDefinitionName]/stateDefinitions[stateDefinitionsName]/transitionDefinitions[transitionDefinitionName]
-
Workflows contain states:
/projects[projectName]/workflows[workflowName]/states[stateName]
-
Transitions contain actual parameters:
/projects[projectName]/workflows[workflowName]/transitions[transitionName]/actualParameters[parameterName]
-
States contain transitions, actual parameters, and formal parameters:
/projects[projectName]/workflows[workflowName]/states[stateName]/actualParameters[parameterName]
,/projects[projectName]/workflows[workflowName]/states[stateName]/formalParameters[parameterName]
,/projects[projectName]/workflows[workflowName]/states[stateName]/transitions[transitionName]
Special property references
CloudBees CD/RO also supports several special property reference forms that are described in the following subsections.
increment
Use this form to increment the value of an integer property before returning its value. For example, suppose property xyz
has the value 43
. The property reference $[/increment xyz]
first increments the value of property xyz
to 44
, and then returns 44
. If the property does not exist, it is created and set to the value 1
.
timestamp
Use this form to generate a formatted timestamp value. For example, the property reference $[/timestamp yyyy-MMM-dd hh:mm]
returns the current time in a form such as "2022-Jun-21 04:25". The pattern following /timestamp
specifies how to format the time and defaults to yyyyMMddHHmm
. The pattern follows conventions for the Java class SimpleDateFormat
, where various letters are substituted with various current time elements. For more information about the SimpleDateFormat class, refer to https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html. Here are some of the supported substitutions:
y—Year, such as "2007" or "07" M—Month, such as "April", Apr", or "04" w—Week in year, such as "27" W—Week in month, such as "3" D—Day in year, such as "194" d—Day in month, such as "18" E—Day in the week, such as "Tuesday" or "Tue" a—am/pm marker, such as "PM" H—Hour in day (0-23), such as "7" h—Hour in am/pm (1-12), such as "11" m—Minute in hour, such as "30" s—Second in minute, such as "15" S—Millisecond, such as "908" z—Time zone such as "Pacific Standard Time", "PST", or "GMT-08:00" Z—Time zone such as "-0800"
Repeated letters cause longer forms to be substituted. For example, yy
substitutes the last 2 digits of the current year, whereas yyyy
substitutes the 4-digit year number. Single quotes can be used to substitute text directly without the above interpretations.
Javascript
This form executes a Javascript code fragment inside the CloudBees CD/RO server and returns the result computed by that code. For example, $[/javascript 4*2]
returns "8.0". Javascript code can be arbitrarily long and include multiple statements. The value of the last statement is returned by the property reference.
Javascript code executes in an interpreter that provides access to CloudBees CD/RO properties and the CloudBees CD/RO API:
-
The normal way to access property values is through Javascript objects. Global Javascript objects named "server," "projects," and so on, exist and correspond to all top-level objects in an absolute property path. For example, there is a Javascript object named
server
that corresponds to the path/server
, and a Javascript object namedmyJob
that corresponds to the path/myJob
. You can use either.
or[]
notation to access properties within the object. For a more complete list of top-level objects, refer to Absolute property paths. Examples:-
$[/javascript myJob.mightExist]
is a safe way to refer to an optional parameter. -
$[/javascript (myJobStep.errors > 0) ? "step failed" : "no errors"]
test a value and return another string based on the result. -
$[/javascript server.settings.ipAddress]
refer to a property in a nested property sheet. -
$[/javascript server["CloudBees"].installDirectory]
if the property name has spaces or other special characters, use the[""]
notation.For example,
$[/javascript projects["My Project"]["A Property sheet"].aPropertyName]
. Note that there is no.
in front of the[
.
-
-
You can also call the
getProperty
function. It takes a property name as an argument and returns the value of that property. This is most useful when you want to access another special property reference. Examples:-
$[/javascript getProperty ("/timestamp yyyy-MMM-d hh:mm")]
returns the current time. -
$[/javascript getProperty ("/increment /myJob/jsCount")]
returns the incremented value of the property. -
$[/javascript (getProperty("/myJobStep/errors") > 0) ? "step failed" : "no errors"]
returns "step failed" if the property "errors" on the current job step had a value greater than zero, and it returns "no errors" otherwise.
-
-
If calling the
setProperty
function, similar togetProperty
, there are two variations on the function:-
A global function variation that uses the current context object. The global function takes 2 or 3 arguments. The 3-argument version takes a context object, a path, and a value. The 2-argument version omits the context object and uses the current context object (for example, job step ). Example:
setProperty (myProject, "foo", "bar")
would set the value of the "foo" property on the current project to "bar". -
An object function variation that can be called on objects, which uses that object as a context object. The object function takes two arguments: a "path" and a "value". Example:
server.setProperty("aProp", "123")
would set theaProp
property on the server object to the value "123".
-
-
You can also make calls to any API. The APIs take a JavaScript key-value pair value array as an input, where the key is the API field name. For example:
-
$[/javascript api.getResource({resourceName:"local"}).resource.hostName]
returns the name of the host where thelocal
agent is running. For the API field names and expected value types, refer to theectool
documentation. -
Property references can also be used for field values. For example, the following is valid if run in the context of a job step:
$[/javascript api.getResource({resourceName:myJobStep.assignedResourceName}).resource.hostName]
-
To view the API return data structure, you can use the JavaScript method
JSON.stringify()
or the command lineectool
:
ectool --format json getResource local
-