Package Repository Material Plugins
Extension Information
Availability | GoCD version 14.4.0 onwards |
Extension Name | package-repository |
Extension API Version | 1.0 |
The Package Repository extension endpoint allows plugin authors to extend GoCD and integrate it package repositories.
GoCD’s user documentation has an overview of package repository material plugins. Please see that.
A sample package repository material plugin - YUM
A skeleton package repository material plugin
Requests from the GoCD server
In order to implement a SCM extension endpoint the following messages must be implemented by the plugin.
- Repository Configuration
- Package Configuration
- Validate Repository Configuration
- Validate Package Configuration
- Check Repository Connection
- Check Package Connection
- Latest Package Revision
- Latest Package Revision Since
Repository Configuration
This message is sent by the server, when it wants to know what properties need to be stored in the configuration, for this plugin and this repository. It also uses this information to create a view, for the user to provide information about the repository.
The plugin will receive a request with following information.
Request name
repository-configuration
Request parameters
The server will not provide any parameters.
Request headers
The server will not provide any headers.
Request body
The server will not provide request body.
Example response body
{
"REPO_URL": {
"display-name": "Repository URL",
"display-order": "0"
},
"USERNAME": {
"part-of-identity": false,
"required": false,
"display-name": "User",
"display-order": "1"
},
"PASSWORD": {
"secure": true,
"part-of-identity": false,
"required": false,
"display-name": "Password",
"display-order": "2"
}
}
Response code
The plugin is expected to return status 200
if it can understand the request.
Response Body
The plugin is expected to return an object containing the configuration property along with repository configuration object
Package Configuration
This message is sent by the server, when it wants to know what properties need to be stored in the configuration, for this plugin and for this package. It also uses this information to create a view, for the user to provide information about the package.
The plugin will receive a request with following information.
Request name
package-configuration
Request parameters
The server will not provide any parameters.
Request headers
The server will not provide any headers.
Request body
The server will not provide request body.
Example response body
{
"Field_1": {
"display-name": "Package Spec",
"display-order": "0",
"default-value": "DEF",
"secure": false,
"part-of-identity": true,
"required": true
},
"Field_2": {
"display-name": "Field 2",
"display-order": "1",
"default-value": "ABC",
"secure": true,
"part-of-identity": true,
"required": false
}
}
Response code
The plugin is expected to return status 200
if it can understand the request.
Response Body
The plugin is expected to return an object containing the configuration property along with package configuration object
Validate Repository Configuration
The plugin will receive request with following information.
Example request body
{
"repository-configuration": {
"REPO_URL": {
"value": "http://localhost.com"
},
"USERNAME": {
"value": "user"
},
"PASSWORD": {
"value": "password"
}
}
}
Request name
validate-repository-configuration
Request parameters
The server will not provide any parameters.
Request headers
The server will not provide any headers.
Request body
This contains information about the repository-level configuration provided by the user. The keys in the maps correspond to the keys provided by the plugin, as a part of the response to “Repository Configuration” message.
Example response body
[
{
"key": "REPO_URL",
"message": "Repository url not specified"
},
{
"key": "RANDOM",
"message": "Unsupported key(s) found : RANDOM. Allowed key(s) are : REPO_URL, USERNAME, PASSWORD"
}
]
Response code
The plugin is expected to return status 200
if it can understand the request.
Response Body
The plugin is expected to send a response, which contains a list of errors in the repository configuration, one message for every key in the request. It can also send an empty list, that is []
, if the configuration is valid.
Validate Package Configuration
The plugin will receive request with following information.
Example request body
{
"repository-configuration": {
"REPO_URL": {
"value": "http://localhost.com"
},
"USERNAME": {
"value": "user"
},
"PASSWORD": {
"value": "password"
}
},
"package-configuration": {
"PACKAGE_SPEC": {
"value": "sample-package-1.0"
}
}
}
Request name
validate-package-configuration
Request parameters
The server will not provide any parameters.
Request headers
The server will not provide any headers.
Request body
This contains information about both the repository-level configuration and package-level configuration provided by the user. The keys in the maps correspond to the keys provided by the plugin, as a part of the response to “Repository Configuration” and “Package Configuration” messages.
Example response body
[
{
"key": "PACKAGE_SPEC",
"message": "Package spec not specified"
},
{
"key": "RANDOM",
"message": "Unsupported key(s) found: RANDOM. Allowed key(s) are: PACKAGE_SPEC"
}
]
Response code
The plugin is expected to return status 200
if it can understand the request.
Response Body
The plugin is expected to send a response, which contains a list of errors in the package configuration, one message for every key in the request. It can also send an empty list, that is []
, if the configuration is valid.
Check Repository Connection
The plugin will receive request with following information.
Example request body
{
"repository-configuration": {
"REPO_URL": {
"value": "http://localhost.com"
},
"USERNAME": {
"value": "user"
},
"PASSWORD": {
"value": "password"
}
}
}
Request name
check-repository-connection
Request parameters
The server will not provide any parameters.
Request headers
The server will not provide any headers.
Request body
This contains information about the repository-level configuration provided by the user. The keys in the maps correspond to the keys provided by the plugin, as a part of the response to “Repository Configuration” message.
Example response body
{
"status": "success",
"messages": [
"Successfully connected to repository url provided"
]
}
Response code
The plugin is expected to return status 200
if it can understand the request.
Response Body
The plugin is expected to send a response, which contains a status (“success” or “failure”), and a list of error messages. This represents whether a connection was successfully made, to the repository specified in the request.
Check Package Connection
The plugin will receive request with following information.
Example request body
{
"repository-configuration": {
"REPO_URL": {
"value": "http://localhost.com"
},
"USERNAME": {
"value": "user"
},
"PASSWORD": {
"value": "password"
}
},
"package-configuration": {
"PACKAGE_SPEC": {
"value": "sample-package-1.0"
}
}
}
Request name
check-package-connection
Request parameters
The server will not provide any parameters.
Request headers
The server will not provide any headers.
Request body
This contains information about both the repository-level configuration and package-level configuration provided by the user. The keys in the maps correspond to the keys provided by the plugin, as a part of the response to “Repository Configuration” and “Package Configuration” messages.
Example response body
{
"status": "success",
"messages": [
"Successfully found package abc.rpm"
]
}
Response code
The plugin is expected to return status 200
if it can understand the request.
Response Body
The plugin is expected to send a response, which contains a status (“success” or “failure”), and a list of error messages. This represents whether a connection was successfully made, to find the package specified in the repository.
Latest Revision
The plugin will receive request with following information.
Example request body
{
"repository-configuration": {
"REPO_URL": {
"value": "http://localhost.com"
},
"USERNAME": {
"value": "user"
},
"PASSWORD": {
"value": "password"
}
},
"package-configuration": {
"PACKAGE_SPEC": {
"value": "sample-package-1.0"
}
}
}
Request name
latest-revision
Request parameters
The server will not provide any parameters.
Request headers
The server will not provide any headers.
Request body
This contains information about both the repository-level configuration and package-level configuration provided by the user. The keys in the maps correspond to the keys provided by the plugin, as a part of the response to “Repository Configuration” and “Package Configuration” messages.
Example response body
{
"revision": "abc-10.2.1.rpm",
"timestamp": "2011-07-14T19:43:37.100Z",
"user": "some-user",
"revisionComment": "comment",
"trackbackUrl": "http://localhost:9999",
"data": {
"VERSION": "5.3.0",
"LOCATION": "http://www.sample.org/location/of/package",
"DATA-THREE": "data-three-value"
}
}
Response code
The plugin is expected to return status 200
if it can understand the request.
Response Body
The plugin is expected to send a response, which contains information about the latest revision it can find of the package specified by the information in the request. It can send an empty response ({}
) to specify that it could not find a suitable package.
Almost all the fields expected in this response are explained in this part of the user documentation. The extra map, named “data” in the response, can be filled with custom keys and values, which will be made available to the agent, as environment variables, when a job contains this plugin as a material.
Latest Revision Since
The plugin will receive request with following information.
Example request body
{
"repository-configuration": {
"REPO_URL": {
"value": "http://localhost.com"
},
"USERNAME": {
"value": "user"
},
"PASSWORD": {
"value": "password"
}
},
"package-configuration": {
"PACKAGE_SPEC": {
"value": "sample-package-1.0"
}
},
"previous-revision": {
"revision": "abc-10.2.1.rpm",
"timestamp": "2011-07-14T19:43:37.100Z",
"data": {
"VERSION": "5.3.0",
"LOCATION": "http://www.sample.org/location/of/package",
"DATA-THREE": "data-three-value"
}
}
}
Request name
latest-revision-since
Request parameters
The server will not provide any parameters.
Request headers
The server will not provide any headers.
Request body
This request is very similar to the request of the “Latest Revision” message. This contains information about both the repository-level configuration and package-level configuration provided by the user. The keys in the maps correspond to the keys provided by the plugin, as a part of the response to “Repository Configuration” and “Package Configuration” messages.
Along with that information, this request contains information about the previous revision of the package that GoCD knows about. Compare the “previous-revision” data of the example request shown below, with the response of the “Latest Revision” message to understand this.
Example response body
{
"revision": "abc-10.2.2.rpm",
"timestamp": "2011-07-14T19:45:37.100Z",
"user": "some-user",
"revisionComment": "comment 2",
"trackbackUrl": "http://localhost:9999",
"data": {
"dataKeyOne": "data-value-one-1",
"dataKeyTwo": "data-value-two-2"
}
}
Response code
The plugin is expected to return status 200
if it can understand the request.
Response Body
Just as with the “Latest Revision” message, the plugin is expected to send a response, which contains information about the latest revision it can find of the package specified by the information in the request. The difference here, is that it needs to find a revision of the package which is greater than the one specified in the request. It can send an empty response ({}
) to specify that it could not find a suitable package (for instance, if there has been no change, and the latest revision is still the one specified in the request).
Almost all the fields expected in this response are explained in this part of the user documentation. The extra map, named “data” in the response, can be filled with custom keys and values, which will be made available to the agent, as environment variables, when a job contains this plugin as a material.
Request/Response JSON Objects
The Repository Configuration Response Object
Here’s an example of the repository configuration response object:
{
"REPO_URL": {
"display-name": "Repository URL",
"display-order": "0"
},
"USERNAME": {
"part-of-identity": false,
"required": false,
"display-name": "User",
"display-order": "1"
},
"PASSWORD": {
"secure": true,
"part-of-identity": false,
"required": false,
"display-name": "Password",
"display-order": "2"
}
}
Attribute | Type | Description |
---|---|---|
display-name |
String | This option is used in the configuration UI, as a label of the input element. |
display-order |
Integer | This option is used in the configuration UI, to decide on the order in which the fields specified here need to be displayed. |
default-value |
String | A value to be used as the default if the user provides no value. |
secure |
Boolean | If the value should be stored in an encrypted form in the cruise-config.xml file. |
part-of-identity |
Boolean | Should the data for this field (provided by the user) be considered part of the identity of this material? Another way to think about this is: “If the user changes the value of this property, should GoCD consider this a new material?”. A good example for a property to be considered a part-of-identity is the URL (if the URL changes, it’s probably a different material). An example of a property which should not be considered part-of-identity is “password” (if the password or username changes, then it’s probably not a completely different material). |
required |
Boolean | Whether the field is required. |
The Package Configuration Response Object
Here’s an example of the package configuration response object:
{
"Field_1": {
"display-name": "Package Spec",
"display-order": "0",
"default-value": "DEF",
"secure": false,
"part-of-identity": true,
"required": true
},
"Field_2": {
"display-name": "Field 2",
"display-order": "1",
"default-value": "ABC",
"secure": true,
"part-of-identity": true,
"required": false
}
}
Attribute | Type | Description |
---|---|---|
display-name |
String | This option is used in the configuration UI, as a label of the input element. |
display-order |
Integer | This option is used in the configuration UI, to decide on the order in which the fields specified here need to be displayed. |
default-value |
String | A value to be used as the default if the user provides no value. |
secure |
Boolean | If the value should be stored in an encrypted form in the cruise-config.xml file. |
part-of-identity |
Boolean | Should the data for this field (provided by the user) be considered part of the identity of this material? Another way to think about this is: “If the user changes the value of this property, should GoCD consider this a new material?”. A good example for a property to be considered a part-of-identity is the URL (if the URL changes, it’s probably a different material). An example of a property which should not be considered part-of-identity is “password” (if the password or username changes, then it’s probably not a completely different material). |
required |
Boolean | Whether the field is required. |