UNPKG

screwdriver-api

Version:

API server for the Screwdriver.cd service

419 lines (277 loc) • 12.8 kB
# Pipelines Plugin > Hapi pipelines plugin for the Screwdriver API ## Usage ### Register plugin ```javascript const Hapi = require('@hapi/hapi'); const server = new Hapi.Server(); const pipelinesPlugin = require('./'); server.connection({ port: 3000 }); server.register({ register: pipelinesPlugin, options: {} }, () => { server.start((err) => { if (err) { throw err; } console.log('Server running at:', server.info.uri); }); }); ``` ### Routes #### Get all pipelines `page`, `count`, `sort`, `sortBy`, `search`, and `configPipelineId` optional `search` will search for a pipeline with a name containing the search keyword in the `scmRepo` field `GET /pipelines?page={pageNumber}&count={countNumber}&configPipelineId={configPipelineId}&search={search}` Need to have array format for `ids` to only return pipelines with matching ids `GET /pipelines?search={search}&ids[]=12345&ids[]=55555` #### Get single pipeline `GET /pipelines/{id}` #### Create a pipeline Create a pipeline and create a job called 'main' `POST /pipelines` **Arguments** * `checkoutUrl` - Source code URL for the application. For a git-based repository, it is typically the SSH endpoint and the branch name, separated by a octothorpe. Must be unique. * `rootDir` - *Optional* Root directory where the source code lives. Default to empty string. Example payload: ```json { "checkoutUrl": "git@github.com:screwdriver-cd/data-model.git#master", "rootDir": "src/app/component" } ``` #### Update a pipeline You can update the checkoutUrl of a pipeline. `PUT /pipelines/{id}` **Arguments** * `checkoutUrl` - Source code URL for the application. For a git-based repository, it is typically the SSH endpoint and the branch name, separated by a octothorpe. Must be unique. * `rootDir` - *Optional* Root directory where the source code lives. Default to empty string. Example payload: ```json { "checkoutUrl": "git@github.com:screwdriver-cd/data-model.git#master", "rootDir": "src/app/component" } ``` #### Delete a pipeline `DELETE /pipelines/{id}` #### Synchronize a pipeline * Synchronize the pipeline by looking up latest screwdriver.yaml * Create, update, or disable jobs if necessary. * Store/update the pipeline workflowGraph `POST /pipelines/{id}/sync` #### Synchronize webhooks * Synchronize webhooks for the pipeline * Add or update webhooks if necessary `POST /pipelines/{id}/sync/webhooks` #### Synchronize pull requests * Synchronize pull requests for the pipeline * Add or update pull request jobs if necessary `POST /pipelines/{id}/sync/pullrequests` #### Get all pipeline events Query Params: * `page` - *Optional* Specific page of the set to return * `count` - *Optional* Number of items per page * `sort` - *Optional* Sort rangekey by `ascending` or `descending` (default `descending`) * `sortBy` - *Optional* Field to sort by * `type` - *Optional* Get pipeline or pr events (default `pipeline`) * `prNum` - *Optional* Return only PR events of specified PR number * `groupEventId` - *Optional* Return only events with a specified groupEventId * `id` - *Optional* Fetch specific event ID; alternatively can use greater than(`gt:`) or less than(`lt:`) prefix * `sha` - *Optional* Search `sha` and `configPipelineSha` for events * `author` - *Optional* Search commit author `username` and `name` for events * `creator` - *Optional* Search creator `username` and `name` for events * `message` - *Optional* Search commit `message` for events _Caveats_: Only one of the search fields can be used at one time (sha, author, creator, or message). `GET /pipelines/{id}/events?page={pageNumber}&count={countNumber}&sort={sort}&type={type}&prNum={prNumber}&sha={sha}` `GET /pipelines/{id}/events?message={message}` `GET /pipelines/{id}/events?id=gt:{eventId}&count={countNumber}` (greater than eventId) `GET /pipelines/{id}/events?id=lt:{eventId}&count={countNumber}&sort=ascending` (less than eventId) #### Get all pipeline builds `page`, `count`, `sort`, `latest`, `sortBy`, `fetchSteps`, `readOnly`, and `groupEventId` are optional When `latest=true` and `groupEventId` is set, only latest builds in a pipeline based on groupEventId will be returned. The `latest` parameter must be used in conjunction with the `groupEventId`. `GET /pipelines/{id}/builds?page={pageNumber}&count={countNumber}&sort={sort}&latest=true&groupEventId={groupEventId}&sortBy={sortBy}&fetchSteps=false&readOnly=false` #### Get all jobs (including pull requests jobs) `archived` is optional and has a default value of `false`, which makes the endpoint not return archived jobs (e.g. closed pull requests) Arguments: * `archived` - Optional and has a default value of `false`, which makes the endpoint not return archived jobs (e.g. closed pull requests) * `type` - Optional and can be set to `pr` or `pipeline` to only return PR jobs or non-PR jobs * `jobName` - Optional and can be set to only return only a single job `GET /pipelines/{id}/jobs?archived={boolean}&type={type}&jobName={jobName}` #### Get Pipeline Admin `GET /pipelines/{id}/admin` #### Get all triggers `GET /pipelines/{id}/triggers` #### Get all stages for a single pipeline `page`, `count`, `sort`, `sortBy`, and `name` optional `GET /pipelines/{id}/stages?page={pageNumber}&count={countNumber}&sort={sort}&name={stageName}` #### Get all pipeline secrets `GET /pipelines/{id}/secrets` #### Get event metrics for a single pipeline `GET /pipelines/{id}/metrics` `GET /pipelines/{id}/metrics?startTime=2019-02-01T12:00:00.000Z` `GET /pipelines/{id}/metrics?aggregateInterval=week` Need to have array format for downtimeJobs and downtimeStatuses `GET /pipelines/{id}/metrics?downtimeJobs[]=123&downtimeJobs[]=456&downtimeStatuses[]=ABORTED` #### Start all child pipelines belong to this pipeline * Start all child pipelines belong to this config pipeline all at once `POST /pipelines/{id}/startall` #### Create a pipeline token `POST /pipelines/{id}/token` #### Get all pipeline tokens `GET /pipelines/{id}/tokens` #### Update a pipeline token `PUT /pipelines/{pipelineId}/tokens/{tokenId}` #### Refresh a pipeline token `PUT /pipelines/{pipelineId}/tokens/{tokenId}/refresh` #### Delete a pipeline token `DELETE /pipelines/{pipelineId}/tokens/{tokenId}` #### Delete all pipeline tokens belong to this pipeline `DELETE /pipelines/{pipelineId}/tokens` #### Get latest build for a single job `GET /pipelines/{id}/jobs/{jobName}/latestBuild` Can search by build status `GET /pipelines/{id}/jobs/{jobName}/latestBuild?status=SUCCESS` #### Deletes cache for the given scope and cacheId for pipeline `DELETE /pipelines/${id}/caches?scope={scope}&cacheId={id}` Path Params: * `id` - The id of the pipeline Query Params: * `scope` - Scope of the cache supporting values `pipelines|jobs|events` * `cacheId` - The id of the cache - pipelineId/jobId/eventId ### Configuration - Reads the ecosystem ``` ecosystem: store: 'https://store.screwdriver.cd' queue: 'https://queue.screwdriver.cd' cache: strategy: 's3' ``` Route requests to queue service api if strategy is **disk** and to store api if strategy is **s3** #### Open pull request `POST /pipelines/{id}/openPr` ### Access to Factory methods The server supplies factories to plugins in the form of server settings: ```js // handler pipelinePlugin.js handler: async (request, h) => { const factory = request.server.app.pipelineFactory; // ... } ``` #### Pipeline Templates ##### Get all pipeline templates `GET /pipeline/templates` Can use additional options for sorting, pagination and count: `GET /pipeline/templates?sort=ascending&sortBy=name&page=1&count=50` ##### Get all versions for a pipeline template `GET /pipeline/templates/{namespace}/{name}/versions` Can use additional options for sorting, pagination and count: `GET /pipeline/templates/{namespace}/{name}/versions?sort=ascending&page=1&count=50` ##### Create a pipeline template Creating a template will store the template meta (`name`, `namespace`, `maintainer`, `latestVersion`, `trustedSinceVersion`, `pipelineId`) and template version (`description`, `version`, `config`, `createTime`, `templateId`) into the datastore. `version` will be auto-bumped. For example, if `mypipelinetemplate@1.0.0` already exists and the version passed in is `1.0.0`, the newly created template will be version `1.0.1`. `POST /pipeline/template` ###### Arguments 'name', 'namespace', 'version', 'description', 'maintainer', 'config' * `name` - Name of the template * `namespace` - Namespace of the template * `version` - Version of the template * `description` - Description of the template * `maintainer` - Maintainer of the template * `config` - Config of the template. This field is an object that includes `steps`, `image`, and optional `secrets`, `environments`. Similar to what's inside the `pipeline` Example payload: ```json { "name": "example-template", "namespace": "my-namespace", "version": "1.3.1", "description": "An example template", "maintainer": "example@gmail.com", "config": { "steps": [{ "echo": "echo hello" }] } } ``` ##### Validate a pipeline template Validate a pipeline template and return a JSON containing the boolean property ‘valid’ indicating if the template is valid or not `POST /pipeline/template/validate` ###### Arguments 'name', 'namespace', 'version', 'description', 'maintainer', 'config' * `name` - Name of the template * `namespace` - Namespace of the template * `version` - Version of the template * `description` - Description of the template * `maintainer` - Maintainer of the template * `config` - Config of the template. This field is an object that includes `steps`, `image`, and optional `secrets`, `environments`. Similar to what's inside the `pipeline` Example payload: ```json { "name": "example-template", "namespace": "my-namespace", "version": "1.3.1", "description": "An example template", "maintainer": "example@gmail.com", "config": { "steps": [{ "echo": "echo hello" }] } } ``` #### Get a pipeline template by namespace and name `GET /pipeline/template/{namespace}/{name}` ##### Get a specific pipeline template by id `GET /pipeline/template/{id}` ##### Get version of a pipeline template by name, namespace, version or tag `GET /pipeline/template/{namespace}/{name}/{versionOrTag}` #### Template Tag Template tag allows fetching on template version by tag. For example, tag `mytemplate@1.1.0` as `stable`. ##### Get all tags for a pipeline template by name, namespace `GET /pipeline/templates/{namespace}/{name}/tags` Can use additional options for sorting, pagination and count: `GET /pipeline/templates/{namespace}/{name}/tags?sort=ascending&sortBy=name&page=1&count=50` ##### Create/Update a tag If the template tag already exists, it will update the tag with the new version. If the template tag doesn't exist yet, this endpoint will create the tag. *Note: This endpoint is only accessible in `build` scope and the permission is tied to the pipeline that creates the template.* `PUT /templates/{templateName}/tags/{tagName}` with the following payload * `version` - Exact version of the template (ex: `1.1.0`) ##### Delete a pipeline template Deleting a pipeline template will delete a template and all of its associated tags and versions. `DELETE /pipeline/templates/{namespace}/{name}` ###### Arguments * `name` - Name of the template ##### Delete a pipeline template version Delete the template version and all of its associated tags. If the deleted version was the latest version, the API would set the `latestVersion` attribute of the templateMeta to the previous version. `DELETE /pipeline/templates/{namespace}/{name}/versions/{version}` ###### Arguments 'namespace', 'name', 'version' * `namespace` - Namespace of the template * `name` - Name of the template * `version` - Version of the template ##### Delete a pipeline template tag Delete the template tag. This does not delete the template itself. *Note: This endpoint is only accessible in `build` scope and the permission is tied to the pipeline that creates the template.* `DELETE /pipeline/templates/{namespace}/{name}/tags/{tag}` ###### Arguments 'namespace', 'name', 'tag' * `namespace` - Namespace of the template * `name` - Name of the template * `tag` - Tag name of the template ##### Update a pipeline template's trusted property Update a pipeline template's trusted property `PUT /pipeline/templates/{namespace}/{name}/trusted` ###### Arguments 'namespace', 'name' * `namespace` - Namespace of the template * `name` - Name of the template Example payload: ```json { "trusted": true } ```