Change Coverage Fuzzing artifact download to use GraphQL endpoint instead of legacy API for Pipelines Page Part 1
Order Of Issues
First two issues can be done in parallel.
Order | Issue | Description |
---|---|---|
1 | #328194 (closed) | Adds support to generic download component to take a pipeline id |
1 | #328482 (closed) | Backend issue to implement support for query |
2 | #328481 (closed) | Use component from Part 1. We can stage this in parallel but need to land after backend is complete. |
This is related to #289952 (closed)
In the pipelines show page for a single pipeline we show the fuzing artifact download. Using a flakey REST endpoint.
Now that #251015 is complete, we can do this refactor.
Benefits of this refactor
If a user overrides the stage
param defined in the .base_fuzz
template, by defining a stage
variable, it will no longer break artifact downloads.
Original implementation issues for Coverage Fuzzing artifact download buttons:
We relied on a fragile assumption that the .fuzz_base
CI template would not have a particular parameter over-riden by the user. If they replaced the variable, it would cause the artifact download buttons to not show.
A graphQL endpoint was added in #251015 (closed) to allow us to show artifacts of a particular report type in any given pipeline.
Problem we still need to solve - The artifact download component and graphql endpoint expect a merge request ID and a project full path. The pipelines controller doesn't have a merge request ID scope for the pipeline. So we need to figure out a way to expose the merge request ID for a given pipeline. Which I'm not sure if that relation exists.
Another solution is to update the graphQL endpoint created in #251015 (closed) to accept a pipeline ID.
Looking at the comment in #251015 (comment 445123082) it seems like backend might work with just a pipeline ID. @avielle not sure if you can confirm.
<artifact-download
v-if="shouldShowDownloadGuidance"
:report-types="[$options.reportTypes.COVERAGE_FUZZING]"
:target-project-full-path="targetProjectFullPath"
:mr-iid="mrIid"
/>
New Implementation Plan
New component should look something like. I opted to not use the scoped slot because right now we only ever render <security-report-download-dropdown />
in the template. Adding a scoped slot would be optimizing prematurely since we don't have any other component that would go into the slot.
<pipeline-artifact-download
v-if="shouldShowDownloadGuidance"
:target-project-full-path="targetProjectFullPath"
:mr-iid="mrIid"
/>
Old Frontend Implementation Plan
- Create a parent renderless component to house the apollo query specific to pipeline page, and any other associated logic. This includes the report-type prop.
- Add default slot
- Unit tests
New component should look something like
<pipeline-artifact-download
v-if="shouldShowDownloadGuidance"
:target-project-full-path="targetProjectFullPath"
:mr-iid="mrIid"
>
<artifact-download />
</pipeline-artifact-download>
Backup Frontend Implementation Plan
- Add a
:pipeline-iid="pipelineIid
prop - Add a new
pipelinesSecurityReportDownloadPathsQuery
that accepts a pipeline ID instead of a merge request ID - Unit Tests
Does not cover using the component, it covers the setup required to be used
Component then can be used in #328481 (closed)
Proposal
Allow for something like
{
project(fullPath: "project-full-path") {
headPipeline(iid: "the-pipeline-iid") {
jobs(reportTypes: [FUZZING, SAST]) {
nodes {
artifacts(types: [ARCHIVE]) {
nodes {
downloadPath
}
}
}
}
}
}
}
}