From 8daab3651fec03aede08616c26db09ca330d0899 Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Mon, 7 Sep 2020 15:01:41 +0100 Subject: [PATCH 01/17] Rename Jenkins annotation --- docs/features/software-catalog/well-known-annotations.md | 4 ++-- .../components/EntityPageOverview/EntityPageOverview.tsx | 8 ++------ plugins/jenkins/README.md | 2 +- .../JenkinsPluginWidget/JenkinsBuildsWidget.tsx | 2 +- .../JenkinsPluginWidget/JenkinsLastBuildWidget.tsx | 2 +- 5 files changed, 7 insertions(+), 11 deletions(-) diff --git a/docs/features/software-catalog/well-known-annotations.md b/docs/features/software-catalog/well-known-annotations.md index 18de63d704..d6e81e639f 100644 --- a/docs/features/software-catalog/well-known-annotations.md +++ b/docs/features/software-catalog/well-known-annotations.md @@ -51,13 +51,13 @@ The value of this annotation is a location reference string (see above). If this annotation is specified, it is expected to point to a repository that the TechDocs system can read and generate docs from. -### backstage.io/jenkins-github-folder +### jenkins.io/github-folder ```yaml # Example: metadata: annotations: - backstage.io/jenkins-github-folder: folder-name/job-name + jenkins.io/github-folder: folder-name/job-name ``` The value of this annotation is the path to a job on Jenkins, that builds this diff --git a/plugins/catalog/src/components/EntityPageOverview/EntityPageOverview.tsx b/plugins/catalog/src/components/EntityPageOverview/EntityPageOverview.tsx index c43e83edaa..7f19728780 100644 --- a/plugins/catalog/src/components/EntityPageOverview/EntityPageOverview.tsx +++ b/plugins/catalog/src/components/EntityPageOverview/EntityPageOverview.tsx @@ -36,16 +36,12 @@ export const EntityPageOverview: FC<{ entity: Entity }> = ({ entity }) => { - {entity.metadata?.annotations?.[ - 'backstage.io/jenkins-github-folder' - ] && ( + {entity.metadata?.annotations?.['jenkins.io/github-folder'] && ( )} - {entity.metadata?.annotations?.[ - 'backstage.io/jenkins-github-folder' - ] && ( + {entity.metadata?.annotations?.['jenkins.io/github-folder'] && ( diff --git a/plugins/jenkins/README.md b/plugins/jenkins/README.md index a911704dc4..3e721c5e7a 100644 --- a/plugins/jenkins/README.md +++ b/plugins/jenkins/README.md @@ -63,7 +63,7 @@ metadata: name: 'your-component' description: 'a description' annotations: - backstage.io/jenkins-github-folder: 'folder-name/job-name' + jenkins.io/github-folder: 'folder-name/job-name' spec: type: service lifecycle: experimental diff --git a/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsBuildsWidget.tsx b/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsBuildsWidget.tsx index 469869af69..12eaf5653b 100644 --- a/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsBuildsWidget.tsx +++ b/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsBuildsWidget.tsx @@ -20,7 +20,7 @@ import { Entity } from '@backstage/catalog-model'; export const JenkinsBuildsWidget = ({ entity }: { entity: Entity }) => { const [owner, repo] = ( - entity?.metadata.annotations?.['backstage.io/jenkins-github-folder'] ?? '/' + entity?.metadata.annotations?.['jenkins.io/github-folder'] ?? '/' ).split('/'); return ; diff --git a/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsLastBuildWidget.tsx b/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsLastBuildWidget.tsx index 9bd16bf9e6..6731808d8e 100644 --- a/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsLastBuildWidget.tsx +++ b/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsLastBuildWidget.tsx @@ -68,7 +68,7 @@ export const JenkinsLastBuildWidget = ({ branch: string; }) => { const [owner, repo] = ( - entity?.metadata.annotations?.['backstage.io/jenkins-github-folder'] ?? '/' + entity?.metadata.annotations?.['jenkins.io/github-folder'] ?? '/' ).split('/'); const [{ loading, value }] = useBuilds(owner, repo, branch); From e5ae7a029d436199b60fd59c9cbfba882a28e201 Mon Sep 17 00:00:00 2001 From: Tim Jacomb Date: Tue, 8 Sep 2020 11:05:31 +0100 Subject: [PATCH 02/17] Update Jenkins plugin to new routing --- .../app/src/components/catalog/EntityPage.tsx | 12 ++ .../EntityPageOverview/EntityPageOverview.tsx | 14 -- plugins/jenkins/README.md | 12 +- plugins/jenkins/package.json | 1 + plugins/jenkins/src/api/index.ts | 20 ++- plugins/jenkins/src/assets/build-details.png | Bin 85203 -> 32743 bytes plugins/jenkins/src/assets/folder-results.png | Bin 77035 -> 81758 bytes .../BuildWithStepsPage/BuildWithStepsPage.tsx | 134 ++++++++++++++ .../BuildWithStepsPage/index.ts | 0 .../lib/ActionOutput/ActionOutput.tsx | 0 .../lib/ActionOutput/index.ts | 0 .../BuildsPage/lib/CITable/CITable.tsx | 41 ++++- .../BuildsPage/lib/CITable/index.ts | 0 .../lib/Status/JenkinsRunStatus.tsx | 0 .../BuildsPage/lib/Status/index.ts | 0 .../Cards.tsx} | 25 +-- .../{PluginHeader => Cards}/index.ts | 2 +- .../jenkins/src/components/Layout/Layout.tsx | 29 ---- .../jenkins/src/components/Layout/index.ts | 16 -- .../components/PluginHeader/PluginHeader.tsx | 36 ---- plugins/jenkins/src/components/Router.tsx | 41 +++++ .../{state => components}/useAsyncPolling.ts | 0 .../useBuildWithSteps.ts | 2 +- .../src/{state => components}/useBuilds.ts | 9 +- ...Widget.tsx => useProjectSlugFromEntity.ts} | 13 +- .../lib/Builds/index.ts => constants.ts} | 2 +- plugins/jenkins/src/index.ts | 5 +- .../BuildWithStepsPage/BuildWithStepsPage.tsx | 164 ------------------ .../pages/BuildsPage/lib/Builds/Builds.tsx | 38 ---- plugins/jenkins/src/plugin.ts | 14 +- plugins/jenkins/src/state/index.ts | 17 -- 31 files changed, 274 insertions(+), 373 deletions(-) create mode 100644 plugins/jenkins/src/components/BuildWithStepsPage/BuildWithStepsPage.tsx rename plugins/jenkins/src/{pages => components}/BuildWithStepsPage/index.ts (100%) rename plugins/jenkins/src/{pages => components}/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx (100%) rename plugins/jenkins/src/{pages => components}/BuildWithStepsPage/lib/ActionOutput/index.ts (100%) rename plugins/jenkins/src/{pages => components}/BuildsPage/lib/CITable/CITable.tsx (81%) rename plugins/jenkins/src/{pages => components}/BuildsPage/lib/CITable/index.ts (100%) rename plugins/jenkins/src/{pages => components}/BuildsPage/lib/Status/JenkinsRunStatus.tsx (100%) rename plugins/jenkins/src/{pages => components}/BuildsPage/lib/Status/index.ts (100%) rename plugins/jenkins/src/components/{JenkinsPluginWidget/JenkinsLastBuildWidget.tsx => Cards/Cards.tsx} (78%) rename plugins/jenkins/src/components/{PluginHeader => Cards}/index.ts (93%) delete mode 100644 plugins/jenkins/src/components/Layout/Layout.tsx delete mode 100644 plugins/jenkins/src/components/Layout/index.ts delete mode 100644 plugins/jenkins/src/components/PluginHeader/PluginHeader.tsx create mode 100644 plugins/jenkins/src/components/Router.tsx rename plugins/jenkins/src/{state => components}/useAsyncPolling.ts (100%) rename plugins/jenkins/src/{state => components}/useBuildWithSteps.ts (97%) rename plugins/jenkins/src/{state => components}/useBuilds.ts (92%) rename plugins/jenkins/src/components/{JenkinsPluginWidget/JenkinsBuildsWidget.tsx => useProjectSlugFromEntity.ts} (66%) rename plugins/jenkins/src/{pages/BuildsPage/lib/Builds/index.ts => constants.ts} (90%) delete mode 100644 plugins/jenkins/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx delete mode 100644 plugins/jenkins/src/pages/BuildsPage/lib/Builds/Builds.tsx delete mode 100644 plugins/jenkins/src/state/index.ts diff --git a/packages/app/src/components/catalog/EntityPage.tsx b/packages/app/src/components/catalog/EntityPage.tsx index 257fde3c24..c382abc3a8 100644 --- a/packages/app/src/components/catalog/EntityPage.tsx +++ b/packages/app/src/components/catalog/EntityPage.tsx @@ -17,6 +17,11 @@ import { Router as GitHubActionsRouter, isPluginApplicableToEntity as isGitHubActionsAvailable, } from '@backstage/plugin-github-actions'; +import { + Router as JenkinsRouter, + isPluginApplicableToEntity as isJenkinsAvailable, + LatestRunCard as JenkinsLatestRunCard, +} from '@backstage/plugin-jenkins'; import { Router as CircleCIRouter, isPluginApplicableToEntity as isCircleCIAvailable, @@ -38,6 +43,8 @@ const CICDSwitcher = ({ entity }: { entity: Entity }) => { // This component is just an example of how you can implement your company's logic in entity page. // You can for example enforce that all components of type 'service' should use GitHubActions switch (true) { + case isJenkinsAvailable(entity): + return ; case isGitHubActionsAvailable(entity): return ; case isCircleCIAvailable(entity): @@ -57,6 +64,11 @@ const OverviewContent = ({ entity }: { entity: Entity }) => ( + {isJenkinsAvailable(entity) && ( + + + + )} ); diff --git a/plugins/catalog/src/components/EntityPageOverview/EntityPageOverview.tsx b/plugins/catalog/src/components/EntityPageOverview/EntityPageOverview.tsx index 7f19728780..ee0f03f04a 100644 --- a/plugins/catalog/src/components/EntityPageOverview/EntityPageOverview.tsx +++ b/plugins/catalog/src/components/EntityPageOverview/EntityPageOverview.tsx @@ -21,10 +21,6 @@ import { LatestWorkflowRunCard, GITHUB_ACTIONS_ANNOTATION, } from '@backstage/plugin-github-actions'; -import { - JenkinsBuildsWidget, - JenkinsLastBuildWidget, -} from '@backstage/plugin-jenkins'; import { Grid } from '@material-ui/core'; import React, { FC } from 'react'; import { AboutCard } from '../AboutCard'; @@ -36,16 +32,6 @@ export const EntityPageOverview: FC<{ entity: Entity }> = ({ entity }) => { - {entity.metadata?.annotations?.['jenkins.io/github-folder'] && ( - - - - )} - {entity.metadata?.annotations?.['jenkins.io/github-folder'] && ( - - - - )} {entity.metadata?.annotations?.[GITHUB_ACTIONS_ANNOTATION] && ( diff --git a/plugins/jenkins/README.md b/plugins/jenkins/README.md index 3e721c5e7a..8f0d43cba7 100644 --- a/plugins/jenkins/README.md +++ b/plugins/jenkins/README.md @@ -14,17 +14,7 @@ Website: [https://jenkins.io/](https://jenkins.io/) yarn add @backstage/plugin-jenkins ``` -2. Add plugin API to your Backstage instance: - -```js -// packages/app/src/api.ts -import { JenkinsApi, jenkinsApiRef } from '@backstage/plugin-jenkins'; - -const builder = ApiRegistry.builder(); -builder.add(jenkinsApiRef, new JenkinsApi(`${backendUrl}/proxy/jenkins/api`)); -``` - -2. Add plugin itself: +2. Add plugin: ```js // packages/app/src/plugins.ts diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json index 0d532f8c45..c62df08db2 100644 --- a/plugins/jenkins/package.json +++ b/plugins/jenkins/package.json @@ -23,6 +23,7 @@ "dependencies": { "@backstage/catalog-model": "^0.1.1-alpha.21", "@backstage/core": "^0.1.1-alpha.21", + "@backstage/plugin-catalog": "^0.1.1-alpha.21", "@backstage/theme": "^0.1.1-alpha.21", "@material-ui/core": "^4.11.0", "@material-ui/icons": "^4.9.1", diff --git a/plugins/jenkins/src/api/index.ts b/plugins/jenkins/src/api/index.ts index 545a1da9cc..2b95fe97d9 100644 --- a/plugins/jenkins/src/api/index.ts +++ b/plugins/jenkins/src/api/index.ts @@ -15,7 +15,7 @@ */ import { createApiRef } from '@backstage/core'; -import { CITableBuildInfo } from '../pages/BuildsPage/lib/CITable'; +import { CITableBuildInfo } from '../components/BuildsPage/lib/CITable'; const jenkins = require('jenkins'); @@ -65,6 +65,21 @@ export class JenkinsApi { }) .pop(); + const author = jobDetails.actions + .filter( + (action: any) => + action._class === + 'jenkins.scm.api.metadata.ContributorMetadataAction', + ) + .map((action: any) => { + return action.contributorDisplayName; + }) + .pop(); + + if (author) { + scmInfo.author = author; + } + return scmInfo; } @@ -154,12 +169,15 @@ export class JenkinsApi { if (jobScmInfo) { source.url = jobScmInfo?.url; source.displayName = jobScmInfo?.displayName; + source.author = jobScmInfo?.author; } const path = new URL(jenkinsResult.url).pathname; return { id: path, + buildNumber: jenkinsResult.number, + buildUrl: jenkinsResult.url, buildName: jenkinsResult.fullDisplayName, status: jenkinsResult.building ? 'running' : jenkinsResult.result, onRestartClick: () => { diff --git a/plugins/jenkins/src/assets/build-details.png b/plugins/jenkins/src/assets/build-details.png index 396af428af58f7dcaba14124de9fe913da507908..ee463fea4392d85b429343b46e7b27a77dffbade 100644 GIT binary patch literal 32743 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 To$z!F;Gcqw>Wh-+CV~G4?FVZf diff --git a/plugins/jenkins/src/assets/folder-results.png b/plugins/jenkins/src/assets/folder-results.png index 2e14f3551f6cbfbd58356051ad28584c5510b9c7..c01e4cf43752019a5edd2d6e18edeec134752a19 100644 GIT binary patch literal 81758 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%0D+Hnsoy}FM?*WAaU!ea8qjS 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

G(qgOTu$m) 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≷DTGQqx1EAoTL^q+)*tDW)6^d5~vA6v95TG~F`F_4A; zC#5hMM9VAhY*cPzqdAIdkzxBB3sY4q)WON3wyRv5%o`N+-Gnk7sf;P{qW##kd!9!G zbEpc~YCyN&CYQHcP~d-3);)};t#lqRRvPY-DNb%K*r+-UeX~?Wc*}HB8Ia}0hF|G_ zl;B#~dGl_f`$_oDk@L^eo#)?|tys1}@k~5l00o`LuFCiVVQTdBekkLm2D$L1-Z&~= z(F_)Cb73}f=NG9y=S0_4Qdf7>{4$Twuv_yP9W6i(3A3Y=IZa7|97u{=f0v#M^K?qi zF8NGkG(h1TA>Fd%4&4jCON#6Y1<2aIqERn6%AuTOA?4#CZbkQyj+CIe>EFy-kK# z=Q)tDsJsp*v)q;M-K|{-iw64iX=mesB%`Udxr8}RTEy?nlD(8uq_pHY(#ghC>)OPg z(V!#uj^oHwS&2O2QM{*7FKbjX`_=Zqo%(iOO60w@4o3EqChI+y{q?5LW*Y}~{ZbI3 zT-(hyBhV@M*|3Q{kQ&3(qtQXDti3Xk=cDU20)rmc1{z(iEll%6c29EM-|bsuoa$c< zREF{O?h79>M>ow#4hu;Hz8I&r?+d@l?QdMQcVlkj)yspMHY&3(h8=fWZ+wdm67DCu zY{qL?qR*#b_Ulzv_ZhiNE&HY*NS?N8{n*>W$||Bw#5^f^ygE9o^$qzh4jBWaEdU3< z_kp1{*q`>SQEXo+GsH&KU)W%($j>qhb8)=7L z&<089i`#37J`41aqm*Cs6>1Q^_M_PlGbwH9EAPOA>5_Q$V5~RzdMVwtVTsc1xDJ=A z?u@PFQtO|8Rcjqs(_XRKY%h z<8ZUL%&=_F zb$k4{YFUB160Ex327i$14}hBFrG_mme3Ps)8|&u@Z?_71jzd#cX<}%2zPv2oH@DzG z%C!3sXZis(7w0r6zIiXxMq~$fERX6T5So}bV?qXD61$^36b$?1a2IP-t zZuFzysZGR_5*D6BX79&{@2$V>KMX@xb&o%I2(zy==DoC;ndK7R6(Kg%Wsa{?mQB1( znM7S9Km6$&kIiVy2D`%9@p!oJ(Lw3F5s=aEPxAHO4h`{YRHF0MM`=W(FVD!4keucm z;-76NFa+c(v-p#KzX$^E(UXgZ{?mL&fL?90Lc=ceAyr?vh2&dfQv&}OnpQyJFsSL+Ee0TX09tx7$ zLAK;LrYi9F>$z-LRd9&Pm`^0$E(!^@*fJd+YgnGc)rh!#>u;R z%&Xs)LrG66_qdH~mogTik@e(ax1ubl@7uBdYV0DSf9>66SVAQBE4PK6?)u1b`6yWH z9IB3%<0P)M#o7!JTX_Lts18zDK|qupZ`-XV)|hOWhw~7Iit)Iv`l+m^3CtHV3NCYo z42B*SiY3LeRkNmJ+1(GBF*<>jC}n` zRqS&sMI-{(=IVN>R8l{>4(}Va$2g4ozXu+SQ-;2#h4=#o^#{V#c;5Kv^e?o^q?LjL zzxrSbp+83>!`Ge{=m6de3)K)lV7?er-IE=y5ZO)_!8HjLHN}MtlzrMSN`1S1j>=B6 zbcyBNK~l~=wWcgTK}{L)xR2dR@_~aU$h?5Ji2J;6Oiy8oNymGv%16oKiVoJ2yKeF6 zj=75Oufx5Uo4Qu2{Vors#jx3oNLG%6H5yn~wyKwigIChUSC*;|RyW+GS7O`r$v<1I zbRwh8_8i;^GBDOX&bRHL7QWbpMWg9IL2kqgQ8xYYcEE0W=yE0#U6-Yhcpk^!8trc# z5pM-q1lvO!r|`aBUHObr9KNpz=FBAEQ8Cy5Q|Vy`kDw~vf}hjWW%L4P>2Oe5%F}zv z2r;%M`hmZl7})9Uit=Z<3biLdQ?EmVgTc&SrxAs;Ml=4tMKU@_E00OUG)c>{-pFC$ z`^}q$*soBmXB9Pzk6uCQ8pfpEjP|`@bG-zh*^sSbt{RW8K3Xgrie4rYdfX!5gDCF7(Hh9ZuERP?L#qc`zD@)p!-#>8y!VmJprdC??`S2 zkor7E8p$ocATnLbXz>ZK6)oT4^g`BdoYL8%9fU~LO2-4Y*qrIf~G^|c*;o+CvBbzpGucPb%a(_9P>Je#+}px zhlltW1HC8HPIa|5@A!BOi19I1FrR;qGPn4VaJohRH0cWl&Hdo%^ikom=3Gf_drPr< z9uV8!ov`{{j{%lAIq=a_lc=p5>rO;2{Lci1FE7&r7wa+OAvCJ^L{|)ju5;<-@(*@3 z=*$O(!hD&z7fI}gT>4IHZf-dGC~z>jXJM3j+YjD6PH!iZgf5AhYqqt~Fs`X#;sjMs zsqZ^nYsU@o{d&U<(s~##q8rwMw^PIQWO}0*YP|wP;FR#}0O=j#=ULr1pYY{mB7`nG ziLEQ43PH(2runxZ_K$yJ2JmeR@3Toc?M{!q)f5XOG3_bF_*m+&vGE7Ta+4atC?)P! zR1+s~^8AvN=gY&`K@Q1mHKNRaeB>yoKO~Prk`3uK8@E-PqAaTyiCT9zfu$on9lDy; za>EtDenrAMBa?n0oFN)_7TaVU6Du}Lr|f`4VY+t)L#jQ?;~8p1HDB$p>G|Fc zSBz@6xJM9t_3#o2tYD-idme|z`JsXL9MX^|@LqJrRiV;U(#~^2?lLD=5Q{aK59Uvlm)$UeMou z4yYn>v0#=A!DB!}R@mnt%_v|SuI`Y5K;`nN^5jwjdas8sLdmLilew_UEfGuKdQB7- z;1j%Rr|!yk-*FV~)Syj5=Z~NsAT=9*U)z@1C<>$p48Qo^Rz*5^?&`1*wWf5%?kPjH{ja9alAbXaScFuqPCW5*oGkN{=X^M@HJD~F)fvQ_C$VZ@4)pm%r zzE`%YYd^rwG0bAz{}9fbLm|NbU9bK3F+S%7NZb+28(jV2F}`C|wf7ZO{U|ZEF=)Qa zWB{uIgbMGz@PzhZi}YZRqT<)Z&NVf42h(fCITGQJ{UphDAf}~1-8zY%smt%4(A6m2 z-RCcH+p7~>A4;>PNtbK60KNwnYS2L7FoKhuMk-8X`%bR_5kJ{yXJ`lHA8@=PV^6q7 zG2+yyd`Ahlb-165sm5LZn4$gdIXdQtdHpPRNA_-FLc%)&RFK*c_VtM0up8IDFc6Bp zedCM64*}n|*{J6=cLYEh$;!n)PAn<~I3LCFr7hhUHr4q{IwOC>rQg7NJEu`WG6Fh7hWli4x_M*kbn9T+T-WTO=iHQ1!U%OHQhU=^i!%eu|l{wZDc znA}A_Y#4D=(-)}{XTN&i8F=goxJMg`?RR#E#w6I)hMJbg!Qw<1^nB<6c$nY~9Yypz zuu2_0q?L(^js_cNIyTc0>V+jxG>ii_ Wh|FCcvA>q{&b+NtCAx0NXLcs4eGB(z* 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 literal 77035 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 P{JW%lMJfBdng9O)p?7;+ diff --git a/plugins/jenkins/src/components/BuildWithStepsPage/BuildWithStepsPage.tsx b/plugins/jenkins/src/components/BuildWithStepsPage/BuildWithStepsPage.tsx new file mode 100644 index 0000000000..637cd40d6d --- /dev/null +++ b/plugins/jenkins/src/components/BuildWithStepsPage/BuildWithStepsPage.tsx @@ -0,0 +1,134 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { useParams } from 'react-router-dom'; +import { Content, Link } from '@backstage/core'; +import { + Typography, + Breadcrumbs, + Paper, + TableContainer, + Table, + TableRow, + TableCell, + TableBody, + Link as MaterialLink, +} from '@material-ui/core'; +import { makeStyles } from '@material-ui/core/styles'; +import { useBuildWithSteps } from '../useBuildWithSteps'; +import { useProjectSlugFromEntity } from '../useProjectSlugFromEntity'; +import { JenkinsRunStatus } from '../BuildsPage/lib/Status'; +import ExternalLinkIcon from '@material-ui/icons/Launch'; + +const useStyles = makeStyles(theme => ({ + root: { + maxWidth: 720, + margin: theme.spacing(2), + }, + table: { + padding: theme.spacing(1), + }, + externalLinkIcon: { + fontSize: 'inherit', + verticalAlign: 'bottom', + }, +})); + +const Page = () => ( + + + +); + +const BuildWithStepsView = () => { + const { owner, repo } = useProjectSlugFromEntity(); + const { branch, buildNumber } = useParams(); + const classes = useStyles(); + const buildPath = `${owner}/${repo}/${branch}/${buildNumber}`; + const [{ value }] = useBuildWithSteps(buildPath); + + return ( +

+ + Jobs + Run + + + + + + + Branch + + {value?.source?.branchName} + + + + Message + + {value?.source?.displayName} + + + + Commit ID + + {value?.source?.commit?.hash} + + + + Status + + + + + + + + Author + + {value?.source?.author} + + + + Jenkins + + + + View on Jenkins{' '} + + + + + + + GitHub + + + + View on GitHub{' '} + + + + + +
+
+
+ ); +}; + +export default Page; +export { BuildWithStepsView as BuildWithSteps }; diff --git a/plugins/jenkins/src/pages/BuildWithStepsPage/index.ts b/plugins/jenkins/src/components/BuildWithStepsPage/index.ts similarity index 100% rename from plugins/jenkins/src/pages/BuildWithStepsPage/index.ts rename to plugins/jenkins/src/components/BuildWithStepsPage/index.ts diff --git a/plugins/jenkins/src/pages/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx b/plugins/jenkins/src/components/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx similarity index 100% rename from plugins/jenkins/src/pages/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx rename to plugins/jenkins/src/components/BuildWithStepsPage/lib/ActionOutput/ActionOutput.tsx diff --git a/plugins/jenkins/src/pages/BuildWithStepsPage/lib/ActionOutput/index.ts b/plugins/jenkins/src/components/BuildWithStepsPage/lib/ActionOutput/index.ts similarity index 100% rename from plugins/jenkins/src/pages/BuildWithStepsPage/lib/ActionOutput/index.ts rename to plugins/jenkins/src/components/BuildWithStepsPage/lib/ActionOutput/index.ts diff --git a/plugins/jenkins/src/pages/BuildsPage/lib/CITable/CITable.tsx b/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx similarity index 81% rename from plugins/jenkins/src/pages/BuildsPage/lib/CITable/CITable.tsx rename to plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx index 7f17107374..282cbc59b5 100644 --- a/plugins/jenkins/src/pages/BuildsPage/lib/CITable/CITable.tsx +++ b/plugins/jenkins/src/components/BuildsPage/lib/CITable/CITable.tsx @@ -14,21 +14,26 @@ * limitations under the License. */ import React, { FC } from 'react'; -import { Link, Typography, Box, IconButton } from '@material-ui/core'; +import { Box, IconButton, Link, Typography } from '@material-ui/core'; import RetryIcon from '@material-ui/icons/Replay'; import GitHubIcon from '@material-ui/icons/GitHub'; -import { Link as RouterLink } from 'react-router-dom'; +import { generatePath, Link as RouterLink } from 'react-router-dom'; import { Table, TableColumn } from '@backstage/core'; import { JenkinsRunStatus } from '../Status'; +import { useBuilds } from '../../../useBuilds'; +import { useProjectSlugFromEntity } from '../../../useProjectSlugFromEntity'; +import { buildRouteRef } from '../../../../plugin'; export type CITableBuildInfo = { id: string; buildName: string; - buildUrl?: string; + buildNumber: number; + buildUrl: string; source: { branchName: string; url: string; displayName: string; + author?: string; commit: { hash: string; }; @@ -105,7 +110,13 @@ const generatedColumns: TableColumn[] = [ field: 'buildName', highlight: true, render: (row: Partial) => ( - + {row.buildName} ), @@ -177,7 +188,8 @@ type Props = { pageSize: number; onChangePageSize: (pageSize: number) => void; }; -export const CITable: FC = ({ + +export const CITableView: FC = ({ projectName, loading, pageSize, @@ -191,7 +203,7 @@ export const CITable: FC = ({ return ( = ({ onClick: () => retry(), }, ]} - data={builds} + data={builds ?? []} onChangePage={onChangePage} onChangeRowsPerPage={onChangePageSize} title={ @@ -216,3 +228,18 @@ export const CITable: FC = ({ /> ); }; + +export const CITable = () => { + const { owner, repo } = useProjectSlugFromEntity(); + + const [tableProps, { setPage, retry, setPageSize }] = useBuilds(owner, repo); + + return ( + + ); +}; diff --git a/plugins/jenkins/src/pages/BuildsPage/lib/CITable/index.ts b/plugins/jenkins/src/components/BuildsPage/lib/CITable/index.ts similarity index 100% rename from plugins/jenkins/src/pages/BuildsPage/lib/CITable/index.ts rename to plugins/jenkins/src/components/BuildsPage/lib/CITable/index.ts diff --git a/plugins/jenkins/src/pages/BuildsPage/lib/Status/JenkinsRunStatus.tsx b/plugins/jenkins/src/components/BuildsPage/lib/Status/JenkinsRunStatus.tsx similarity index 100% rename from plugins/jenkins/src/pages/BuildsPage/lib/Status/JenkinsRunStatus.tsx rename to plugins/jenkins/src/components/BuildsPage/lib/Status/JenkinsRunStatus.tsx diff --git a/plugins/jenkins/src/pages/BuildsPage/lib/Status/index.ts b/plugins/jenkins/src/components/BuildsPage/lib/Status/index.ts similarity index 100% rename from plugins/jenkins/src/pages/BuildsPage/lib/Status/index.ts rename to plugins/jenkins/src/components/BuildsPage/lib/Status/index.ts diff --git a/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsLastBuildWidget.tsx b/plugins/jenkins/src/components/Cards/Cards.tsx similarity index 78% rename from plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsLastBuildWidget.tsx rename to plugins/jenkins/src/components/Cards/Cards.tsx index 6731808d8e..5034effdcf 100644 --- a/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsLastBuildWidget.tsx +++ b/plugins/jenkins/src/components/Cards/Cards.tsx @@ -14,12 +14,12 @@ * limitations under the License. */ import React from 'react'; -import { Entity } from '@backstage/catalog-model'; import { Link, Theme, makeStyles, LinearProgress } from '@material-ui/core'; import { InfoCard, StructuredMetadataTable } from '@backstage/core'; import ExternalLinkIcon from '@material-ui/icons/Launch'; -import { useBuilds } from '../../state'; -import { JenkinsRunStatus } from '../../pages/BuildsPage/lib/Status'; +import { useBuilds } from '../useBuilds'; +import { JenkinsRunStatus } from '../BuildsPage/lib/Status'; +import { useProjectSlugFromEntity } from '../useProjectSlugFromEntity'; const useStyles = makeStyles({ externalLinkIcon: { @@ -38,6 +38,7 @@ const WidgetContent = ({ }) => { const classes = useStyles(); if (loading || !lastRun) return ; + return ( { - const [owner, repo] = ( - entity?.metadata.annotations?.['jenkins.io/github-folder'] ?? '/' - ).split('/'); - const [{ loading, value }] = useBuilds(owner, repo, branch); - - const lastRun = value ?? {}; - +export const LatestRunCard = ({ branch = 'master' }: { branch: string }) => { + const { owner, repo } = useProjectSlugFromEntity(); + const [{ builds, loading }] = useBuilds(owner, repo, branch); + const lastRun = builds ?? {}; return ( diff --git a/plugins/jenkins/src/components/PluginHeader/index.ts b/plugins/jenkins/src/components/Cards/index.ts similarity index 93% rename from plugins/jenkins/src/components/PluginHeader/index.ts rename to plugins/jenkins/src/components/Cards/index.ts index 4de972f6f2..dace09e1a9 100644 --- a/plugins/jenkins/src/components/PluginHeader/index.ts +++ b/plugins/jenkins/src/components/Cards/index.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export * from './PluginHeader'; +export { LatestRunCard } from './Cards'; diff --git a/plugins/jenkins/src/components/Layout/Layout.tsx b/plugins/jenkins/src/components/Layout/Layout.tsx deleted file mode 100644 index c6000437a3..0000000000 --- a/plugins/jenkins/src/components/Layout/Layout.tsx +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import React from 'react'; -import { Header, Page, pageTheme, HeaderLabel } from '@backstage/core'; - -export const Layout: React.FC = ({ children }) => { - return ( - -
- - -
- {children} -
- ); -}; diff --git a/plugins/jenkins/src/components/Layout/index.ts b/plugins/jenkins/src/components/Layout/index.ts deleted file mode 100644 index 236fc98851..0000000000 --- a/plugins/jenkins/src/components/Layout/index.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export * from './Layout'; diff --git a/plugins/jenkins/src/components/PluginHeader/PluginHeader.tsx b/plugins/jenkins/src/components/PluginHeader/PluginHeader.tsx deleted file mode 100644 index 501649e49a..0000000000 --- a/plugins/jenkins/src/components/PluginHeader/PluginHeader.tsx +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import React from 'react'; -import { ContentHeader, SupportButton } from '@backstage/core'; -import { Box, Typography } from '@material-ui/core'; - -export type Props = { title?: string }; -export const PluginHeader = ({ title = 'Jenkins' }) => { - return ( - ( - - {title} - - )} - > - - This plugin allows you to view and interact with your builds in Jenkins. - - - ); -}; diff --git a/plugins/jenkins/src/components/Router.tsx b/plugins/jenkins/src/components/Router.tsx new file mode 100644 index 0000000000..56df5456bc --- /dev/null +++ b/plugins/jenkins/src/components/Router.tsx @@ -0,0 +1,41 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import React from 'react'; +import { Route, Routes } from 'react-router'; +import { buildRouteRef, rootRouteRef } from '../plugin'; +import { DetailedViewPage } from './BuildWithStepsPage/'; +import { JENKINS_ANNOTATION } from '../constants'; +import { Entity } from '@backstage/catalog-model'; +import { WarningPanel } from '@backstage/core'; +import { CITable } from './BuildsPage/lib/CITable'; + +export const isPluginApplicableToEntity = (entity: Entity) => + Boolean(entity.metadata.annotations?.[JENKINS_ANNOTATION]) && + entity.metadata.annotations?.[JENKINS_ANNOTATION] !== ''; + +export const Router = ({ entity }: { entity: Entity }) => { + return !isPluginApplicableToEntity(entity) ? ( + +
entity.metadata.annotations['{JENKINS_ANNOTATION}']
+ key is missing on the entity. +
+ ) : ( + + } /> + } /> + + ); +}; diff --git a/plugins/jenkins/src/state/useAsyncPolling.ts b/plugins/jenkins/src/components/useAsyncPolling.ts similarity index 100% rename from plugins/jenkins/src/state/useAsyncPolling.ts rename to plugins/jenkins/src/components/useAsyncPolling.ts diff --git a/plugins/jenkins/src/state/useBuildWithSteps.ts b/plugins/jenkins/src/components/useBuildWithSteps.ts similarity index 97% rename from plugins/jenkins/src/state/useBuildWithSteps.ts rename to plugins/jenkins/src/components/useBuildWithSteps.ts index 617b2b1f4f..86d8162612 100644 --- a/plugins/jenkins/src/state/useBuildWithSteps.ts +++ b/plugins/jenkins/src/components/useBuildWithSteps.ts @@ -16,7 +16,7 @@ import { errorApiRef, useApi } from '@backstage/core'; import { useCallback } from 'react'; import { useAsyncRetry } from 'react-use'; -import { jenkinsApiRef } from '../api/index'; +import { jenkinsApiRef } from '../api'; import { useAsyncPolling } from './useAsyncPolling'; const INTERVAL_AMOUNT = 1500; diff --git a/plugins/jenkins/src/state/useBuilds.ts b/plugins/jenkins/src/components/useBuilds.ts similarity index 92% rename from plugins/jenkins/src/state/useBuilds.ts rename to plugins/jenkins/src/components/useBuilds.ts index deb3125637..62e3719dbd 100644 --- a/plugins/jenkins/src/state/useBuilds.ts +++ b/plugins/jenkins/src/components/useBuilds.ts @@ -56,8 +56,9 @@ export function useBuilds(owner: string, repo: string, branch?: string) { }); }, [repo, getBuilds]); - const { loading, value, retry } = useAsyncRetry( - () => getBuilds().then(builds => builds ?? [], restartBuild), + const { loading, value: builds, retry } = useAsyncRetry( + () => + getBuilds().then(retrievedBuilds => retrievedBuilds ?? [], restartBuild), [page, pageSize, getBuilds], ); @@ -67,12 +68,12 @@ export function useBuilds(owner: string, repo: string, branch?: string) { page, pageSize, loading, - value, + builds, projectName, total, }, { - getBuilds, + builds, setPage, setPageSize, restartBuild, diff --git a/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsBuildsWidget.tsx b/plugins/jenkins/src/components/useProjectSlugFromEntity.ts similarity index 66% rename from plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsBuildsWidget.tsx rename to plugins/jenkins/src/components/useProjectSlugFromEntity.ts index 12eaf5653b..1dca918990 100644 --- a/plugins/jenkins/src/components/JenkinsPluginWidget/JenkinsBuildsWidget.tsx +++ b/plugins/jenkins/src/components/useProjectSlugFromEntity.ts @@ -13,15 +13,14 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { useEntity } from '@backstage/plugin-catalog'; +import { JENKINS_ANNOTATION } from '../constants'; -import React from 'react'; -import { Builds } from '../../pages/BuildsPage/lib/Builds'; -import { Entity } from '@backstage/catalog-model'; +export const useProjectSlugFromEntity = () => { + const { entity } = useEntity(); -export const JenkinsBuildsWidget = ({ entity }: { entity: Entity }) => { const [owner, repo] = ( - entity?.metadata.annotations?.['jenkins.io/github-folder'] ?? '/' + entity.metadata.annotations?.[JENKINS_ANNOTATION] ?? '' ).split('/'); - - return ; + return { owner, repo }; }; diff --git a/plugins/jenkins/src/pages/BuildsPage/lib/Builds/index.ts b/plugins/jenkins/src/constants.ts similarity index 90% rename from plugins/jenkins/src/pages/BuildsPage/lib/Builds/index.ts rename to plugins/jenkins/src/constants.ts index e91a9496b7..fe8980de73 100644 --- a/plugins/jenkins/src/pages/BuildsPage/lib/Builds/index.ts +++ b/plugins/jenkins/src/constants.ts @@ -13,4 +13,4 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -export { Builds } from './Builds'; +export const JENKINS_ANNOTATION = 'jenkins.io/github-folder'; diff --git a/plugins/jenkins/src/index.ts b/plugins/jenkins/src/index.ts index c7f2d8dc28..30fa0c70a5 100644 --- a/plugins/jenkins/src/index.ts +++ b/plugins/jenkins/src/index.ts @@ -14,5 +14,8 @@ * limitations under the License. */ -export { plugin, JenkinsBuildsWidget, JenkinsLastBuildWidget } from './plugin'; +export { plugin } from './plugin'; +export { LatestRunCard } from './components/Cards'; +export { Router, isPluginApplicableToEntity } from './components/Router'; +export { JENKINS_ANNOTATION } from './constants'; export * from './api'; diff --git a/plugins/jenkins/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx b/plugins/jenkins/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx deleted file mode 100644 index ab4fc3f34f..0000000000 --- a/plugins/jenkins/src/pages/BuildWithStepsPage/BuildWithStepsPage.tsx +++ /dev/null @@ -1,164 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import React, { FC, useEffect } from 'react'; -import { useSearchParams } from 'react-router-dom'; -import { Content, InfoCard, Progress } from '@backstage/core'; -import { Grid, Box, Link, IconButton } from '@material-ui/core'; -import { makeStyles } from '@material-ui/core/styles'; -import { PluginHeader } from '../../components/PluginHeader'; -import { ActionOutput } from './lib/ActionOutput/ActionOutput'; -import { Layout } from '../../components/Layout'; -import LaunchIcon from '@material-ui/icons/Launch'; -import GitHubIcon from '@material-ui/icons/GitHub'; -import { useBuildWithSteps } from '../../state/useBuildWithSteps'; - -const IconLink = IconButton as typeof Link; -const BuildName: FC<{ build?: any }> = ({ build }) => ( - - {build?.buildName} - - {/* TODO use Jenkins logo*/} - - - - - -); -const useStyles = makeStyles(theme => ({ - neutral: {}, - failed: { - position: 'relative', - '&:after': { - pointerEvents: 'none', - content: '""', - position: 'absolute', - top: 0, - right: 0, - left: 0, - bottom: 0, - boxShadow: `inset 4px 0px 0px ${theme.palette.error.main}`, - }, - }, - running: { - position: 'relative', - '&:after': { - pointerEvents: 'none', - content: '""', - position: 'absolute', - top: 0, - right: 0, - left: 0, - bottom: 0, - boxShadow: `inset 4px 0px 0px ${theme.palette.info.main}`, - }, - }, - cardContent: { - backgroundColor: theme.palette.background.default, - }, - success: { - position: 'relative', - '&:after': { - pointerEvents: 'none', - content: '""', - position: 'absolute', - top: 0, - right: 0, - left: 0, - bottom: 0, - boxShadow: `inset 4px 0px 0px ${theme.palette.success.main}`, - }, - }, -})); - -const pickClassName = ( - classes: ReturnType, - build: any = {}, -) => { - if (build.result === 'UNSTABLE') return classes.failed; - if (build.result === 'FAILURE') return classes.failed; - if (build.building) return classes.running; - if (build.status === 'SUCCESS') return classes.success; - - return classes.neutral; -}; - -const Page = () => ( - - - - - -); - -const BuildWithStepsView = () => { - const [searchParams] = useSearchParams(); - const buildPath = searchParams.get('url') || ''; - const classes = useStyles(); - const [{ loading, value }, { startPolling, stopPolling }] = useBuildWithSteps( - buildPath, - ); - - useEffect(() => { - startPolling(); - return () => stopPolling(); - }, [buildPath, startPolling, stopPolling]); - return ( - <> - - - - - } - cardClassName={classes.cardContent} - > - {loading ? : } - - - - - ); -}; - -const BuildsList: FC<{ build?: any }> = ({ build }) => ( - - {build && - build.steps && - build.steps.map(({ name, actions }: { name: string; actions: any[] }) => ( - - ))} - -); - -const ActionsList: FC<{ actions: any[]; name: string }> = ({ actions }) => { - const classes = useStyles(); - return ( - <> - {actions.map((action: any) => ( - - ))} - - ); -}; - -export default Page; -export { BuildWithStepsView as BuildWithSteps }; diff --git a/plugins/jenkins/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/jenkins/src/pages/BuildsPage/lib/Builds/Builds.tsx deleted file mode 100644 index 79f081c82d..0000000000 --- a/plugins/jenkins/src/pages/BuildsPage/lib/Builds/Builds.tsx +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import React from 'react'; -import { CITable } from '../CITable'; -import { useBuilds } from '../../../../state'; - -export const Builds = ({ owner, repo }: { owner: string; repo: string }) => { - const [ - { total, loading, value, projectName, page, pageSize }, - { setPage, retry, setPageSize }, - ] = useBuilds(owner, repo); - return ( - - ); -}; diff --git a/plugins/jenkins/src/plugin.ts b/plugins/jenkins/src/plugin.ts index 4d1af322c4..8282f6b7f9 100644 --- a/plugins/jenkins/src/plugin.ts +++ b/plugins/jenkins/src/plugin.ts @@ -20,11 +20,15 @@ import { createApiFactory, configApiRef, } from '@backstage/core'; -import { DetailedViewPage } from './pages/BuildWithStepsPage'; import { jenkinsApiRef, JenkinsApi } from './api'; +export const rootRouteRef = createRouteRef({ + path: '', + title: 'Jenkins', +}); + export const buildRouteRef = createRouteRef({ - path: '/jenkins/job', + path: 'run/:branch/:buildNumber', title: 'Jenkins run', }); @@ -40,10 +44,4 @@ export const plugin = createPlugin({ ), }), ], - register({ router }) { - router.addRoute(buildRouteRef, DetailedViewPage); - }, }); - -export { JenkinsBuildsWidget } from './components/JenkinsPluginWidget/JenkinsBuildsWidget'; -export { JenkinsLastBuildWidget } from './components/JenkinsPluginWidget/JenkinsLastBuildWidget'; diff --git a/plugins/jenkins/src/state/index.ts b/plugins/jenkins/src/state/index.ts deleted file mode 100644 index d21a380c2a..0000000000 --- a/plugins/jenkins/src/state/index.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright 2020 Spotify AB - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -export * from './useBuilds'; -export * from './useBuildWithSteps'; From 678a9c90ded2ee3173ddfda75a8c2f1154d07632 Mon Sep 17 00:00:00 2001 From: Andrew Thauer <6507159+andrewthauer@users.noreply.github.com> Date: Sun, 13 Sep 2020 22:01:07 -0400 Subject: [PATCH 03/17] feat: add graphql api type --- .../software-catalog/descriptor-format.md | 1 + .../catalog-model/examples/swapi-graphql.yaml | 1174 +++++++++++++++++ plugins/api-docs/README.md | 5 +- plugins/api-docs/package.json | 2 + .../catalog/EntityPageApi/EntityPageApi.tsx | 8 +- .../ApiDefinitionCard/ApiDefinitionCard.tsx | 13 +- .../ApiEntityPage/ApiEntityPage.tsx | 1 + .../GraphQlDefinitionWidget.tsx | 66 + .../GraphQlDefinitionWidget/index.ts | 17 + yarn.lock | 2 +- 10 files changed, 1282 insertions(+), 7 deletions(-) create mode 100644 packages/catalog-model/examples/swapi-graphql.yaml create mode 100644 plugins/api-docs/src/components/GraphQlDefinitionWidget/GraphQlDefinitionWidget.tsx create mode 100644 plugins/api-docs/src/components/GraphQlDefinitionWidget/index.ts diff --git a/docs/features/software-catalog/descriptor-format.md b/docs/features/software-catalog/descriptor-format.md index fa4b8c23da..bf01f1972c 100644 --- a/docs/features/software-catalog/descriptor-format.md +++ b/docs/features/software-catalog/descriptor-format.md @@ -471,6 +471,7 @@ Describes the following entity kind: An API describes an interface that can be exposed by a component. The API can be defined in different formats, like [OpenAPI](https://swagger.io/specification/), [AsyncAPI](https://www.asyncapi.com/docs/specifications/latest/), +[GraphQL](https://graphql.org/learn/schema/), [gRPC](https://developers.google.com/protocol-buffers), or other formats. Descriptor files for this kind may look as follows. diff --git a/packages/catalog-model/examples/swapi-graphql.yaml b/packages/catalog-model/examples/swapi-graphql.yaml new file mode 100644 index 0000000000..152d9c0afa --- /dev/null +++ b/packages/catalog-model/examples/swapi-graphql.yaml @@ -0,0 +1,1174 @@ +apiVersion: backstage.io/v1alpha1 +kind: API +metadata: + name: starwars-graphql + description: SWAPI GraphQL Schema +spec: + type: graphql + definition: | + schema { + query: Root + } + + """A single film.""" + type Film implements Node { + """The title of this film.""" + title: String + + """The episode number of this film.""" + episodeID: Int + + """The opening paragraphs at the beginning of this film.""" + openingCrawl: String + + """The name of the director of this film.""" + director: String + + """The name(s) of the producer(s) of this film.""" + producers: [String] + + """The ISO 8601 date format of film release at original creator country.""" + releaseDate: String + speciesConnection(after: String, first: Int, before: String, last: Int): FilmSpeciesConnection + starshipConnection(after: String, first: Int, before: String, last: Int): FilmStarshipsConnection + vehicleConnection(after: String, first: Int, before: String, last: Int): FilmVehiclesConnection + characterConnection(after: String, first: Int, before: String, last: Int): FilmCharactersConnection + planetConnection(after: String, first: Int, before: String, last: Int): FilmPlanetsConnection + + """The ISO 8601 date format of the time that this resource was created.""" + created: String + + """The ISO 8601 date format of the time that this resource was edited.""" + edited: String + + """The ID of an object""" + id: ID! + } + + """A connection to a list of items.""" + type FilmCharactersConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [FilmCharactersEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + characters: [Person] + } + + """An edge in a connection.""" + type FilmCharactersEdge { + """The item at the end of the edge""" + node: Person + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type FilmPlanetsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [FilmPlanetsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + planets: [Planet] + } + + """An edge in a connection.""" + type FilmPlanetsEdge { + """The item at the end of the edge""" + node: Planet + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type FilmsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [FilmsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + films: [Film] + } + + """An edge in a connection.""" + type FilmsEdge { + """The item at the end of the edge""" + node: Film + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type FilmSpeciesConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [FilmSpeciesEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + species: [Species] + } + + """An edge in a connection.""" + type FilmSpeciesEdge { + """The item at the end of the edge""" + node: Species + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type FilmStarshipsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [FilmStarshipsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + starships: [Starship] + } + + """An edge in a connection.""" + type FilmStarshipsEdge { + """The item at the end of the edge""" + node: Starship + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type FilmVehiclesConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [FilmVehiclesEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + vehicles: [Vehicle] + } + + """An edge in a connection.""" + type FilmVehiclesEdge { + """The item at the end of the edge""" + node: Vehicle + + """A cursor for use in pagination""" + cursor: String! + } + + """An object with an ID""" + interface Node { + """The id of the object.""" + id: ID! + } + + """Information about pagination in a connection.""" + type PageInfo { + """When paginating forwards, are there more items?""" + hasNextPage: Boolean! + + """When paginating backwards, are there more items?""" + hasPreviousPage: Boolean! + + """When paginating backwards, the cursor to continue.""" + startCursor: String + + """When paginating forwards, the cursor to continue.""" + endCursor: String + } + + """A connection to a list of items.""" + type PeopleConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [PeopleEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + people: [Person] + } + + """An edge in a connection.""" + type PeopleEdge { + """The item at the end of the edge""" + node: Person + + """A cursor for use in pagination""" + cursor: String! + } + + """An individual person or character within the Star Wars universe.""" + type Person implements Node { + """The name of this person.""" + name: String + + """ + The birth year of the person, using the in-universe standard of BBY or ABY - + Before the Battle of Yavin or After the Battle of Yavin. The Battle of Yavin is + a battle that occurs at the end of Star Wars episode IV: A New Hope. + """ + birthYear: String + + """ + The eye color of this person. Will be "unknown" if not known or "n/a" if the + person does not have an eye. + """ + eyeColor: String + + """ + The gender of this person. Either "Male", "Female" or "unknown", + "n/a" if the person does not have a gender. + """ + gender: String + + """ + The hair color of this person. Will be "unknown" if not known or "n/a" if the + person does not have hair. + """ + hairColor: String + + """The height of the person in centimeters.""" + height: Int + + """The mass of the person in kilograms.""" + mass: Float + + """The skin color of this person.""" + skinColor: String + + """A planet that this person was born on or inhabits.""" + homeworld: Planet + filmConnection(after: String, first: Int, before: String, last: Int): PersonFilmsConnection + + """The species that this person belongs to, or null if unknown.""" + species: Species + starshipConnection(after: String, first: Int, before: String, last: Int): PersonStarshipsConnection + vehicleConnection(after: String, first: Int, before: String, last: Int): PersonVehiclesConnection + + """The ISO 8601 date format of the time that this resource was created.""" + created: String + + """The ISO 8601 date format of the time that this resource was edited.""" + edited: String + + """The ID of an object""" + id: ID! + } + + """A connection to a list of items.""" + type PersonFilmsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [PersonFilmsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + films: [Film] + } + + """An edge in a connection.""" + type PersonFilmsEdge { + """The item at the end of the edge""" + node: Film + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type PersonStarshipsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [PersonStarshipsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + starships: [Starship] + } + + """An edge in a connection.""" + type PersonStarshipsEdge { + """The item at the end of the edge""" + node: Starship + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type PersonVehiclesConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [PersonVehiclesEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + vehicles: [Vehicle] + } + + """An edge in a connection.""" + type PersonVehiclesEdge { + """The item at the end of the edge""" + node: Vehicle + + """A cursor for use in pagination""" + cursor: String! + } + + """ + A large mass, planet or planetoid in the Star Wars Universe, at the time of + 0 ABY. + """ + type Planet implements Node { + """The name of this planet.""" + name: String + + """The diameter of this planet in kilometers.""" + diameter: Int + + """ + The number of standard hours it takes for this planet to complete a single + rotation on its axis. + """ + rotationPeriod: Int + + """ + The number of standard days it takes for this planet to complete a single orbit + of its local star. + """ + orbitalPeriod: Int + + """ + A number denoting the gravity of this planet, where "1" is normal or 1 standard + G. "2" is twice or 2 standard Gs. "0.5" is half or 0.5 standard Gs. + """ + gravity: String + + """The average population of sentient beings inhabiting this planet.""" + population: Float + + """The climates of this planet.""" + climates: [String] + + """The terrains of this planet.""" + terrains: [String] + + """ + The percentage of the planet surface that is naturally occuring water or bodies + of water. + """ + surfaceWater: Float + residentConnection(after: String, first: Int, before: String, last: Int): PlanetResidentsConnection + filmConnection(after: String, first: Int, before: String, last: Int): PlanetFilmsConnection + + """The ISO 8601 date format of the time that this resource was created.""" + created: String + + """The ISO 8601 date format of the time that this resource was edited.""" + edited: String + + """The ID of an object""" + id: ID! + } + + """A connection to a list of items.""" + type PlanetFilmsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [PlanetFilmsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + films: [Film] + } + + """An edge in a connection.""" + type PlanetFilmsEdge { + """The item at the end of the edge""" + node: Film + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type PlanetResidentsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [PlanetResidentsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + residents: [Person] + } + + """An edge in a connection.""" + type PlanetResidentsEdge { + """The item at the end of the edge""" + node: Person + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type PlanetsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [PlanetsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + planets: [Planet] + } + + """An edge in a connection.""" + type PlanetsEdge { + """The item at the end of the edge""" + node: Planet + + """A cursor for use in pagination""" + cursor: String! + } + + type Root { + allFilms(after: String, first: Int, before: String, last: Int): FilmsConnection + film(id: ID, filmID: ID): Film + allPeople(after: String, first: Int, before: String, last: Int): PeopleConnection + person(id: ID, personID: ID): Person + allPlanets(after: String, first: Int, before: String, last: Int): PlanetsConnection + planet(id: ID, planetID: ID): Planet + allSpecies(after: String, first: Int, before: String, last: Int): SpeciesConnection + species(id: ID, speciesID: ID): Species + allStarships(after: String, first: Int, before: String, last: Int): StarshipsConnection + starship(id: ID, starshipID: ID): Starship + allVehicles(after: String, first: Int, before: String, last: Int): VehiclesConnection + vehicle(id: ID, vehicleID: ID): Vehicle + + """Fetches an object given its ID""" + node( + """The ID of an object""" + id: ID! + ): Node + } + + """A type of person or character within the Star Wars Universe.""" + type Species implements Node { + """The name of this species.""" + name: String + + """The classification of this species, such as "mammal" or "reptile".""" + classification: String + + """The designation of this species, such as "sentient".""" + designation: String + + """The average height of this species in centimeters.""" + averageHeight: Float + + """The average lifespan of this species in years, null if unknown.""" + averageLifespan: Int + + """ + Common eye colors for this species, null if this species does not typically + have eyes. + """ + eyeColors: [String] + + """ + Common hair colors for this species, null if this species does not typically + have hair. + """ + hairColors: [String] + + """ + Common skin colors for this species, null if this species does not typically + have skin. + """ + skinColors: [String] + + """The language commonly spoken by this species.""" + language: String + + """A planet that this species originates from.""" + homeworld: Planet + personConnection(after: String, first: Int, before: String, last: Int): SpeciesPeopleConnection + filmConnection(after: String, first: Int, before: String, last: Int): SpeciesFilmsConnection + + """The ISO 8601 date format of the time that this resource was created.""" + created: String + + """The ISO 8601 date format of the time that this resource was edited.""" + edited: String + + """The ID of an object""" + id: ID! + } + + """A connection to a list of items.""" + type SpeciesConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [SpeciesEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + species: [Species] + } + + """An edge in a connection.""" + type SpeciesEdge { + """The item at the end of the edge""" + node: Species + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type SpeciesFilmsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [SpeciesFilmsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + films: [Film] + } + + """An edge in a connection.""" + type SpeciesFilmsEdge { + """The item at the end of the edge""" + node: Film + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type SpeciesPeopleConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [SpeciesPeopleEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + people: [Person] + } + + """An edge in a connection.""" + type SpeciesPeopleEdge { + """The item at the end of the edge""" + node: Person + + """A cursor for use in pagination""" + cursor: String! + } + + """A single transport craft that has hyperdrive capability.""" + type Starship implements Node { + """The name of this starship. The common name, such as "Death Star".""" + name: String + + """ + The model or official name of this starship. Such as "T-65 X-wing" or "DS-1 + Orbital Battle Station". + """ + model: String + + """ + The class of this starship, such as "Starfighter" or "Deep Space Mobile + Battlestation" + """ + starshipClass: String + + """The manufacturers of this starship.""" + manufacturers: [String] + + """The cost of this starship new, in galactic credits.""" + costInCredits: Float + + """The length of this starship in meters.""" + length: Float + + """The number of personnel needed to run or pilot this starship.""" + crew: String + + """The number of non-essential people this starship can transport.""" + passengers: String + + """ + The maximum speed of this starship in atmosphere. null if this starship is + incapable of atmosphering flight. + """ + maxAtmospheringSpeed: Int + + """The class of this starships hyperdrive.""" + hyperdriveRating: Float + + """ + The Maximum number of Megalights this starship can travel in a standard hour. + A "Megalight" is a standard unit of distance and has never been defined before + within the Star Wars universe. This figure is only really useful for measuring + the difference in speed of starships. We can assume it is similar to AU, the + distance between our Sun (Sol) and Earth. + """ + MGLT: Int + + """The maximum number of kilograms that this starship can transport.""" + cargoCapacity: Float + + """ + The maximum length of time that this starship can provide consumables for its + entire crew without having to resupply. + """ + consumables: String + pilotConnection(after: String, first: Int, before: String, last: Int): StarshipPilotsConnection + filmConnection(after: String, first: Int, before: String, last: Int): StarshipFilmsConnection + + """The ISO 8601 date format of the time that this resource was created.""" + created: String + + """The ISO 8601 date format of the time that this resource was edited.""" + edited: String + + """The ID of an object""" + id: ID! + } + + """A connection to a list of items.""" + type StarshipFilmsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [StarshipFilmsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + films: [Film] + } + + """An edge in a connection.""" + type StarshipFilmsEdge { + """The item at the end of the edge""" + node: Film + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type StarshipPilotsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [StarshipPilotsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + pilots: [Person] + } + + """An edge in a connection.""" + type StarshipPilotsEdge { + """The item at the end of the edge""" + node: Person + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type StarshipsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [StarshipsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + starships: [Starship] + } + + """An edge in a connection.""" + type StarshipsEdge { + """The item at the end of the edge""" + node: Starship + + """A cursor for use in pagination""" + cursor: String! + } + + """A single transport craft that does not have hyperdrive capability""" + type Vehicle implements Node { + """ + The name of this vehicle. The common name, such as "Sand Crawler" or "Speeder + bike". + """ + name: String + + """ + The model or official name of this vehicle. Such as "All-Terrain Attack + Transport". + """ + model: String + + """The class of this vehicle, such as "Wheeled" or "Repulsorcraft".""" + vehicleClass: String + + """The manufacturers of this vehicle.""" + manufacturers: [String] + + """The cost of this vehicle new, in Galactic Credits.""" + costInCredits: Float + + """The length of this vehicle in meters.""" + length: Float + + """The number of personnel needed to run or pilot this vehicle.""" + crew: String + + """The number of non-essential people this vehicle can transport.""" + passengers: String + + """The maximum speed of this vehicle in atmosphere.""" + maxAtmospheringSpeed: Int + + """The maximum number of kilograms that this vehicle can transport.""" + cargoCapacity: Float + + """ + The maximum length of time that this vehicle can provide consumables for its + entire crew without having to resupply. + """ + consumables: String + pilotConnection(after: String, first: Int, before: String, last: Int): VehiclePilotsConnection + filmConnection(after: String, first: Int, before: String, last: Int): VehicleFilmsConnection + + """The ISO 8601 date format of the time that this resource was created.""" + created: String + + """The ISO 8601 date format of the time that this resource was edited.""" + edited: String + + """The ID of an object""" + id: ID! + } + + """A connection to a list of items.""" + type VehicleFilmsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [VehicleFilmsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + films: [Film] + } + + """An edge in a connection.""" + type VehicleFilmsEdge { + """The item at the end of the edge""" + node: Film + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type VehiclePilotsConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [VehiclePilotsEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + pilots: [Person] + } + + """An edge in a connection.""" + type VehiclePilotsEdge { + """The item at the end of the edge""" + node: Person + + """A cursor for use in pagination""" + cursor: String! + } + + """A connection to a list of items.""" + type VehiclesConnection { + """Information to aid in pagination.""" + pageInfo: PageInfo! + + """A list of edges.""" + edges: [VehiclesEdge] + + """ + A count of the total number of objects in this connection, ignoring pagination. + This allows a client to fetch the first five objects by passing "5" as the + argument to "first", then fetch the total count so it could display "5 of 83", + for example. + """ + totalCount: Int + + """ + A list of all of the objects returned in the connection. This is a convenience + field provided for quickly exploring the API; rather than querying for + "{ edges { node } }" when no edge data is needed, this field can be be used + instead. Note that when clients like Relay need to fetch the "cursor" field on + the edge to enable efficient pagination, this shortcut cannot be used, and the + full "{ edges { node } }" version should be used instead. + """ + vehicles: [Vehicle] + } + + """An edge in a connection.""" + type VehiclesEdge { + """The item at the end of the edge""" + node: Vehicle + + """A cursor for use in pagination""" + cursor: String! + } diff --git a/plugins/api-docs/README.md b/plugins/api-docs/README.md index db78b60373..17f354e997 100644 --- a/plugins/api-docs/README.md +++ b/plugins/api-docs/README.md @@ -14,8 +14,9 @@ The plugin provides a standalone list of APIs, as well as an integration into th Right now, the following API formats are supported: -- [OpenAPI](https://swagger.io/specification/) 2 & 3, -- [AsyncAPI](https://www.asyncapi.com/docs/specifications/latest/), +- [OpenAPI](https://swagger.io/specification/) 2 & 3 +- [AsyncAPI](https://www.asyncapi.com/docs/specifications/latest/) +- [GraphQL](https://graphql.org/learn/schema/) Other formats are displayed as plain text, but this can easily be extented. diff --git a/plugins/api-docs/package.json b/plugins/api-docs/package.json index a913316925..25e5c6b900 100644 --- a/plugins/api-docs/package.json +++ b/plugins/api-docs/package.json @@ -29,6 +29,8 @@ "@material-ui/core": "^4.11.0", "@material-ui/icons": "^4.9.1", "@material-ui/lab": "4.0.0-alpha.45", + "graphiql": "^1.0.0-alpha.10", + "graphql": "^15.3.0", "react": "^16.13.1", "react-dom": "^16.13.1", "react-router": "6.0.0-beta.0", diff --git a/plugins/api-docs/src/catalog/EntityPageApi/EntityPageApi.tsx b/plugins/api-docs/src/catalog/EntityPageApi/EntityPageApi.tsx index f26691d58c..5383fc0570 100644 --- a/plugins/api-docs/src/catalog/EntityPageApi/EntityPageApi.tsx +++ b/plugins/api-docs/src/catalog/EntityPageApi/EntityPageApi.tsx @@ -16,7 +16,7 @@ import { ComponentEntity, Entity } from '@backstage/catalog-model'; import { Progress } from '@backstage/core'; -import React, { FC } from 'react'; +import React from 'react'; import { Grid } from '@material-ui/core'; import { ApiDefinitionCard, @@ -24,7 +24,11 @@ import { useComponentApiNames, } from '../../components'; -export const EntityPageApi: FC<{ entity: Entity }> = ({ entity }) => { +type Props = { + entity: Entity; +}; + +export const EntityPageApi = ({ entity }: Props) => { const apiNames = useComponentApiNames(entity as ComponentEntity); const { apiEntities, loading } = useComponentApiEntities({ diff --git a/plugins/api-docs/src/components/ApiDefinitionCard/ApiDefinitionCard.tsx b/plugins/api-docs/src/components/ApiDefinitionCard/ApiDefinitionCard.tsx index 5650b0745f..055363ae1f 100644 --- a/plugins/api-docs/src/components/ApiDefinitionCard/ApiDefinitionCard.tsx +++ b/plugins/api-docs/src/components/ApiDefinitionCard/ApiDefinitionCard.tsx @@ -15,12 +15,13 @@ */ import { ApiEntity } from '@backstage/catalog-model'; -import { TabbedCard, CardTab } from '@backstage/core'; +import { CardTab, TabbedCard } from '@backstage/core'; +import { Alert } from '@material-ui/lab'; import React from 'react'; import { PlainApiDefinitionWidget } from '../PlainApiDefinitionWidget'; -import { Alert } from '@material-ui/lab'; import { OpenApiDefinitionWidget } from '../OpenApiDefinitionWidget'; import { AsyncApiDefinitionWidget } from '../AsyncApiDefinitionWidget'; +import { GraphQlDefinitionWidget } from '../GraphQlDefinitionWidget'; type ApiDefinitionWidget = { type: string; @@ -47,6 +48,14 @@ export function defaultDefinitionWidgets(): ApiDefinitionWidget[] { ), }, + { + type: 'graphql', + title: 'GraphQL', + rawLanguage: 'graphql', + component: definition => ( + + ), + }, ]; } diff --git a/plugins/api-docs/src/components/ApiEntityPage/ApiEntityPage.tsx b/plugins/api-docs/src/components/ApiEntityPage/ApiEntityPage.tsx index aa0df3f20f..b7e9996cc0 100644 --- a/plugins/api-docs/src/components/ApiEntityPage/ApiEntityPage.tsx +++ b/plugins/api-docs/src/components/ApiEntityPage/ApiEntityPage.tsx @@ -34,6 +34,7 @@ import { useAsync } from 'react-use'; import { ApiDefinitionCard } from '../ApiDefinitionCard'; const REDIRECT_DELAY = 1000; + function headerProps( kind: string, namespace: string | undefined, diff --git a/plugins/api-docs/src/components/GraphQlDefinitionWidget/GraphQlDefinitionWidget.tsx b/plugins/api-docs/src/components/GraphQlDefinitionWidget/GraphQlDefinitionWidget.tsx new file mode 100644 index 0000000000..7e01df1460 --- /dev/null +++ b/plugins/api-docs/src/components/GraphQlDefinitionWidget/GraphQlDefinitionWidget.tsx @@ -0,0 +1,66 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import React, { Suspense } from 'react'; +import { buildSchema } from 'graphql'; +import { makeStyles } from '@material-ui/core/styles'; +import { Progress } from '@backstage/core'; +import { BackstageTheme } from '@backstage/theme'; + +const GraphiQL = React.lazy(() => import('graphiql')); + +const useStyles = makeStyles(() => ({ + root: { + height: '100%', + display: 'flex', + flexFlow: 'column nowrap', + }, + graphiQlWrapper: { + flex: 1, + '@global': { + '.graphiql-container': { + boxSizing: 'initial', + height: '100%', + minHeight: '600px', + flex: '1 1 auto', + }, + }, + }, +})); + +type Props = { + definition: any; +}; + +export const GraphQlDefinitionWidget = ({ definition }: Props) => { + const classes = useStyles(); + const schema = buildSchema(definition); + + return ( + }> +
+
+ Promise.resolve(null) as any} + schema={schema} + docExplorerOpen + defaultSecondaryEditorOpen={false} + /> +
+
+
+ ); +}; diff --git a/plugins/api-docs/src/components/GraphQlDefinitionWidget/index.ts b/plugins/api-docs/src/components/GraphQlDefinitionWidget/index.ts new file mode 100644 index 0000000000..b60545de15 --- /dev/null +++ b/plugins/api-docs/src/components/GraphQlDefinitionWidget/index.ts @@ -0,0 +1,17 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +export { GraphQlDefinitionWidget } from './GraphQlDefinitionWidget'; diff --git a/yarn.lock b/yarn.lock index 11bb8a3fd8..38f5d6c799 100644 --- a/yarn.lock +++ b/yarn.lock @@ -17550,7 +17550,7 @@ react-is@^16.12.0, react-is@^16.6.0, react-is@^16.7.0, react-is@^16.8.0, react-i resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-lazylog@^4.5.2: +react-lazylog@^4.5.2, react-lazylog@^4.5.3: version "4.5.3" resolved "https://registry.npmjs.org/react-lazylog/-/react-lazylog-4.5.3.tgz#289e24995b5599e75943556ac63f5e2c04d0001e" integrity sha512-lyov32A/4BqihgXgtNXTHCajXSXkYHPlIEmV8RbYjHIMxCFSnmtdg4kDCI3vATz7dURtiFTvrw5yonHnrS+NNg== From 4c0c0bfd509244ccea0ea1720991a675cb86d03a Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 11 Sep 2020 09:28:07 -0400 Subject: [PATCH 04/17] Add the ability to configure repository visibility via config --- packages/backend/src/plugins/scaffolder.ts | 19 +- .../scaffolder/stages/publish/github.test.ts | 318 ++++++++++-------- .../src/scaffolder/stages/publish/github.ts | 31 +- 3 files changed, 219 insertions(+), 149 deletions(-) diff --git a/packages/backend/src/plugins/scaffolder.ts b/packages/backend/src/plugins/scaffolder.ts index a9e5f185ec..abbcdae1ae 100644 --- a/packages/backend/src/plugins/scaffolder.ts +++ b/packages/backend/src/plugins/scaffolder.ts @@ -23,12 +23,16 @@ import { GithubPublisher, CreateReactAppTemplater, Templaters, + RepoVisilityOptions, } from '@backstage/plugin-scaffolder-backend'; import { Octokit } from '@octokit/rest'; import type { PluginEnvironment } from '../types'; import Docker from 'dockerode'; -export default async function createPlugin({ logger }: PluginEnvironment) { +export default async function createPlugin({ + logger, + config, +}: PluginEnvironment) { const cookiecutterTemplater = new CookieCutter(); const craTemplater = new CreateReactAppTemplater(); const templaters = new Templaters(); @@ -42,8 +46,17 @@ export default async function createPlugin({ logger }: PluginEnvironment) { preparers.register('file', filePreparer); preparers.register('github', githubPreparer); - const githubClient = new Octokit({ auth: process.env.GITHUB_ACCESS_TOKEN }); - const publisher = new GithubPublisher({ client: githubClient }); + const githubToken = config.getString('scaffolder.github.token'); + const repoVisibility = config.getString( + 'scaffolder.github.visibility', + ) as RepoVisilityOptions; + + const githubClient = new Octokit({ auth: githubToken }); + const publisher = new GithubPublisher({ + client: githubClient, + token: githubToken, + repoVisibility, + }); const dockerClient = new Docker(); return await createRouter({ diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts index 718c01438c..dd1152d3d5 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts @@ -53,14 +53,78 @@ const { }; describe('GitHub Publisher', () => { - const publisher = new GithubPublisher({ client: new Octokit() }); - beforeEach(() => { jest.clearAllMocks(); }); - describe('publish: createRemoteInGithub', () => { - it('should use octokit to create a repo in an organisation if the organisation property is set', async () => { + describe('with public repo visibility', () => { + const publisher = new GithubPublisher({ + client: new Octokit(), + token: 'abc', + repoVisibility: 'public', + }); + + describe('publish: createRemoteInGithub', () => { + it('should use octokit to create a repo in an organisation if the organisation property is set', async () => { + mockGithubClient.repos.createInOrg.mockResolvedValue({ + data: { + clone_url: 'mockclone', + }, + } as OctokitResponse); + + await publisher.publish({ + values: { + storePath: 'blam/test', + owner: 'bob', + }, + directory: '/tmp/test', + }); + + expect(mockGithubClient.repos.createInOrg).toHaveBeenCalledWith({ + org: 'blam', + name: 'test', + private: false, + visibility: 'public', + }); + }); + + it('should use octokit to create a repo in the authed user if the organisation property is not set', async () => { + mockGithubClient.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'mockclone', + }, + } as OctokitResponse); + mockGithubClient.users.getByUsername.mockResolvedValue({ + data: { + type: 'User', + }, + } as OctokitResponse); + + await publisher.publish({ + values: { + storePath: 'blam/test', + owner: 'bob', + }, + directory: '/tmp/test', + }); + + expect( + mockGithubClient.repos.createForAuthenticatedUser, + ).toHaveBeenCalledWith({ + name: 'test', + }); + }); + }); + + describe('publish: createGitDirectory', () => { + const values = { + isOrg: true, + storePath: 'blam/test', + owner: 'lols', + }; + + const mockDir = '/tmp/test/dir'; + mockGithubClient.repos.createInOrg.mockResolvedValue({ data: { clone_url: 'mockclone', @@ -72,8 +136,116 @@ describe('GitHub Publisher', () => { }, } as OctokitResponse); + it('should call init on the repo with the directory', async () => { + await publisher.publish({ + values, + directory: mockDir, + }); + + expect(Repository.init).toHaveBeenCalledWith(mockDir, 0); + }); + + it('should call refresh index on the index and write the new files', async () => { + await publisher.publish({ + values, + directory: mockDir, + }); + + expect(mockRepo.refreshIndex).toHaveBeenCalled(); + }); + + it('should call add all files and write', async () => { + await publisher.publish({ + values, + directory: mockDir, + }); + + expect(mockIndex.addAll).toHaveBeenCalled(); + expect(mockIndex.write).toHaveBeenCalled(); + expect(mockIndex.writeTree).toHaveBeenCalled(); + }); + + it('should create a commit with on head with the right name and commiter', async () => { + const mockSignature = { mockSignature: 'bloblly' }; + Signature.now.mockReturnValue(mockSignature); + + await publisher.publish({ + values, + directory: mockDir, + }); + + expect(Signature.now).toHaveBeenCalledTimes(2); + expect(Signature.now).toHaveBeenCalledWith( + 'Scaffolder', + 'scaffolder@backstage.io', + ); + + expect(mockRepo.createCommit).toHaveBeenCalledWith( + 'HEAD', + mockSignature, + mockSignature, + 'initial commit', + 'mockoid', + [], + ); + }); + + it('creates a remote with the repo and remote', async () => { + await publisher.publish({ + values, + directory: mockDir, + }); + + expect(Remote.create).toHaveBeenCalledWith( + mockRepo, + 'origin', + 'mockclone', + ); + }); + + it('shoud push to the remote repo', async () => { + await publisher.publish({ + values, + directory: mockDir, + }); + + const [remotes, { callbacks }] = mockRemote.push.mock + .calls[0] as NodeGit.PushOptions[]; + + expect(remotes).toEqual(['refs/heads/master:refs/heads/master']); + + callbacks?.credentials?.(); + + expect(Cred.userpassPlaintextNew).toHaveBeenCalledWith( + 'abc', + 'x-oauth-basic', + ); + }); + }); + }); + + describe('with internal repo visibility', () => { + const publisher = new GithubPublisher({ + client: new Octokit(), + token: 'abc', + repoVisibility: 'internal', + }); + + it('creates a repo in an organisation with internal visibility', async () => { + mockGithubClient.repos.createInOrg.mockResolvedValue({ + data: { + clone_url: 'mockclone', + }, + } as OctokitResponse); + mockGithubClient.users.getByUsername.mockResolvedValue({ + data: { + type: 'Organization', + }, + } as OctokitResponse); + await publisher.publish({ values: { + isOrg: true, storePath: 'blam/test', owner: 'bob', }, @@ -83,143 +255,9 @@ describe('GitHub Publisher', () => { expect(mockGithubClient.repos.createInOrg).toHaveBeenCalledWith({ org: 'blam', name: 'test', + private: true, + visibility: 'internal', }); }); - - it('should use octokit to create a repo in the authed user if the organisation property is not set', async () => { - mockGithubClient.repos.createForAuthenticatedUser.mockResolvedValue({ - data: { - clone_url: 'mockclone', - }, - } as OctokitResponse); - mockGithubClient.users.getByUsername.mockResolvedValue({ - data: { - type: 'User', - }, - } as OctokitResponse); - - await publisher.publish({ - values: { - storePath: 'blam/test', - owner: 'bob', - }, - directory: '/tmp/test', - }); - - expect( - mockGithubClient.repos.createForAuthenticatedUser, - ).toHaveBeenCalledWith({ - name: 'test', - }); - }); - }); - - describe('publish: createGitDirectory', () => { - const values = { - isOrg: true, - storePath: 'blam/test', - owner: 'lols', - }; - - const mockDir = '/tmp/test/dir'; - - mockGithubClient.repos.createInOrg.mockResolvedValue({ - data: { - clone_url: 'mockclone', - }, - } as OctokitResponse); - mockGithubClient.users.getByUsername.mockResolvedValue({ - data: { - type: 'Organization', - }, - } as OctokitResponse); - - it('should call init on the repo with the directory', async () => { - await publisher.publish({ - values, - directory: mockDir, - }); - - expect(Repository.init).toHaveBeenCalledWith(mockDir, 0); - }); - - it('should call refresh index on the index and write the new files', async () => { - await publisher.publish({ - values, - directory: mockDir, - }); - - expect(mockRepo.refreshIndex).toHaveBeenCalled(); - }); - - it('should call add all files and write', async () => { - await publisher.publish({ - values, - directory: mockDir, - }); - - expect(mockIndex.addAll).toHaveBeenCalled(); - expect(mockIndex.write).toHaveBeenCalled(); - expect(mockIndex.writeTree).toHaveBeenCalled(); - }); - - it('should create a commit with on head with the right name and commiter', async () => { - const mockSignature = { mockSignature: 'bloblly' }; - Signature.now.mockReturnValue(mockSignature); - - await publisher.publish({ - values, - directory: mockDir, - }); - - expect(Signature.now).toHaveBeenCalledTimes(2); - expect(Signature.now).toHaveBeenCalledWith( - 'Scaffolder', - 'scaffolder@backstage.io', - ); - - expect(mockRepo.createCommit).toHaveBeenCalledWith( - 'HEAD', - mockSignature, - mockSignature, - 'initial commit', - 'mockoid', - [], - ); - }); - - it('creates a remote with the repo and remote', async () => { - await publisher.publish({ - values, - directory: mockDir, - }); - - expect(Remote.create).toHaveBeenCalledWith( - mockRepo, - 'origin', - 'mockclone', - ); - }); - - it('shoud push to the remote repo', async () => { - await publisher.publish({ - values, - directory: mockDir, - }); - - const [remotes, { callbacks }] = mockRemote.push.mock - .calls[0] as NodeGit.PushOptions[]; - - expect(remotes).toEqual(['refs/heads/master:refs/heads/master']); - - process.env.GITHUb_ACCESS_TOKEN = 'blob'; - - callbacks?.credentials?.(); - - expect(Cred.userpassPlaintextNew).toHaveBeenCalledWith( - process.env.GITHUB_ACCESS_TOKEN, - 'x-oauth-basic', - ); - }); }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts index f3306e3662..22a46ddf1b 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts @@ -21,10 +21,27 @@ import { JsonValue } from '@backstage/config'; import { RequiredTemplateValues } from '../templater'; import { Repository, Remote, Signature, Cred } from 'nodegit'; +export type RepoVisilityOptions = 'private' | 'internal' | 'public'; + +interface GithubPublisherParams { + client: Octokit; + token: string; + repoVisibility: RepoVisilityOptions; +} + export class GithubPublisher implements PublisherBase { private client: Octokit; - constructor({ client }: { client: Octokit }) { + private token: string; + private repoVisibility: RepoVisilityOptions; + + constructor({ + client, + token, + repoVisibility = 'public', + }: GithubPublisherParams) { this.client = client; + this.token = token; + this.repoVisibility = repoVisibility; } async publish({ @@ -49,7 +66,12 @@ export class GithubPublisher implements PublisherBase { const repoCreationPromise = user.data.type === 'Organization' - ? this.client.repos.createInOrg({ name, org: owner }) + ? this.client.repos.createInOrg({ + name, + org: owner, + private: this.repoVisibility !== 'public', + visibility: this.repoVisibility, + }) : this.client.repos.createForAuthenticatedUser({ name }); const { data } = await repoCreationPromise; @@ -76,10 +98,7 @@ export class GithubPublisher implements PublisherBase { await remoteRepo.push(['refs/heads/master:refs/heads/master'], { callbacks: { credentials: () => { - return Cred.userpassPlaintextNew( - process.env.GITHUB_ACCESS_TOKEN as string, - 'x-oauth-basic', - ); + return Cred.userpassPlaintextNew(this.token, 'x-oauth-basic'); }, }, }); From 6ea4ac7b17e2ab6643e25873bcfb22906eb71d0a Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 11 Sep 2020 10:11:11 -0400 Subject: [PATCH 05/17] Add config for scaffolder to create-app's app-config.yaml --- .../create-app/templates/default-app/app-config.yaml.hbs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/create-app/templates/default-app/app-config.yaml.hbs b/packages/create-app/templates/default-app/app-config.yaml.hbs index 7b86b4f50e..7282b732b4 100644 --- a/packages/create-app/templates/default-app/app-config.yaml.hbs +++ b/packages/create-app/templates/default-app/app-config.yaml.hbs @@ -47,6 +47,13 @@ lighthouse: auth: providers: {} +scaffolder: + github: + token: + $secret: + env: GITHUB_ACCESS_TOKEN + visibility: public # or 'internal' or 'private' + catalog: locations: # Backstage example components From a7d5ade5a16599e5797d03b9dec3bd42d9716dc9 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Tue, 15 Sep 2020 16:31:35 -0400 Subject: [PATCH 06/17] Merge GitHub scaffolding instructions --- .../software-templates/installation.md | 40 ++++++++++++++----- .../backend/src/plugins/scaffolder.ts | 19 +++++++-- 2 files changed, 47 insertions(+), 12 deletions(-) diff --git a/docs/features/software-templates/installation.md b/docs/features/software-templates/installation.md index eea78e3571..14bdc1318d 100644 --- a/docs/features/software-templates/installation.md +++ b/docs/features/software-templates/installation.md @@ -90,17 +90,19 @@ import { GithubPublisher, CreateReactAppTemplater, Templaters, + RepoVisilityOptions, } from '@backstage/plugin-scaffolder-backend'; import { Octokit } from '@octokit/rest'; import type { PluginEnvironment } from '../types'; import Docker from 'dockerode'; -export default async function createPlugin({ logger }: PluginEnvironment) { +export default async function createPlugin({ + logger, + config, +}: PluginEnvironment) { const cookiecutterTemplater = new CookieCutter(); const craTemplater = new CreateReactAppTemplater(); const templaters = new Templaters(); - - // Register default templaters templaters.register('cookiecutter', cookiecutterTemplater); templaters.register('cra', craTemplater); @@ -108,13 +110,20 @@ export default async function createPlugin({ logger }: PluginEnvironment) { const githubPreparer = new GithubPreparer(); const preparers = new Preparers(); - // Register default preparers preparers.register('file', filePreparer); preparers.register('github', githubPreparer); - // Create GitHub client with your access token from environment variables - const githubClient = new Octokit({ auth: process.env.GITHUB_ACCESS_TOKEN }); - const publisher = new GithubPublisher({ client: githubClient }); + const githubToken = config.getString('scaffolder.github.token'); + const repoVisibility = config.getString( + 'scaffolder.github.visibility', + ) as RepoVisilityOptions; + + const githubClient = new Octokit({ auth: githubToken }); + const publisher = new GithubPublisher({ + client: githubClient, + token: githubToken, + repoVisibility, + }); const dockerClient = new Docker(); return await createRouter({ @@ -177,8 +186,21 @@ docs on creating private GitHub access tokens is available Note that the need for private GitHub access tokens will be replaced with GitHub Apps integration further down the line. -The GitHub access token is passed along using the `GITHUB_ACCESS_TOKEN` -environment variable. +> **Right now it is only possible to scaffold repositories inside GitHub +> organizations, and not under personal accounts.** + +The Github access token is retrieved from environment variables by the +config. The config file needs to specify what environment variable the +token is retrieved from. Your config should have the following objects. + +```yaml +scaffolder: + github: + token: + $secret: + env: GITHUB_ACCESS_TOKEN + visibility: public # or 'internal' or 'private' +``` ### Running the Backend diff --git a/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts b/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts index ffa10cc3c6..fecef240df 100644 --- a/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts +++ b/packages/create-app/templates/default-app/packages/backend/src/plugins/scaffolder.ts @@ -7,12 +7,16 @@ import { GithubPublisher, CreateReactAppTemplater, Templaters, + RepoVisilityOptions, } from '@backstage/plugin-scaffolder-backend'; import { Octokit } from '@octokit/rest'; import type { PluginEnvironment } from '../types'; import Docker from 'dockerode'; -export default async function createPlugin({ logger }: PluginEnvironment) { +export default async function createPlugin({ + logger, + config, +}: PluginEnvironment) { const cookiecutterTemplater = new CookieCutter(); const craTemplater = new CreateReactAppTemplater(); const templaters = new Templaters(); @@ -26,8 +30,17 @@ export default async function createPlugin({ logger }: PluginEnvironment) { preparers.register('file', filePreparer); preparers.register('github', githubPreparer); - const githubClient = new Octokit({ auth: process.env.GITHUB_ACCESS_TOKEN }); - const publisher = new GithubPublisher({ client: githubClient }); + const githubToken = config.getString('scaffolder.github.token'); + const repoVisibility = config.getString( + 'scaffolder.github.visibility', + ) as RepoVisilityOptions; + + const githubClient = new Octokit({ auth: githubToken }); + const publisher = new GithubPublisher({ + client: githubClient, + token: githubToken, + repoVisibility, + }); const dockerClient = new Docker(); return await createRouter({ From e9e3c79295315a2be6c7924af3701d339bd79ed5 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 11 Sep 2020 11:12:27 -0400 Subject: [PATCH 07/17] Run prettier on docs/features/software-templates/installation.md --- docs/features/software-templates/installation.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/features/software-templates/installation.md b/docs/features/software-templates/installation.md index 14bdc1318d..b1c7712f85 100644 --- a/docs/features/software-templates/installation.md +++ b/docs/features/software-templates/installation.md @@ -189,9 +189,9 @@ Apps integration further down the line. > **Right now it is only possible to scaffold repositories inside GitHub > organizations, and not under personal accounts.** -The Github access token is retrieved from environment variables by the -config. The config file needs to specify what environment variable the -token is retrieved from. Your config should have the following objects. +The Github access token is retrieved from environment variables by the config. +The config file needs to specify what environment variable the token is +retrieved from. Your config should have the following objects. ```yaml scaffolder: From 404df7d0b248e7ddb44dd51fa95487432b5fac50 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 11 Sep 2020 13:48:53 -0400 Subject: [PATCH 08/17] Provide environment variable for scaffolder.github.token --- packages/e2e-test/src/e2e-test.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/e2e-test/src/e2e-test.ts b/packages/e2e-test/src/e2e-test.ts index 5dfac68d6a..2049a720a0 100644 --- a/packages/e2e-test/src/e2e-test.ts +++ b/packages/e2e-test/src/e2e-test.ts @@ -196,6 +196,7 @@ async function createApp( env: { ...process.env, APP_CONFIG_app_baseUrl: '"http://localhost:3001"', + APP_CONFIG_scaffolder_github_token: '"abc"', }, }); From d72577006df1af999c626ff8e3e664c2cda9da16 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Fri, 11 Sep 2020 14:49:28 -0400 Subject: [PATCH 09/17] Add missing environment variables from tests --- packages/e2e-test/src/e2e-test.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/packages/e2e-test/src/e2e-test.ts b/packages/e2e-test/src/e2e-test.ts index 2049a720a0..10d3cc9950 100644 --- a/packages/e2e-test/src/e2e-test.ts +++ b/packages/e2e-test/src/e2e-test.ts @@ -196,7 +196,6 @@ async function createApp( env: { ...process.env, APP_CONFIG_app_baseUrl: '"http://localhost:3001"', - APP_CONFIG_scaffolder_github_token: '"abc"', }, }); @@ -273,6 +272,10 @@ async function createPlugin(pluginName: string, appDir: string) { async function testAppServe(pluginName: string, appDir: string) { const startApp = spawnPiped(['yarn', 'start'], { cwd: appDir, + env: { + ...process.env, + GITHUB_ACCESS_TOKEN: 'abc', + }, }); Browser.localhost('localhost', 3000); @@ -343,6 +346,10 @@ async function testBackendStart(appDir: string, isPostgres: boolean) { const child = spawnPiped(['yarn', 'workspace', 'backend', 'start'], { cwd: appDir, + env: { + ...process.env, + GITHUB_ACCESS_TOKEN: 'abc', + }, }); let stdout = ''; From 6d3ce751004c675aaa516a2fed9bdc462f8b5eda Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Tue, 15 Sep 2020 07:29:42 -0400 Subject: [PATCH 10/17] Apply requested chanegs --- docs/features/software-templates/installation.md | 2 ++ .../src/scaffolder/stages/publish/github.test.ts | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/features/software-templates/installation.md b/docs/features/software-templates/installation.md index b1c7712f85..726f5faead 100644 --- a/docs/features/software-templates/installation.md +++ b/docs/features/software-templates/installation.md @@ -103,6 +103,7 @@ export default async function createPlugin({ const cookiecutterTemplater = new CookieCutter(); const craTemplater = new CreateReactAppTemplater(); const templaters = new Templaters(); + // Register default templaters templaters.register('cookiecutter', cookiecutterTemplater); templaters.register('cra', craTemplater); @@ -110,6 +111,7 @@ export default async function createPlugin({ const githubPreparer = new GithubPreparer(); const preparers = new Preparers(); + // Register default preparers preparers.register('file', filePreparer); preparers.register('github', githubPreparer); diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts index dd1152d3d5..90fdd106a1 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts @@ -231,7 +231,7 @@ describe('GitHub Publisher', () => { repoVisibility: 'internal', }); - it('creates a repo in an organisation with internal visibility', async () => { + it('creates a repo in an organisation if the organisation with private visibility', async () => { mockGithubClient.repos.createInOrg.mockResolvedValue({ data: { clone_url: 'mockclone', From 449b5c3f1564ecfe93fd3b8c8371e8dc8dc564b1 Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Tue, 15 Sep 2020 16:38:38 -0400 Subject: [PATCH 11/17] Fix prettier errors --- .../src/scaffolder/stages/publish/github.test.ts | 2 +- .../src/scaffolder/stages/publish/github.ts | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts index 90fdd106a1..2c47fa1a2f 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts @@ -242,7 +242,7 @@ describe('GitHub Publisher', () => { type: 'Organization', }, } as OctokitResponse); - + await publisher.publish({ values: { isOrg: true, diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts index 22a46ddf1b..671c3472bc 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts @@ -67,11 +67,11 @@ export class GithubPublisher implements PublisherBase { const repoCreationPromise = user.data.type === 'Organization' ? this.client.repos.createInOrg({ - name, - org: owner, - private: this.repoVisibility !== 'public', - visibility: this.repoVisibility, - }) + name, + org: owner, + private: this.repoVisibility !== 'public', + visibility: this.repoVisibility, + }) : this.client.repos.createForAuthenticatedUser({ name }); const { data } = await repoCreationPromise; From ef9117f50a7f1c9f5151aa642a0d097c3bd3dfa6 Mon Sep 17 00:00:00 2001 From: Iain Billett Date: Tue, 15 Sep 2020 18:06:44 +0100 Subject: [PATCH 12/17] Validate template values on calls to the scaffolder API Calls to the scaffolder API should use the schema from the template entity to validate input values. --- plugins/scaffolder-backend/package.json | 1 + .../src/service/router.test.ts | 94 +++++++++++++++++++ .../scaffolder-backend/src/service/router.ts | 7 ++ yarn.lock | 5 + 4 files changed, 107 insertions(+) create mode 100644 plugins/scaffolder-backend/src/service/router.test.ts diff --git a/plugins/scaffolder-backend/package.json b/plugins/scaffolder-backend/package.json index 2283dd5d05..b6f927bc61 100644 --- a/plugins/scaffolder-backend/package.json +++ b/plugins/scaffolder-backend/package.json @@ -36,6 +36,7 @@ "git-url-parse": "^11.1.2", "globby": "^11.0.0", "helmet": "^4.0.0", + "jsonschema": "^1.2.6", "morgan": "^1.10.0", "nodegit": "0.26.5", "uuid": "^8.2.0", diff --git a/plugins/scaffolder-backend/src/service/router.test.ts b/plugins/scaffolder-backend/src/service/router.test.ts new file mode 100644 index 0000000000..0349530e45 --- /dev/null +++ b/plugins/scaffolder-backend/src/service/router.test.ts @@ -0,0 +1,94 @@ +/* + * Copyright 2020 Spotify AB + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { getVoidLogger } from '@backstage/backend-common'; +import express from 'express'; +import request from 'supertest'; +import { createRouter } from './router'; +import { Templaters, Preparers, PublisherBase } from '../scaffolder'; +import Docker from 'dockerode'; + +jest.mock('dockerode'); + +describe('createRouter', () => { + let app: express.Express; + const publisher: jest.Mocked = { publish: jest.fn() }; + + beforeAll(async () => { + const router = await createRouter({ + logger: getVoidLogger(), + preparers: new Preparers(), + templaters: new Templaters(), + publisher: publisher, + dockerClient: new Docker(), + }); + app = express().use(router); + }); + + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('POST /v1/jobs', () => { + const template = { + apiVersion: 'backstage.io/v1alpha1', + kind: 'Template', + metadata: { + description: 'Create a new CRA website project', + name: 'create-react-app-template', + tags: ['experimental', 'react', 'cra'], + title: 'Create React App Template', + }, + spec: { + owner: 'web@example.com', + path: '.', + schema: { + type: 'string', + properties: { + component_id: { + description: 'Unique name of the component', + title: 'Name', + type: 'string', + }, + description: { + description: 'Description of the component', + title: 'Description', + type: 'string', + }, + use_typescript: { + default: true, + description: 'Include typescript', + title: 'Use Typescript', + type: 'boolean', + }, + }, + required: ['component_id', 'use_typescript'], + }, + templater: 'cra', + type: 'website', + }, + }; + + it('rejects template values which do not match the template schema definition', async () => { + const response = await request(app).post('/v1/jobs').send({ + template, + values: {}, + }); + + expect(response.status).toEqual(400); + }); + }); +}); diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 1b96158fa4..8a778f31b4 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -28,6 +28,7 @@ import { TemplaterBuilder, PublisherBase, } from '../scaffolder'; +import {validate, ValidatorResult} from 'jsonschema'; export interface RouterOptions { preparers: PreparerBuilder; @@ -84,6 +85,12 @@ export async function createRouter( const values: RequiredTemplateValues & Record = req.body.values; + const validationResult: ValidatorResult = validate(values, template.spec.schema); + if (!validationResult.valid) { + res.status(400).json({ errors: validationResult.errors }); + return; + } + const job = jobProcessor.create({ entity: template, values, diff --git a/yarn.lock b/yarn.lock index 38f5d6c799..3da4f288c5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -13288,6 +13288,11 @@ jsonpointer@^4.0.1: resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" integrity sha1-T9kss04OnbPInIYi7PUfm5eMbLk= +jsonschema@^1.2.6: + version "1.2.6" + resolved "https://registry.npmjs.org/jsonschema/-/jsonschema-1.2.6.tgz#52b0a8e9dc06bbae7295249d03e4b9faee8a0c0b" + integrity sha512-SqhURKZG07JyKKeo/ir24QnS4/BV7a6gQy93bUSe4lUdNp0QNpIz2c9elWJQ9dpc5cQYY6cvCzgRwy0MQCLyqA== + jspdf-autotable@3.5.3: version "3.5.3" resolved "https://registry.npmjs.org/jspdf-autotable/-/jspdf-autotable-3.5.3.tgz#2f73adb07f340e7dbf22950e3e6c8bf853991479" From cf96d90e6285aabc54089840bbb1d983dbabbb9c Mon Sep 17 00:00:00 2001 From: Iain Billett Date: Tue, 15 Sep 2020 20:14:47 +0100 Subject: [PATCH 13/17] Fix formatting --- plugins/scaffolder-backend/src/service/router.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend/src/service/router.ts b/plugins/scaffolder-backend/src/service/router.ts index 8a778f31b4..5c67612176 100644 --- a/plugins/scaffolder-backend/src/service/router.ts +++ b/plugins/scaffolder-backend/src/service/router.ts @@ -28,7 +28,7 @@ import { TemplaterBuilder, PublisherBase, } from '../scaffolder'; -import {validate, ValidatorResult} from 'jsonschema'; +import { validate, ValidatorResult } from 'jsonschema'; export interface RouterOptions { preparers: PreparerBuilder; @@ -85,7 +85,10 @@ export async function createRouter( const values: RequiredTemplateValues & Record = req.body.values; - const validationResult: ValidatorResult = validate(values, template.spec.schema); + const validationResult: ValidatorResult = validate( + values, + template.spec.schema, + ); if (!validationResult.valid) { res.status(400).json({ errors: validationResult.errors }); return; From f0143360b7700f5da69ef07a71df66585834a824 Mon Sep 17 00:00:00 2001 From: Iain Billett Date: Wed, 16 Sep 2020 09:02:42 +0100 Subject: [PATCH 14/17] Fix test schema --- plugins/scaffolder-backend/src/service/router.test.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/scaffolder-backend/src/service/router.test.ts b/plugins/scaffolder-backend/src/service/router.test.ts index 0349530e45..8fd9bca02a 100644 --- a/plugins/scaffolder-backend/src/service/router.test.ts +++ b/plugins/scaffolder-backend/src/service/router.test.ts @@ -56,7 +56,6 @@ describe('createRouter', () => { owner: 'web@example.com', path: '.', schema: { - type: 'string', properties: { component_id: { description: 'Unique name of the component', From 9ad2b8186bd680db9d45fe4d2ed44615ecfa465a Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Wed, 16 Sep 2020 08:19:09 -0400 Subject: [PATCH 15/17] Clean up installation --- docs/features/software-templates/installation.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/features/software-templates/installation.md b/docs/features/software-templates/installation.md index 726f5faead..ef0afb76f7 100644 --- a/docs/features/software-templates/installation.md +++ b/docs/features/software-templates/installation.md @@ -188,10 +188,7 @@ docs on creating private GitHub access tokens is available Note that the need for private GitHub access tokens will be replaced with GitHub Apps integration further down the line. -> **Right now it is only possible to scaffold repositories inside GitHub -> organizations, and not under personal accounts.** - -The Github access token is retrieved from environment variables by the config. +The Github access token is retrieved from environment variables via the config. The config file needs to specify what environment variable the token is retrieved from. Your config should have the following objects. @@ -204,6 +201,11 @@ scaffolder: visibility: public # or 'internal' or 'private' ``` +You can configure who can see the new repositories that the scaffolder creates +by specifying `visibility` option. Valid options are `public`, `private` and +`internal`. `internal` options is for GitHub Enterprise clients, which means +public within the organization. + ### Running the Backend Finally, make sure you have a local Docker daemon running, and start up the From f5702ddc8e9741a1508d62f9afd0b99aef01fcbd Mon Sep 17 00:00:00 2001 From: Taras Mankovski Date: Wed, 16 Sep 2020 08:53:18 -0400 Subject: [PATCH 16/17] Add ability to flag user repositories as private --- .../scaffolder/stages/publish/github.test.ts | 39 ++++++++++++++++++- .../src/scaffolder/stages/publish/github.ts | 5 ++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts index 2c47fa1a2f..5411602a21 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.test.ts @@ -112,6 +112,7 @@ describe('GitHub Publisher', () => { mockGithubClient.repos.createForAuthenticatedUser, ).toHaveBeenCalledWith({ name: 'test', + private: false, }); }); }); @@ -231,7 +232,7 @@ describe('GitHub Publisher', () => { repoVisibility: 'internal', }); - it('creates a repo in an organisation if the organisation with private visibility', async () => { + it('creates a private repository in the organization with visibility set to internal', async () => { mockGithubClient.repos.createInOrg.mockResolvedValue({ data: { clone_url: 'mockclone', @@ -260,4 +261,40 @@ describe('GitHub Publisher', () => { }); }); }); + + describe('private visibility in a user account', () => { + const publisher = new GithubPublisher({ + client: new Octokit(), + token: 'abc', + repoVisibility: 'private', + }); + + it('creates a private repository', async () => { + mockGithubClient.repos.createForAuthenticatedUser.mockResolvedValue({ + data: { + clone_url: 'mockclone', + }, + } as OctokitResponse); + mockGithubClient.users.getByUsername.mockResolvedValue({ + data: { + type: 'User', + }, + } as OctokitResponse); + + await publisher.publish({ + values: { + storePath: 'blam/test', + owner: 'bob', + }, + directory: '/tmp/test', + }); + + expect( + mockGithubClient.repos.createForAuthenticatedUser, + ).toHaveBeenCalledWith({ + name: 'test', + private: true, + }); + }); + }); }); diff --git a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts index 671c3472bc..a8f3eaaa02 100644 --- a/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts +++ b/plugins/scaffolder-backend/src/scaffolder/stages/publish/github.ts @@ -72,7 +72,10 @@ export class GithubPublisher implements PublisherBase { private: this.repoVisibility !== 'public', visibility: this.repoVisibility, }) - : this.client.repos.createForAuthenticatedUser({ name }); + : this.client.repos.createForAuthenticatedUser({ + name, + private: this.repoVisibility === 'private', + }); const { data } = await repoCreationPromise; From 7b3a36a5ec3c4f0265708cb7a601389252af1dff Mon Sep 17 00:00:00 2001 From: Patrik Oldsberg Date: Wed, 16 Sep 2020 15:07:08 +0200 Subject: [PATCH 17/17] eslintignore: add template dirs --- .eslintignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.eslintignore b/.eslintignore index c73074efb3..46bb1ad2b2 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,3 +7,5 @@ **/.git/** **/public/** **/microsite/** +**/templates/** +**/sample-templates/**