diff --git a/frontend/packages/pipelines-plugin/integration-tests/features/pipelines/pipelines-runs.feature b/frontend/packages/pipelines-plugin/integration-tests/features/pipelines/pipelines-runs.feature index 6dfcc3d7ab0..9ed05e2fc7d 100644 --- a/frontend/packages/pipelines-plugin/integration-tests/features/pipelines/pipelines-runs.feature +++ b/frontend/packages/pipelines-plugin/integration-tests/features/pipelines/pipelines-runs.feature @@ -374,3 +374,16 @@ Feature: Pipeline Runs When user starts the pipeline "pipeline-stop" in Pipeline Details page And user selects option "Stop" from Actions menu drop down Then status displays as "Cancelled" in pipeline run details page + + @regression @odc-7420 + Scenario: SBOM information on the pipelineRun detail page: P-07-TC36 + Given user has created a pipelineRun with sbom task "pipelinerun-with-sbom-link" + When user navigates to PipelineRun Details page "pipelinerun-with-sbom-link" + Then user can see Download SBOM and View SBOM section in PipelineRun details page + + + @regression @odc-7423 + Scenario: Output of the pipelinerun: P-07-TC37 + Given user has created a pipelineRun with sbom task "pipelinerun-with-sbom-link" + When user navigates to output tab of pipelineRun details page "pipelinerun-with-sbom-link" + Then user can see the results in the output tab \ No newline at end of file diff --git a/frontend/packages/pipelines-plugin/integration-tests/support/page-objects/pipelines-po.ts b/frontend/packages/pipelines-plugin/integration-tests/support/page-objects/pipelines-po.ts index 37af4f05571..21e48289cb5 100644 --- a/frontend/packages/pipelines-plugin/integration-tests/support/page-objects/pipelines-po.ts +++ b/frontend/packages/pipelines-plugin/integration-tests/support/page-objects/pipelines-po.ts @@ -187,6 +187,7 @@ export const pipelineRunDetailsPO = { detailsTab: '[data-test-id$="Details"]', taskRunsTab: '[data-test-id="horizontal-link-TaskRuns"]', parametersTab: '[data-test-id="horizontal-link-Parameters"]', + outputTab: '[data-test-id="horizontal-link-Output"]', pipelineRunsResults: '[data-test-section-heading="PipelineRun results"]', eventsTab: '[data-test-id$="Events"]', pipelineRunStatus: '[data-test="resource-status"]', @@ -194,8 +195,11 @@ export const pipelineRunDetailsPO = { details: { pipelineLink: '[data-test-id="git-pipeline-events"]', sectionTitle: '[data-test-section-heading="PipelineRun details"]', + outputTitle: '[data-test-section-heading="PipelineRun results"]', pipelineRunDetails: 'div dl', workspacesSection: '[data-test-id="workspace-resources-section"]', + viewSbomLink: '[data-test="view-sbom"]', + downloadSbomLink: '[data-test="download-sbom"]', workspacesResources: { volumeClaimTemplateResources: '[data-test-id="volumeClaimTemplate-resources-section"]', emptyDirectory: '[data-test-id="empty-directory-workspace"]', diff --git a/frontend/packages/pipelines-plugin/integration-tests/support/pages/pipelines/pipelineRun-details-page.ts b/frontend/packages/pipelines-plugin/integration-tests/support/pages/pipelines/pipelineRun-details-page.ts index 9e903e9ecae..4f2466238ce 100644 --- a/frontend/packages/pipelines-plugin/integration-tests/support/pages/pipelines/pipelineRun-details-page.ts +++ b/frontend/packages/pipelines-plugin/integration-tests/support/pages/pipelines/pipelineRun-details-page.ts @@ -139,6 +139,11 @@ export const pipelineRunDetailsPage = { cy.url().should('include', 'parameters'); break; } + case 'Output': { + cy.get(pipelineRunDetailsPO.outputTab).click(); + cy.url().should('include', 'output'); + break; + } default: { throw new Error('operator is not available'); } diff --git a/frontend/packages/pipelines-plugin/integration-tests/support/pages/pipelines/pipelines-page.ts b/frontend/packages/pipelines-plugin/integration-tests/support/pages/pipelines/pipelines-page.ts index 33846448a05..0bf26da4754 100644 --- a/frontend/packages/pipelines-plugin/integration-tests/support/pages/pipelines/pipelines-page.ts +++ b/frontend/packages/pipelines-plugin/integration-tests/support/pages/pipelines/pipelines-page.ts @@ -39,6 +39,9 @@ export const pipelinesPage = { case pipelineTabs.Pipelines: cy.byLegacyTestID('horizontal-link-Pipelines').click(); break; + case pipelineTabs.PipelineRuns: + cy.byLegacyTestID('horizontal-link-PipelineRuns').click(); + break; case pipelineTabs.Repositories: cy.byLegacyTestID('horizontal-link-Repositories').click(); break; diff --git a/frontend/packages/pipelines-plugin/integration-tests/support/step-definitions/pipelines/pipelines-runs.ts b/frontend/packages/pipelines-plugin/integration-tests/support/step-definitions/pipelines/pipelines-runs.ts index a3c5623e05a..9d0e9e1ea3b 100644 --- a/frontend/packages/pipelines-plugin/integration-tests/support/step-definitions/pipelines/pipelines-runs.ts +++ b/frontend/packages/pipelines-plugin/integration-tests/support/step-definitions/pipelines/pipelines-runs.ts @@ -163,9 +163,12 @@ Then('user is able to see kebab menu options Rerun, Delete Pipeline Run', () => cy.byTestActionID('Delete PipelineRun').should('be.visible'); }); -Then('user is able to see Details, YAML, TaskRuns, Parameters, Logs and Events tabs', () => { - pipelineRunDetailsPage.verifyTabs(); -}); +Then( + 'user is able to see Details, YAML, TaskRuns, Parameters, Logs, Events and Output tabs', + () => { + pipelineRunDetailsPage.verifyTabs(); + }, +); Then( 'Details tab is displayed with field names Name, Namespace, Labels, Annotations, Created At, Owner, Status, Pipeline and Triggered by', @@ -672,3 +675,44 @@ When('user starts the pipeline {string} in Pipeline Details page', (pipelineName modal.modalTitleShouldContain('Start Pipeline'); startPipelineInPipelinesPage.clickStart(); }); + +Given('user has created a pipelineRun with sbom task {string}', async (pipelineRunName: string) => { + cy.exec(`oc apply -f testData/sbom-pipelinerun/sbom-task.yaml -n ${Cypress.env('NAMESPACE')}`, { + failOnNonZeroExit: false, + }).then((result) => { + cy.exec( + `oc apply -f testData/sbom-pipelinerun/${pipelineRunName}.yaml -n ${Cypress.env( + 'NAMESPACE', + )}`, + { + failOnNonZeroExit: false, + }, + ); + cy.log(result.stdout); + }); +}); + +When('user navigates to PipelineRun Details page {string}', (pipelineRunName: string) => { + pipelinesPage.selectTab(pipelineTabs.PipelineRuns); + + cy.byTestID(pipelineRunName).click(); +}); + +Then('user can see Download SBOM and View SBOM section in PipelineRun details page', () => { + pipelineRunDetailsPage.verifyTitle(); + cy.get(pipelineRunDetailsPO.details.viewSbomLink).should('be.visible'); + cy.get(pipelineRunDetailsPO.details.downloadSbomLink).should('be.visible'); +}); + +When( + 'user navigates to output tab of pipelineRun details page {string}', + (pipelineRunName: string) => { + pipelinesPage.selectTab(pipelineTabs.PipelineRuns); + cy.byTestID(pipelineRunName).click(); + pipelineRunDetailsPage.selectTab('Output'); + }, +); + +Then('user can see the results in the output tab', () => { + cy.get(pipelineRunDetailsPO.details.outputTitle).should('be.visible'); +}); diff --git a/frontend/packages/pipelines-plugin/integration-tests/testData/sbom-pipelinerun/pipelinerun-with-sbom-link.yaml b/frontend/packages/pipelines-plugin/integration-tests/testData/sbom-pipelinerun/pipelinerun-with-sbom-link.yaml new file mode 100644 index 00000000000..d9e2e415497 --- /dev/null +++ b/frontend/packages/pipelines-plugin/integration-tests/testData/sbom-pipelinerun/pipelinerun-with-sbom-link.yaml @@ -0,0 +1,14 @@ +apiVersion: tekton.dev/v1 +kind: PipelineRun +metadata: + name: pipelinerun-with-sbom-link +spec: + pipelineSpec: + tasks: + - name: sbom-task + taskRef: + name: sbom-task + results: + - name: LINK_TO_SBOM + description: Contains the SBOM link + value: $(tasks.sbom-task.results.LINK_TO_SBOM) diff --git a/frontend/packages/pipelines-plugin/integration-tests/testData/sbom-pipelinerun/sbom-task.yaml b/frontend/packages/pipelines-plugin/integration-tests/testData/sbom-pipelinerun/sbom-task.yaml new file mode 100644 index 00000000000..508efb2034c --- /dev/null +++ b/frontend/packages/pipelines-plugin/integration-tests/testData/sbom-pipelinerun/sbom-task.yaml @@ -0,0 +1,18 @@ +apiVersion: tekton.dev/v1 +kind: Task +metadata: + name: sbom-task + annotations: + task.output.location: results + task.results.format: application/text + task.results.key: LINK_TO_SBOM +spec: + results: + - name: LINK_TO_SBOM + description: Contains the SBOM link + steps: + - name: print-sbom-results + image: bash:latest + script: | + #!/usr/bin/env bash + echo 'quay.io/redhat-user-workloads/karthik-jk-tenant/node-express-hello/node-express-hello:build-8e536-1692702836' | tee $(results.LINK_TO_SBOM.path) diff --git a/frontend/packages/pipelines-plugin/src/components/pipelineruns/detail-page-tabs/PipelineRunCustomDetails.tsx b/frontend/packages/pipelines-plugin/src/components/pipelineruns/detail-page-tabs/PipelineRunCustomDetails.tsx index 3da799ba109..6b42b0353a0 100644 --- a/frontend/packages/pipelines-plugin/src/components/pipelineruns/detail-page-tabs/PipelineRunCustomDetails.tsx +++ b/frontend/packages/pipelines-plugin/src/components/pipelineruns/detail-page-tabs/PipelineRunCustomDetails.tsx @@ -66,7 +66,7 @@ const PipelineRunCustomDetails: React.FC = ({ pip {buildImage && ( <> -
{t('pipelines-plugin~Download SBOM')}
+
{t('pipelines-plugin~Download SBOM')}
= ({ pip )} {sbomTaskRun && ( <> -
{t('pipelines-plugin~SBOM')}
+
{t('pipelines-plugin~SBOM')}