Commit 062ef121 authored by Filipa Lacerda's avatar Filipa Lacerda Committed by Kamil Trzciński

Removes get requests for upstream/downstream

Recursively updates isExpanded property for
all triggered and triggered by pipelines
parent 0286eafe
...@@ -2,7 +2,7 @@ import Vue from 'vue'; ...@@ -2,7 +2,7 @@ import Vue from 'vue';
import Flash from '~/flash'; import Flash from '~/flash';
import Translate from '~/vue_shared/translate'; import Translate from '~/vue_shared/translate';
import { __ } from '~/locale'; import { __ } from '~/locale';
import PipelinesMediator from 'ee/pipelines/pipeline_details_mediator'; import PipelinesMediator from './pipeline_details_mediator';
import pipelineGraph from 'ee/pipelines/components/graph/graph_component.vue'; import pipelineGraph from 'ee/pipelines/components/graph/graph_component.vue';
import pipelineHeader from './components/header_component.vue'; import pipelineHeader from './components/header_component.vue';
import eventHub from './event_hub'; import eventHub from './event_hub';
...@@ -53,10 +53,10 @@ export default () => { ...@@ -53,10 +53,10 @@ export default () => {
on: { on: {
refreshPipelineGraph: this.requestRefreshPipelineGraph, refreshPipelineGraph: this.requestRefreshPipelineGraph,
// EE-only start // EE-only start
refreshTriggeredPipelineGraph: this.mediator.refreshTriggeredByPipelineGraph, // refreshTriggeredPipelineGraph: this.mediator.refreshTriggeredByPipelineGraph,
refreshTriggeredByPipelineGraph: this.mediator.refreshTriggeredByPipelineGraph, // refreshTriggeredByPipelineGraph: this.mediator.refreshTriggeredByPipelineGraph,
onClickTriggeredBy: pipeline => this.clickTriggeredBy(pipeline), onClickTriggeredBy: pipeline => this.clickTriggeredByPipeline(pipeline),
onClickTriggered: pipeline => this.clickTriggered(pipeline), onClickTriggered: pipeline => this.clickTriggeredPipeline(pipeline),
// EE-only end // EE-only end
}, },
}); });
......
...@@ -2,8 +2,8 @@ import Visibility from 'visibilityjs'; ...@@ -2,8 +2,8 @@ import Visibility from 'visibilityjs';
import Flash from '../flash'; import Flash from '../flash';
import Poll from '../lib/utils/poll'; import Poll from '../lib/utils/poll';
import { __ } from '../locale'; import { __ } from '../locale';
import PipelineService from '~/pipelines/services/pipeline_service';
import PipelineStore from 'ee/pipelines/stores/pipeline_store'; // eslint-disable-line import/order import PipelineStore from 'ee/pipelines/stores/pipeline_store'; // eslint-disable-line import/order
import PipelineService from 'ee/pipelines/services/pipeline_service'; // eslint-disable-line import/order
export default class pipelinesMediator { export default class pipelinesMediator {
constructor(options = {}) { constructor(options = {}) {
......
...@@ -6,6 +6,7 @@ import EEGraphMixin from 'ee/pipelines/mixins/graph_component_mixin'; ...@@ -6,6 +6,7 @@ import EEGraphMixin from 'ee/pipelines/mixins/graph_component_mixin';
import StageColumnComponent from '~/pipelines/components/graph/stage_column_component.vue'; import StageColumnComponent from '~/pipelines/components/graph/stage_column_component.vue';
export default { export default {
name: 'PipelineGraph',
components: { components: {
LinkedPipelinesColumn, LinkedPipelinesColumn,
StageColumnComponent, StageColumnComponent,
...@@ -62,21 +63,6 @@ export default { ...@@ -62,21 +63,6 @@ export default {
<div class="pipeline-visualization pipeline-graph pipeline-tab-content"> <div class="pipeline-visualization pipeline-graph pipeline-tab-content">
<div class="text-center"><gl-loading-icon v-if="isLoading" :size="3" /></div> <div class="text-center"><gl-loading-icon v-if="isLoading" :size="3" /></div>
<ul v-if="shouldRenderTriggeredByPipeline" class="d-inline-block upstream-pipeline align-top">
<stage-column-component
v-for="(stage, indexUpstream) in triggeredByGraph"
:key="stage.name"
:class="{
'has-only-one-job': hasOnlyOneJob(stage),
}"
:title="capitalizeStageName(stage.name)"
:groups="stage.groups"
:stage-connector-class="stageConnectorClass(indexUpstream, stage)"
:is-first-column="isFirstColumn(indexUpstream)"
@refreshPipelineGraph="refreshTriggeredByPipelineGraph"
/>
</ul>
<linked-pipelines-column <linked-pipelines-column
v-if="hasTriggeredBy" v-if="hasTriggeredBy"
:linked-pipelines="triggeredByPipelines" :linked-pipelines="triggeredByPipelines"
...@@ -116,25 +102,6 @@ export default { ...@@ -116,25 +102,6 @@ export default {
graph-position="right" graph-position="right"
@linkedPipelineClick="handleClickedDownstream" @linkedPipelineClick="handleClickedDownstream"
/> />
<ul
v-if="shouldRenderTriggeredPipeline"
class="d-inline-block downstream-pipeline position-relative align-top"
:style="{ 'margin-top': marginTop }"
>
<stage-column-component
v-for="(stage, indexDownstream) in triggeredGraph"
:key="stage.name"
:class="{
'has-only-one-job': hasOnlyOneJob(stage),
}"
:title="capitalizeStageName(stage.name)"
:groups="stage.groups"
:stage-connector-class="stageConnectorClass(indexDownstream, stage)"
:is-first-column="isFirstColumn(indexDownstream)"
@refreshPipelineGraph="refreshTriggeredPipelineGraph"
/>
</ul>
</div> </div>
</div> </div>
</template> </template>
...@@ -12,30 +12,23 @@ export default { ...@@ -12,30 +12,23 @@ export default {
GlButton, GlButton,
}, },
props: { props: {
pipelineId: { pipeline: {
type: Number,
required: true,
},
pipelineStatus: {
type: Object, type: Object,
required: true, required: true,
}, },
projectName: {
type: String,
required: true,
},
isLoading: {
type: Boolean,
required: false,
default: false,
},
}, },
computed: { computed: {
tooltipText() { tooltipText() {
return `${this.projectName} - ${this.pipelineStatus.label}`; return `${this.projectName} - ${this.pipelineStatus.label}`;
}, },
buttonId() { buttonId() {
return `js-linked-pipeline-${this.pipelineId}`; return `js-linked-pipeline-${this.pipeline.id}`;
},
pipelineStatus() {
return this.pipeline.details.status;
},
projectName() {
return this.pipeline.project.name;
}, },
}, },
methods: { methods: {
...@@ -57,10 +50,10 @@ export default { ...@@ -57,10 +50,10 @@ export default {
class="js-linked-pipeline-content linked-pipeline-content" class="js-linked-pipeline-content linked-pipeline-content"
@click="onClickLinkedPipeline" @click="onClickLinkedPipeline"
> >
<gl-loading-icon v-if="isLoading" class="js-linked-pipeline-loading d-inline" /> <gl-loading-icon v-if="pipeline.isLoading" class="js-linked-pipeline-loading d-inline" />
<ci-status v-else :status="pipelineStatus" class="js-linked-pipeline-status" /> <ci-status v-else :status="pipelineStatus" class="js-linked-pipeline-status" />
<span class="str-truncated align-bottom"> {{ projectName }} &#8226; #{{ pipelineId }} </span> <span class="str-truncated align-bottom"> {{ projectName }} &#8226; #{{ pipeline.id }} </span>
</gl-button> </gl-button>
</li> </li>
</template> </template>
export default { export default {
triggeredPipelines: 'triggeredPipelines', triggeredPipelines: 'triggeredPipelines',
triggeredByPipelines: 'triggeredByPipelines', triggeredByPipelines: 'triggeredByPipelines',
triggeredBy: 'triggeredBy', triggeredBy: 'triggered_by',
triggered: 'triggered', triggered: 'triggered',
}; };
import _ from 'underscore';
export default { export default {
props: {
triggered: {
type: Object,
required: false,
default: () => ({}),
},
triggeredBy: {
type: Object,
required: false,
default: () => ({}),
},
triggeredByPipelines: {
type: Array,
required: false,
default: () => [],
},
triggeredPipelines: {
type: Array,
required: false,
default: () => [],
},
},
data() { data() {
return { return {
triggeredTopIndex: 1, triggeredTopIndex: 1,
}; };
}, },
computed: { computed: {
triggeredGraph() { hasTriggeredBy() {
return this.triggered && this.triggered.details && this.triggered.details.stages; return this.pipeline.triggered_by && this.pipeline.triggered_by != null;
}, },
triggeredByGraph() { triggeredByPipelines() {
return this.triggeredBy && this.triggeredBy.details && this.triggeredBy.details.stages; return this.pipeline.triggered_by;
}, },
hasTriggered() { hasTriggered() {
return this.triggeredPipelines.length > 0; return this.pipeline.triggered && this.pipeline.triggered.length > 0;
},
hasTriggeredBy() {
return this.triggeredByPipelines.length > 0;
},
shouldRenderTriggeredPipeline() {
return !this.isLoading && !_.isEmpty(this.triggered);
}, },
shouldRenderTriggeredByPipeline() { triggeredPipelines() {
return !this.isLoading && !_.isEmpty(this.triggeredBy); return this.pipeline.triggered;
}, },
/** /**
* Calculates the margin top of the clicked downstream pipeline by * Calculates the margin top of the clicked downstream pipeline by
...@@ -56,6 +26,7 @@ export default { ...@@ -56,6 +26,7 @@ export default {
}, },
}, },
methods: { methods: {
// TODO FILIPA: REMOVE THIS
refreshTriggeredPipelineGraph() { refreshTriggeredPipelineGraph() {
this.$emit('refreshTriggeredPipelineGraph'); this.$emit('refreshTriggeredPipelineGraph');
}, },
......
import pipelinesKeys from 'ee/pipelines/constants'; import keys from '../constants';
export default { export default {
methods: { methods: {
...@@ -13,30 +13,19 @@ export default { ...@@ -13,30 +13,19 @@ export default {
* @param {String} resetStoreKey Store key for the visible pipeline that will need to be reset * @param {String} resetStoreKey Store key for the visible pipeline that will need to be reset
* @param {Object} pipeline The clicked pipeline * @param {Object} pipeline The clicked pipeline
*/ */
clickPipeline(method, storeKey, resetStoreKey, pipeline, pollKey) { clickPipeline(pipeline, method) {
debugger;
if (!pipeline.isExpanded) { if (!pipeline.isExpanded) {
this.mediator[method](pipeline); this.mediator.store[method](pipeline);
} else { } else {
this.mediator.resetPipeline(storeKey, pipeline, resetStoreKey, pollKey); this.mediator.store.closePipeline(pipeline);
} }
}, },
clickTriggered(triggered) { clickTriggeredByPipeline(pipeline) {
this.clickPipeline( this.clickPipeline(pipeline, 'openTriggeredByPipeline');
'fetchTriggeredPipeline',
pipelinesKeys.triggeredPipelines,
pipelinesKeys.triggered,
triggered,
'pollTriggered',
);
}, },
clickTriggeredBy(triggeredBy) { clickTriggeredPipeline(pipeline) {
this.clickPipeline( this.clickPipeline(pipeline, 'openTriggeredPipeline');
'fetchTriggeredByPipeline',
pipelinesKeys.triggeredByPipelines,
pipelinesKeys.triggeredBy,
triggeredBy,
'pollTriggeredBy',
);
}, },
}, },
}; };
{
"id": 23211253,
"user": {
"id": 3585,
"name": "Achilleas Pipinellis",
"username": "axil",
"state": "active",
"avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/3585/avatar.png",
"web_url": "https://gitlab.com/axil",
"status_tooltip_html": "\u003cspan class=\"user-status-emoji has-tooltip\" title=\"I like pizza\" data-html=\"true\" data-placement=\"top\"\u003e\u003cgl-emoji title=\"slice of pizza\" data-name=\"pizza\" data-unicode-version=\"6.0\"\u003e🍕\u003c/gl-emoji\u003e\u003c/span\u003e",
"path": "/axil"
},
"active": false,
"coverage": null,
"source": "push",
"created_at": "2018-06-05T11:31:30.452Z",
"updated_at": "2018-10-31T16:35:31.305Z",
"path": "/gitlab-org/gitlab-runner/pipelines/23211253",
"flags": {
"latest": false,
"stuck": false,
"auto_devops": false,
"merge_request": false,
"yaml_errors": false,
"retryable": false,
"cancelable": false,
"failure_reason": false
},
"details": {
"status": {
"icon": "status_success",
"text": "passed",
"label": "passed",
"group": "success",
"tooltip": "passed",
"has_details": true,
"details_path": "/gitlab-org/gitlab-runner/pipelines/23211253",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png"
},
"duration": 53,
"finished_at": "2018-10-31T16:35:31.299Z",
"stages": [
{
"name": "prebuild",
"title": "prebuild: passed",
"groups": [
{
"name": "review-docs-deploy",
"size": 1,
"status": {
"icon": "status_success",
"text": "passed",
"label": "manual play action",
"group": "success",
"tooltip": "passed",
"has_details": true,
"details_path": "/gitlab-org/gitlab-runner/-/jobs/72469032",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-org/gitlab-runner/-/jobs/72469032/play",
"method": "post",
"button_title": "Trigger this manual action"
}
},
"jobs": [
{
"id": 72469032,
"name": "review-docs-deploy",
"started": "2018-10-31T16:34:58.778Z",
"archived": false,
"build_path": "/gitlab-org/gitlab-runner/-/jobs/72469032",
"retry_path": "/gitlab-org/gitlab-runner/-/jobs/72469032/retry",
"play_path": "/gitlab-org/gitlab-runner/-/jobs/72469032/play",
"playable": true,
"scheduled": false,
"created_at": "2018-06-05T11:31:30.495Z",
"updated_at": "2018-10-31T16:35:31.251Z",
"status": {
"icon": "status_success",
"text": "passed",
"label": "manual play action",
"group": "success",
"tooltip": "passed",
"has_details": true,
"details_path": "/gitlab-org/gitlab-runner/-/jobs/72469032",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-org/gitlab-runner/-/jobs/72469032/play",
"method": "post",
"button_title": "Trigger this manual action"
}
}
}
]
}
],
"status": {
"icon": "status_success",
"text": "passed",
"label": "passed",
"group": "success",
"tooltip": "passed",
"has_details": true,
"details_path": "/gitlab-org/gitlab-runner/pipelines/23211253#prebuild",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png"
},
"path": "/gitlab-org/gitlab-runner/pipelines/23211253#prebuild",
"dropdown_path": "/gitlab-org/gitlab-runner/pipelines/23211253/stage.json?stage=prebuild"
},
{
"name": "test",
"title": "test: passed",
"groups": [
{
"name": "docs check links",
"size": 1,
"status": {
"icon": "status_success",
"text": "passed",
"label": "passed",
"group": "success",
"tooltip": "passed",
"has_details": true,
"details_path": "/gitlab-org/gitlab-runner/-/jobs/72469033",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job does not have a trace."
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png",
"action": {
"icon": "retry",
"title": "Retry",
"path": "/gitlab-org/gitlab-runner/-/jobs/72469033/retry",
"method": "post",
"button_title": "Retry this job"
}
},
"jobs": [
{
"id": 72469033,
"name": "docs check links",
"started": "2018-06-05T11:31:33.240Z",
"archived": false,
"build_path": "/gitlab-org/gitlab-runner/-/jobs/72469033",
"retry_path": "/gitlab-org/gitlab-runner/-/jobs/72469033/retry",
"playable": false,
"scheduled": false,
"created_at": "2018-06-05T11:31:30.627Z",
"updated_at": "2018-06-05T11:31:54.363Z",
"status": {
"icon": "status_success",
"text": "passed",
"label": "passed",
"group": "success",
"tooltip": "passed",
"has_details": true,
"details_path": "/gitlab-org/gitlab-runner/-/jobs/72469033",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job does not have a trace."
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png",
"action": {
"icon": "retry",
"title": "Retry",
"path": "/gitlab-org/gitlab-runner/-/jobs/72469033/retry",
"method": "post",
"button_title": "Retry this job"
}
}
}
]
}
],
"status": {
"icon": "status_success",
"text": "passed",
"label": "passed",
"group": "success",
"tooltip": "passed",
"has_details": true,
"details_path": "/gitlab-org/gitlab-runner/pipelines/23211253#test",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_success-8451333011eee8ce9f2ab25dc487fe24a8758c694827a582f17f42b0a90446a2.png"
},
"path": "/gitlab-org/gitlab-runner/pipelines/23211253#test",
"dropdown_path": "/gitlab-org/gitlab-runner/pipelines/23211253/stage.json?stage=test"
},
{
"name": "cleanup",
"title": "cleanup: skipped",
"groups": [
{
"name": "review-docs-cleanup",
"size": 1,
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual stop action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-org/gitlab-runner/-/jobs/72469034",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "stop",
"title": "Stop",
"path": "/gitlab-org/gitlab-runner/-/jobs/72469034/play",
"method": "post",
"button_title": "Stop this environment"
}
},
"jobs": [
{
"id": 72469034,
"name": "review-docs-cleanup",
"started": null,
"archived": false,
"build_path": "/gitlab-org/gitlab-runner/-/jobs/72469034",
"play_path": "/gitlab-org/gitlab-runner/-/jobs/72469034/play",
"playable": true,
"scheduled": false,
"created_at": "2018-06-05T11:31:30.760Z",
"updated_at": "2018-06-05T11:31:56.037Z",
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual stop action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-org/gitlab-runner/-/jobs/72469034",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "stop",
"title": "Stop",
"path": "/gitlab-org/gitlab-runner/-/jobs/72469034/play",
"method": "post",
"button_title": "Stop this environment"
}
}
}
]
}
],
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-org/gitlab-runner/pipelines/23211253#cleanup",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"path": "/gitlab-org/gitlab-runner/pipelines/23211253#cleanup",
"dropdown_path": "/gitlab-org/gitlab-runner/pipelines/23211253/stage.json?stage=cleanup"
}
],
"artifacts": [],
"manual_actions": [
{
"name": "review-docs-cleanup",
"path": "/gitlab-org/gitlab-runner/-/jobs/72469034/play",
"playable": true,
"scheduled": false
},
{
"name": "review-docs-deploy",
"path": "/gitlab-org/gitlab-runner/-/jobs/72469032/play",
"playable": true,
"scheduled": false
}
],
"scheduled_actions": []
},
"ref": {
"name": "docs/add-development-guide-to-readme",
"path": "/gitlab-org/gitlab-runner/commits/docs/add-development-guide-to-readme",
"tag": false,
"branch": true,
"merge_request": false
},
"commit": {
"id": "8083eb0a920572214d0dccedd7981f05d535ad46",
"short_id": "8083eb0a",
"title": "Add link to development guide in readme",
"created_at": "2018-06-05T11:30:48.000Z",
"parent_ids": [
"1d7cf79b5a1a2121b9474ac20d61c1b8f621289d"
],
"message": "Add link to development guide in readme\n\nCloses https://gitlab.com/gitlab-org/gitlab-runner/issues/3122\n",
"author_name": "Achilleas Pipinellis",
"author_email": "axil@gitlab.com",
"authored_date": "2018-06-05T11:30:48.000Z",
"committer_name": "Achilleas Pipinellis",
"committer_email": "axil@gitlab.com",
"committed_date": "2018-06-05T11:30:48.000Z",
"author": {
"id": 3585,
"name": "Achilleas Pipinellis",
"username": "axil",
"state": "active",
"avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/3585/avatar.png",
"web_url": "https://gitlab.com/axil",
"status_tooltip_html": null,
"path": "/axil"
},
"author_gravatar_url": "https://secure.gravatar.com/avatar/1d37af00eec153a8333a4ce18e9aea41?s=80\u0026d=identicon",
"commit_url": "https://gitlab.com/gitlab-org/gitlab-runner/commit/8083eb0a920572214d0dccedd7981f05d535ad46",
"commit_path": "/gitlab-org/gitlab-runner/commit/8083eb0a920572214d0dccedd7981f05d535ad46"
},
"triggered_by": {
"id": 34993231051,
"user": {
"id": 376774,
"name": "Alessio Caiazza",
"username": "nolith",
"state": "active",
"avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/376774/avatar.png",
"web_url": "https://gitlab.com/nolith",
"status_tooltip_html": null,
"path": "/nolith"
},
"active": false,
"coverage": null,
"source": "pipeline",
"path": "/gitlab-com/gitlab-docs/pipelines/34993051",
"details": {
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png"
},
"duration": 118,
"finished_at": "2018-10-31T16:41:40.615Z",
"stages": [
{
"name": "build-images",
"title": "build-images: skipped",
"groups": [
{
"name": "image:bootstrap",
"size": 1,
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982853",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"method": "post",
"button_title": "Trigger this manual action"
}
},
"jobs": [
{
"id": 11421321982853,
"name": "image:bootstrap",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982853",
"play_path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"playable": true,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.704Z",
"updated_at": "2018-10-31T16:35:24.118Z",
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982853",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"method": "post",
"button_title": "Trigger this manual action"
}
}
}
]
},
{
"name": "image:builder-onbuild",
"size": 1,
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982854",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"method": "post",
"button_title": "Trigger this manual action"
}
},
"jobs": [
{
"id": 1149822131854,
"name": "image:builder-onbuild",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982854",
"play_path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"playable": true,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.728Z",
"updated_at": "2018-10-31T16:35:24.070Z",
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982854",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"method": "post",
"button_title": "Trigger this manual action"
}
}
}
]
},
{
"name": "image:nginx-onbuild",
"size": 1,
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982855",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"method": "post",
"button_title": "Trigger this manual action"
}
},
"jobs": [
{
"id": 11498285523424,
"name": "image:nginx-onbuild",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982855",
"play_path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"playable": true,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.753Z",
"updated_at": "2018-10-31T16:35:24.033Z",
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982855",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"method": "post",
"button_title": "Trigger this manual action"
}
}
}
]
}
],
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051#build-images",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"path": "/gitlab-com/gitlab-docs/pipelines/34993051#build-images",
"dropdown_path": "/gitlab-com/gitlab-docs/pipelines/34993051/stage.json?stage=build-images"
},
{
"name": "build",
"title": "build: failed",
"groups": [
{
"name": "compile_dev",
"size": 1,
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed - (script failure)",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114984694",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job does not have a trace."
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png",
"action": {
"icon": "retry",
"title": "Retry",
"path": "/gitlab-com/gitlab-docs/-/jobs/114984694/retry",
"method": "post",
"button_title": "Retry this job"
}
},
"jobs": [
{
"id": 1149846949786,
"name": "compile_dev",
"started": "2018-10-31T16:39:41.598Z",
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114984694",
"retry_path": "/gitlab-com/gitlab-docs/-/jobs/114984694/retry",
"playable": false,
"scheduled": false,
"created_at": "2018-10-31T16:39:41.138Z",
"updated_at": "2018-10-31T16:41:40.072Z",
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed - (script failure)",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114984694",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job does not have a trace."
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png",
"action": {
"icon": "retry",
"title": "Retry",
"path": "/gitlab-com/gitlab-docs/-/jobs/114984694/retry",
"method": "post",
"button_title": "Retry this job"
}
},
"recoverable": false
}
]
}
],
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051#build",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png"
},
"path": "/gitlab-com/gitlab-docs/pipelines/34993051#build",
"dropdown_path": "/gitlab-com/gitlab-docs/pipelines/34993051/stage.json?stage=build"
},
{
"name": "deploy",
"title": "deploy: skipped",
"groups": [
{
"name": "review",
"size": 1,
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982857",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"jobs": [
{
"id": 11498282342357,
"name": "review",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982857",
"playable": false,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.805Z",
"updated_at": "2018-10-31T16:41:40.569Z",
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982857",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
}
}
]
},
{
"name": "review_stop",
"size": 1,
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982858",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"jobs": [
{
"id": 114982858,
"name": "review_stop",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982858",
"playable": false,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.840Z",
"updated_at": "2018-10-31T16:41:40.480Z",
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982858",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
}
}
]
}
],
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051#deploy",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"path": "/gitlab-com/gitlab-docs/pipelines/34993051#deploy",
"dropdown_path": "/gitlab-com/gitlab-docs/pipelines/34993051/stage.json?stage=deploy"
}
],
"artifacts": [],
"manual_actions": [
{
"name": "image:bootstrap",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"playable": true,
"scheduled": false
},
{
"name": "image:builder-onbuild",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"playable": true,
"scheduled": false
},
{
"name": "image:nginx-onbuild",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"playable": true,
"scheduled": false
},
{
"name": "review_stop",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982858/play",
"playable": false,
"scheduled": false
}
],
"scheduled_actions": []
},
"project": {
"id": 1794617,
"name": "GitLab Docs",
"full_path": "/gitlab-com/gitlab-docs",
"full_name": "GitLab.com / GitLab Docs"
}
},
"triggered": [
{
"id": 34993051,
"user": {
"id": 376774,
"name": "Alessio Caiazza",
"username": "nolith",
"state": "active",
"avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/376774/avatar.png",
"web_url": "https://gitlab.com/nolith",
"status_tooltip_html": null,
"path": "/nolith"
},
"active": false,
"coverage": null,
"source": "pipeline",
"path": "/gitlab-com/gitlab-docs/pipelines/34993051",
"details": {
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png"
},
"duration": 118,
"finished_at": "2018-10-31T16:41:40.615Z",
"stages": [
{
"name": "build-images",
"title": "build-images: skipped",
"groups": [
{
"name": "image:bootstrap",
"size": 1,
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982853",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"method": "post",
"button_title": "Trigger this manual action"
}
},
"jobs": [
{
"id": 114982853,
"name": "image:bootstrap",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982853",
"play_path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"playable": true,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.704Z",
"updated_at": "2018-10-31T16:35:24.118Z",
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982853",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"method": "post",
"button_title": "Trigger this manual action"
}
}
}
]
},
{
"name": "image:builder-onbuild",
"size": 1,
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982854",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"method": "post",
"button_title": "Trigger this manual action"
}
},
"jobs": [
{
"id": 114982854,
"name": "image:builder-onbuild",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982854",
"play_path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"playable": true,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.728Z",
"updated_at": "2018-10-31T16:35:24.070Z",
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982854",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"method": "post",
"button_title": "Trigger this manual action"
}
}
}
]
},
{
"name": "image:nginx-onbuild",
"size": 1,
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982855",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"method": "post",
"button_title": "Trigger this manual action"
}
},
"jobs": [
{
"id": 114982855,
"name": "image:nginx-onbuild",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982855",
"play_path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"playable": true,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.753Z",
"updated_at": "2018-10-31T16:35:24.033Z",
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982855",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"method": "post",
"button_title": "Trigger this manual action"
}
}
}
]
}
],
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051#build-images",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"path": "/gitlab-com/gitlab-docs/pipelines/34993051#build-images",
"dropdown_path": "/gitlab-com/gitlab-docs/pipelines/34993051/stage.json?stage=build-images"
},
{
"name": "build",
"title": "build: failed",
"groups": [
{
"name": "compile_dev",
"size": 1,
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed - (script failure)",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114984694",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job does not have a trace."
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png",
"action": {
"icon": "retry",
"title": "Retry",
"path": "/gitlab-com/gitlab-docs/-/jobs/114984694/retry",
"method": "post",
"button_title": "Retry this job"
}
},
"jobs": [
{
"id": 114984694,
"name": "compile_dev",
"started": "2018-10-31T16:39:41.598Z",
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114984694",
"retry_path": "/gitlab-com/gitlab-docs/-/jobs/114984694/retry",
"playable": false,
"scheduled": false,
"created_at": "2018-10-31T16:39:41.138Z",
"updated_at": "2018-10-31T16:41:40.072Z",
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed - (script failure)",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114984694",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job does not have a trace."
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png",
"action": {
"icon": "retry",
"title": "Retry",
"path": "/gitlab-com/gitlab-docs/-/jobs/114984694/retry",
"method": "post",
"button_title": "Retry this job"
}
},
"recoverable": false
}
]
}
],
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051#build",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png"
},
"path": "/gitlab-com/gitlab-docs/pipelines/34993051#build",
"dropdown_path": "/gitlab-com/gitlab-docs/pipelines/34993051/stage.json?stage=build"
},
{
"name": "deploy",
"title": "deploy: skipped",
"groups": [
{
"name": "review",
"size": 1,
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982857",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"jobs": [
{
"id": 114982857,
"name": "review",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982857",
"playable": false,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.805Z",
"updated_at": "2018-10-31T16:41:40.569Z",
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982857",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
}
}
]
},
{
"name": "review_stop",
"size": 1,
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982858",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"jobs": [
{
"id": 114982858,
"name": "review_stop",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982858",
"playable": false,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.840Z",
"updated_at": "2018-10-31T16:41:40.480Z",
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982858",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
}
}
]
}
],
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051#deploy",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"path": "/gitlab-com/gitlab-docs/pipelines/34993051#deploy",
"dropdown_path": "/gitlab-com/gitlab-docs/pipelines/34993051/stage.json?stage=deploy"
}
],
"artifacts": [],
"manual_actions": [
{
"name": "image:bootstrap",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"playable": true,
"scheduled": false
},
{
"name": "image:builder-onbuild",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"playable": true,
"scheduled": false
},
{
"name": "image:nginx-onbuild",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"playable": true,
"scheduled": false
},
{
"name": "review_stop",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982858/play",
"playable": false,
"scheduled": false
}
],
"scheduled_actions": []
},
"project": {
"id": 1794617,
"name": "GitLab Docs",
"full_path": "/gitlab-com/gitlab-docs",
"full_name": "GitLab.com / GitLab Docs"
}
},
{
"id": 34993052,
"user": {
"id": 376774,
"name": "Alessio Caiazza",
"username": "nolith",
"state": "active",
"avatar_url": "https://assets.gitlab-static.net/uploads/-/system/user/avatar/376774/avatar.png",
"web_url": "https://gitlab.com/nolith",
"status_tooltip_html": null,
"path": "/nolith"
},
"active": false,
"coverage": null,
"source": "pipeline",
"path": "/gitlab-com/gitlab-docs/pipelines/34993051",
"details": {
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png"
},
"duration": 118,
"finished_at": "2018-10-31T16:41:40.615Z",
"stages": [
{
"name": "build-images",
"title": "build-images: skipped",
"groups": [
{
"name": "image:bootstrap",
"size": 1,
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982853",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"method": "post",
"button_title": "Trigger this manual action"
}
},
"jobs": [
{
"id": 114982853,
"name": "image:bootstrap",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982853",
"play_path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"playable": true,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.704Z",
"updated_at": "2018-10-31T16:35:24.118Z",
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982853",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"method": "post",
"button_title": "Trigger this manual action"
}
}
}
]
},
{
"name": "image:builder-onbuild",
"size": 1,
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982854",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"method": "post",
"button_title": "Trigger this manual action"
}
},
"jobs": [
{
"id": 114982854,
"name": "image:builder-onbuild",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982854",
"play_path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"playable": true,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.728Z",
"updated_at": "2018-10-31T16:35:24.070Z",
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982854",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"method": "post",
"button_title": "Trigger this manual action"
}
}
}
]
},
{
"name": "image:nginx-onbuild",
"size": 1,
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982855",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"method": "post",
"button_title": "Trigger this manual action"
}
},
"jobs": [
{
"id": 1224982855,
"name": "image:nginx-onbuild",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982855",
"play_path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"playable": true,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.753Z",
"updated_at": "2018-10-31T16:35:24.033Z",
"status": {
"icon": "status_manual",
"text": "manual",
"label": "manual play action",
"group": "manual",
"tooltip": "manual action",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982855",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/manual_action-2b4ca0d1bcfd92aebf33d484e36cbf7a102d007f76b5a0cfea636033a629d601.svg",
"size": "svg-394",
"title": "This job requires a manual action",
"content": "This job depends on a user to trigger its process. Often they are used to deploy code to production environments"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_manual-829a0804612cef47d9efc1618dba38325483657c847dba0546c3b9f0295bb36c.png",
"action": {
"icon": "play",
"title": "Play",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"method": "post",
"button_title": "Trigger this manual action"
}
}
}
]
}
],
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051#build-images",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"path": "/gitlab-com/gitlab-docs/pipelines/34993051#build-images",
"dropdown_path": "/gitlab-com/gitlab-docs/pipelines/34993051/stage.json?stage=build-images"
},
{
"name": "build",
"title": "build: failed",
"groups": [
{
"name": "compile_dev",
"size": 1,
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed - (script failure)",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114984694",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job does not have a trace."
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png",
"action": {
"icon": "retry",
"title": "Retry",
"path": "/gitlab-com/gitlab-docs/-/jobs/114984694/retry",
"method": "post",
"button_title": "Retry this job"
}
},
"jobs": [
{
"id": 1123984694,
"name": "compile_dev",
"started": "2018-10-31T16:39:41.598Z",
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114984694",
"retry_path": "/gitlab-com/gitlab-docs/-/jobs/114984694/retry",
"playable": false,
"scheduled": false,
"created_at": "2018-10-31T16:39:41.138Z",
"updated_at": "2018-10-31T16:41:40.072Z",
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed - (script failure)",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114984694",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job does not have a trace."
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png",
"action": {
"icon": "retry",
"title": "Retry",
"path": "/gitlab-com/gitlab-docs/-/jobs/114984694/retry",
"method": "post",
"button_title": "Retry this job"
}
},
"recoverable": false
}
]
}
],
"status": {
"icon": "status_failed",
"text": "failed",
"label": "failed",
"group": "failed",
"tooltip": "failed",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051#build",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_failed-41304d7f7e3828808b0c26771f0309e55296819a9beea3ea9fbf6689d9857c12.png"
},
"path": "/gitlab-com/gitlab-docs/pipelines/34993051#build",
"dropdown_path": "/gitlab-com/gitlab-docs/pipelines/34993051/stage.json?stage=build"
},
{
"name": "deploy",
"title": "deploy: skipped",
"groups": [
{
"name": "review",
"size": 1,
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982857",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"jobs": [
{
"id": 1143232982857,
"name": "review",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982857",
"playable": false,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.805Z",
"updated_at": "2018-10-31T16:41:40.569Z",
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982857",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
}
}
]
},
{
"name": "review_stop",
"size": 1,
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982858",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"jobs": [
{
"id": 114921313182858,
"name": "review_stop",
"started": null,
"archived": false,
"build_path": "/gitlab-com/gitlab-docs/-/jobs/114982858",
"playable": false,
"scheduled": false,
"created_at": "2018-10-31T16:35:23.840Z",
"updated_at": "2018-10-31T16:41:40.480Z",
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/-/jobs/114982858",
"illustration": {
"image": "https://assets.gitlab-static.net/assets/illustrations/skipped-job_empty-8b877955fbf175e42ae65b6cb95346e15282c6fc5b682756c329af3a0055225e.svg",
"size": "svg-430",
"title": "This job has been skipped"
},
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
}
}
]
}
],
"status": {
"icon": "status_skipped",
"text": "skipped",
"label": "skipped",
"group": "skipped",
"tooltip": "skipped",
"has_details": true,
"details_path": "/gitlab-com/gitlab-docs/pipelines/34993051#deploy",
"illustration": null,
"favicon": "https://gitlab.com/assets/ci_favicons/favicon_status_skipped-0b9c5e543588945e8c4ca57786bbf2d0c56631959c9f853300392d0315be829b.png"
},
"path": "/gitlab-com/gitlab-docs/pipelines/34993051#deploy",
"dropdown_path": "/gitlab-com/gitlab-docs/pipelines/34993051/stage.json?stage=deploy"
}
],
"artifacts": [],
"manual_actions": [
{
"name": "image:bootstrap",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982853/play",
"playable": true,
"scheduled": false
},
{
"name": "image:builder-onbuild",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982854/play",
"playable": true,
"scheduled": false
},
{
"name": "image:nginx-onbuild",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982855/play",
"playable": true,
"scheduled": false
},
{
"name": "review_stop",
"path": "/gitlab-com/gitlab-docs/-/jobs/114982858/play",
"playable": false,
"scheduled": false
}
],
"scheduled_actions": []
},
"project": {
"id": 1794617,
"name": "GitLab Docs",
"full_path": "/gitlab-com/gitlab-docs",
"full_name": "GitLab.com / GitLab Docs"
}
}
]
}
\ No newline at end of file
import CePipelineMediator from '~/pipelines/pipeline_details_mediator';
import createFlash from '~/flash';
import Poll from '~/lib/utils/poll';
import { __ } from '~/locale';
import PipelineService from 'ee/pipelines/services/pipeline_service';
/**
* Extends CE mediator with the logic to handle the upstream/downstream pipelines
*/
export default class EePipelineMediator extends CePipelineMediator {
/**
* Requests the clicked downstream pipeline pipeline
*
* @param {Object} pipeline
*/
fetchTriggeredPipeline(pipeline) {
if (this.pollTriggered) {
this.pollTriggered.stop();
this.pollTriggered = null;
}
this.store.requestTriggeredPipeline(pipeline);
this.pollTriggered = new Poll({
resource: PipelineService,
method: 'getUpstreamDownstream',
data: pipeline.path,
successCallback: ({ data }) => this.store.receiveTriggeredPipelineSuccess(pipeline, data),
errorCallback: () => {
this.store.receiveTriggeredPipelineError(pipeline);
createFlash(
__('An error occured while fetching this downstream pipeline. Please try again'),
);
},
});
this.pollTriggered.makeRequest();
}
refreshTriggeredPipelineGraph() {
this.pollTriggered.stop();
this.pollTriggered.restart();
}
/**
* Requests the clicked upstream pipeline pipeline
* @param {*} pipeline
*/
fetchTriggeredByPipeline(pipeline) {
if (this.pollTriggeredBy) {
this.pollTriggeredBy.stop();
this.pollTriggeredBy = null;
}
this.store.requestTriggeredByPipeline(pipeline);
this.pollTriggeredBy = new Poll({
resource: PipelineService,
method: 'getUpstreamDownstream',
data: pipeline.path,
successCallback: ({ data }) => this.store.receiveTriggeredByPipelineSuccess(pipeline, data),
errorCallback: () => {
this.store.receiveTriggeredByPipelineError(pipeline);
createFlash(__('An error occured while fetching this upstream pipeline. Please try again'));
},
});
this.pollTriggeredBy.makeRequest();
}
refreshTriggeredByPipelineGraph() {
this.pollTriggeredBy.stop();
this.pollTriggeredBy.restart();
}
resetPipeline(storeKey, pipeline, resetStoreKey, pollKey) {
this[pollKey].stop();
this.store.closePipeline(storeKey, pipeline, resetStoreKey);
}
}
import axios from '~/lib/utils/axios_utils';
import CePipelineService from '~/pipelines/services/pipeline_service';
export default class PipelineStore extends CePipelineService {
static getUpstreamDownstream(endpoint) {
return axios.get(`${endpoint}.json`);
}
}
import CePipelineStore from '~/pipelines/stores/pipeline_store'; import CePipelineStore from '~/pipelines/stores/pipeline_store';
import pipelinesKeys from '../constants'; import data from '../mock.json';
import Vue from 'vue';
/** /**
* Extends CE store with the logic to handle the upstream/downstream pipelines * Extends CE store with the logic to handle the upstream/downstream pipelines
...@@ -7,18 +8,6 @@ import pipelinesKeys from '../constants'; ...@@ -7,18 +8,6 @@ import pipelinesKeys from '../constants';
export default class PipelineStore extends CePipelineStore { export default class PipelineStore extends CePipelineStore {
constructor() { constructor() {
super(); super();
// Stores the dowsntream collapsed pipelines
// with basic info sent in the main request
this.state.triggeredPipelines = [];
// Stores the upstream collapsed pipelines
// with basic info sent in the main request
this.state.triggeredByPipelines = [];
// Visible downstream pipeline
this.state.triggered = {};
// Visible upstream pipeline
this.state.triggeredBy = {};
} }
/** /**
...@@ -30,218 +19,114 @@ export default class PipelineStore extends CePipelineStore { ...@@ -30,218 +19,114 @@ export default class PipelineStore extends CePipelineStore {
* @param {Object} pipeline * @param {Object} pipeline
*/ */
storePipeline(pipeline = {}) { storePipeline(pipeline = {}) {
pipeline = Object.assign({}, data);
super.storePipeline(pipeline); super.storePipeline(pipeline);
if (pipeline.triggered && pipeline.triggered.length) { if (pipeline.triggered_by) {
this.state.triggeredPipelines = pipeline.triggered.map(triggered => { this.state.pipeline.triggered_by = [pipeline.triggered_by];
// because we are polling we need to make sure we do not hijack user's clicks. this.parseTriggeredByPipelines(this.state.pipeline, pipeline.triggered_by);
const oldPipeline = this.state.triggeredPipelines.find(
oldValue => oldValue.id === triggered.id,
);
return Object.assign({}, triggered, {
isExpanded: oldPipeline ? oldPipeline.isExpanded : false,
isLoading: oldPipeline ? oldPipeline.isLoading : false,
});
});
} }
if (pipeline.triggered_by) { if (pipeline.triggered && pipeline.triggered.length) {
this.state.triggeredByPipelines = [ this.state.triggeredPipelines = pipeline.triggered.map(triggered =>
Object.assign({}, pipeline.triggered_by, { this.parseTriggeredPipelines(this.state.pipeline, triggered),
isExpanded: this.state.triggeredByPipelines.length );
? this.state.triggeredByPipelines[0].isExpanded
: false,
isLoading: this.state.triggeredByPipelines.length
? this.state.triggeredByPipelines[0].isLoading
: false,
}),
];
} }
} }
//
// Downstream pipeline's methods
//
/** /**
* Called when the user clicks on a pipeline that was triggered by the main one. * Recursiverly parses the triggered by pipelines.
* *
* Resets isExpanded and isLoading props for all triggered (downstream) pipelines * Sets triggered_by as an array, there is always only 1 triggered_by pipeline.
* Sets isLoading to true for the requested one. * Adds key `isExpanding`
* Keeps old isExpading value due to polling
* *
* @param {Array} parentPipeline
* @param {Object} pipeline * @param {Object} pipeline
*/ */
requestTriggeredPipeline(pipeline) { parseTriggeredByPipelines(parentPipeline, pipeline) {
this.updateStoreOnRequest(pipelinesKeys.triggeredPipelines, pipeline); // keep old value in case it's opened because we're polling
} Vue.set(pipeline, 'isExpanded', pipeline.isExpanded || false);
/** if (pipeline.triggered_by) {
* Called when we receive success callback for the downstream pipeline requested. pipeline.triggered_by = [pipeline.triggered_by];
* this.parseTriggeredByPipelines(pipeline, pipeline.triggered_by);
* Updates loading state for the request pipeline }
* Updates the visible pipeline with the response
*
* @param {Object} pipeline
* @param {Object} response
*/
receiveTriggeredPipelineSuccess(pipeline, response) {
this.updatePipeline(
pipelinesKeys.triggeredPipelines,
pipeline,
{ isLoading: false, isExpanded: true },
pipelinesKeys.triggered,
response,
);
} }
/** /**
* Called when we receive an error callback for the downstream pipeline requested * Recursively parses the triggered pipelines
* Resets the loading state + collpased state * @param {Array} parentPipeline
* Resets triggered pipeline
*
* @param {Object} pipeline * @param {Object} pipeline
*/ */
receiveTriggeredPipelineError(pipeline) { parseTriggeredPipelines(parentPipeline, pipeline) {
this.updatePipeline( // keep old value in case it's opened because we're polling
pipelinesKeys.triggeredPipelines, Vue.set(pipeline, 'isExpanded', pipeline.isExpanded || false);
pipeline,
{ isLoading: false, isExpanded: false },
pipelinesKeys.triggered,
{},
);
}
// if (pipeline.triggered && pipeline.triggered.length > 0) {
// Upstream pipeline's methods pipeline.triggered.forEach(el => this.parseTriggeredPipelines(el));
// }
}
/** /**
* Called when the user clicks on the pipeline that triggered the main one. * Recursively resets all triggered by pipelines
* *
* Handle the request for the upstream pipeline
* Updates the given pipeline with isLoading: true and isExpanded: true
* *
* @param {Object} pipeline * @param {Object} pipeline
*/ */
requestTriggeredByPipeline(pipeline) { resetTriggeredByPipeline(pipeline) {
this.updateStoreOnRequest(pipelinesKeys.triggeredByPipelines, pipeline); this.closePipeline(pipeline);
}
/** if (pipeline.triggered_by && pipeline.triggered_by) {
* Success callback for the upstream pipeline received this.resetTriggeredByPipeline(pipeline.triggered_by);
* }
* @param {Object} pipeline
* @param {Object} response
*/
receiveTriggeredByPipelineSuccess(pipeline, response) {
this.updatePipeline(
pipelinesKeys.triggeredByPipelines,
pipeline,
{ isLoading: false, isExpanded: true },
pipelinesKeys.triggeredBy,
response,
);
} }
/** /**
* Error callback for the upstream callback * Opens the clicked pipeline and closes all other ones.
* @param {Object} pipeline * @param {Object} pipeline
*/ */
receiveTriggeredByPipelineError(pipeline) { openTriggeredByPipeline(pipeline) {
this.updatePipeline( // first we need to reset all triggeredBy pipelines
pipelinesKeys.triggeredByPipelines, this.resetTriggeredByPipeline(pipeline);
pipeline,
{ isLoading: false, isExpanded: false },
pipelinesKeys.triggeredBy,
{},
);
}
// this.openPipeline(pipeline);
// Common utils between upstream & dowsntream pipelines }
//
/** /**
* Adds isLoading and isCollpased keys to the given pipeline * Closes the given pipeline
*
* Used to know when to render the spinning icon
* and the blue background when the pipeline is expanded.
*
* @param {Object} pipeline * @param {Object} pipeline
* @returns {Object}
*/ */
static parsePipeline(pipeline) { closePipeline(pipeline) {
return Object.assign({}, pipeline, { Vue.set(pipeline, 'isExpanded', false);
isExpanded: false,
isLoading: false,
});
} }
/** /**
* Returns the index of the upstream/downstream that matches the given ID * Closes the given pipeline
*
* @param {Object} pipeline * @param {Object} pipeline
* @returns {Number}
*/ */
getPipelineIndex(storeKey, pipelineId) { openPipeline(pipeline) {
return this.state[storeKey].findIndex(triggered => triggered.id === pipelineId); Vue.set(pipeline, 'isExpanded', true);
} }
/** /**
* Updates the pipelines to reflect which one was requested. * Opens the clicked triggered pipeline and closes all other ones.
* It sets isLoading to true and isExpanded to false
* *
* @param {String} storeKey which property to update: `triggeredPipelines|triggeredByPipelines` * @param {Object} pipeline
* @param {Object} pipeline the requested pipeline
*/ */
updateStoreOnRequest(storeKey, pipeline) { openTriggeredPipeline(pipeline) {
this.state[storeKey] = this.state[storeKey].map(triggered => { this.resetTriggeredPipelines(pipeline);
if (triggered.id === pipeline.id) { this.openPipeline(pipeline);
return Object.assign({}, triggered, { isLoading: true, isExpanded: true });
}
// reset the others, in case another was one opened
return PipelineStore.parsePipeline(triggered);
});
} }
/** /**
* Updates a single pipeline with the new props and the visible pipeline * Recursively closes all triggered pipelines for the given one.
* Used for success and error callbacks for both upstream and downstream requests.
* *
* @param {String} storeKey Which array needs to be updated: `triggeredPipelines|triggeredByPipelines` * @param {Object} pipeline
* @param {Object} pipeline Which pipeline should be updated
* @param {Object} props The new properties to be updated for the given pipeline
* @param {String} visiblePipelineKey Which visible pipeline needs to be updated: `triggered|triggeredBy`
* @param {Object} visiblePipeline The new visible pipeline value
*/ */
updatePipeline(storeKey, pipeline, props, visiblePipelineKey, visiblePipeline = {}) { resetTriggeredPipelines(pipeline) {
this.state[storeKey].splice( this.closePipeline(pipeline);
this.getPipelineIndex(storeKey, pipeline.id),
1,
Object.assign({}, pipeline, props),
);
this.state[visiblePipelineKey] = visiblePipeline;
}
/** if (pipeline.triggered && pipeline.triggered.length) {
* When the user clicks on a non collapsed pipeline we need to close it pipeline.triggered.forEach(el => this.resetTriggeredPipelines(el));
* }
* @param {String} storeKey Which array needs to be updated: `triggeredPipelines|triggeredByPipelines`
* @param {Object} pipeline Which pipeline should be updated
* @param {String} visiblePipelineKey Which visible pipeline needs to be updated: `triggered|triggeredBy`
*/
closePipeline(storeKey, pipeline, visiblePipelineKey) {
this.updatePipeline(
storeKey,
pipeline,
{
isLoading: false,
isExpanded: false,
},
visiblePipelineKey,
{},
);
} }
} }
...@@ -150,89 +150,4 @@ describe('EE Pipeline store', () => { ...@@ -150,89 +150,4 @@ describe('EE Pipeline store', () => {
}); });
}); });
}); });
describe('utils', () => {
describe('parsePipeline', () => {
let parsed;
beforeAll(() => {
parsed = PipelineStore.parsePipeline(pipeline);
});
it('adds isLoading key set to false', () => {
expect(parsed.isLoading).toEqual(false);
});
it('adds isExpanded key set to false', () => {
expect(parsed.isExpanded).toEqual(false);
});
});
describe('getPipelineIndex', () => {
beforeAll(() => {
store.storePipeline(pipelineWithBoth);
});
it('returns the pipeline index for the provided pipeline and storeKey', () => {
store.getPipelineIndex('triggeredPipelines', store.triggeredPipelines[1]).toEqual(1);
});
});
describe('updateStoreOnRequest', () => {
beforeAll(() => {
store.storePipeline(pipelineWithBoth);
});
it('sets clicked pipeline isLoading to true', () => {
store.updateStoreOnRequest('triggeredPipelines', store.triggeredPipelines[1]);
expect(store.triggeredPipelines[1].isLoading).isLoading(true);
});
it('sets clicked pipeline isExpanded to true', () => {
store.updateStoreOnRequest('triggeredPipelines', store.triggeredPipelines[1]);
expect(store.triggeredPipelines[1].isExpanded).isLoading(true);
});
});
describe('updatePipeline', () => {
beforeAll(() => {
store.storePipeline(pipelineWithBoth);
store.updatePipeline(
'triggeredPipelines',
store.triggeredPipelines[1],
{ isLoading: true },
'triggered',
store.triggeredPipelines[1],
);
});
it('updates the given pipeline in the correct array', () => {
expect(store.triggeredPipelines[1].isLoading).toEqual(true);
expect(store.triggered).toEqual(store.triggeredPipelines[1]);
});
it('updates the visible pipeline to the given value', () => {});
});
describe('closePipeline', () => {
beforeAll(() => {
store.storePipeline(pipelineWithBoth);
});
it('closes the given pipeline', () => {
const clickedPipeline = store.triggeredPipelines[1];
// open it first
clickedPipeline.isExpanded = true;
store.triggered = clickedPipeline;
store.closePipeline('triggeredPipelines', clickedPipeline, 'triggered');
expect(store.triggeredPipelines[1].isExpanded).toEqual(true);
expect(store.triggered).toEqual({});
});
});
});
}); });
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment