From d63f9cba7bc942eff5a0644720ed2178636ebff5 Mon Sep 17 00:00:00 2001 From: "chris.z" Date: Mon, 26 Sep 2022 14:50:33 -0700 Subject: [PATCH] release 1.0.22 with frontend features --- build.gradle | 2 +- plugins.json | 8 +- zip-deployboard-deck/.npmignore | 2 + zip-deployboard-deck/package.json | 4 + zip-deployboard-deck/src/index.ts | 1 - .../src/snapshots/Snapshots.less | 7 + .../src/snapshots/Snapshots.tsx | 194 ++++++++++++++-- .../src/snapshots/SnapshotsDataSource.ts | 88 +++++--- .../src/snapshots/SnapshotsTable.tsx | 153 +++++++++---- .../src/snapshots/snapshot.config.ts | 64 ++++-- zip-deployboard-deck/yarn.lock | 209 +++++++++++++++++- .../ziphq/deployboard/DynamoStatusTask.java | 6 +- 12 files changed, 608 insertions(+), 130 deletions(-) create mode 100644 zip-deployboard-deck/.npmignore create mode 100644 zip-deployboard-deck/src/snapshots/Snapshots.less diff --git a/build.gradle b/build.gradle index 566ebde..f6a1852 100644 --- a/build.gradle +++ b/build.gradle @@ -31,7 +31,7 @@ spinnakerBundle { pluginId = "zip.deployboard" description = "Customization for Zip deploys" provider = "https://github.com/Greenbax/zip-spinnaker-deployboard" - version = "1.0.21" + version = "1.0.22" } subprojects { diff --git a/plugins.json b/plugins.json index 9e187bf..c3e9326 100644 --- a/plugins.json +++ b/plugins.json @@ -5,12 +5,12 @@ "provider": "https://github.com/Greenbax/zip-spinnaker-deployboard", "releases": [ { - "version": "1.0.21", - "date": "2022-09-26T02:00:34.329914Z", + "version": "1.0.22", + "date": "2022-09-26T21:49:32.121432Z", "requires": "gate>=0.0.0,orca>=0.0.0,deck>=0.0.0", - "sha512sum": "db68103290d50078fecd0583d83b6afc8c05b30878f32c9b1cc272e2309905a8870d952f8874f63dd376e3f0bb50fb64d351093531a48a6ddd618bfb2b5a049a", + "sha512sum": "8a0d5264e3ff659b3ce08da8f319d27126cb244fbf5b52f9eb6ad38db948b3626020274d0fa5ab3e8443b9c6f4fcfd707c70583c0cfba86aad66af9b95452c49", "state": "", - "url": "https://github.com/Greenbax/zip-spinnaker-deployboard/releases/download/v1.0.21/zip-spinnaker-deployboard.zip" + "url": "https://github.com/Greenbax/zip-spinnaker-deployboard/releases/download/v1.0.22/zip-spinnaker-deployboard.zip" } ] } diff --git a/zip-deployboard-deck/.npmignore b/zip-deployboard-deck/.npmignore new file mode 100644 index 0000000..b7dab5e --- /dev/null +++ b/zip-deployboard-deck/.npmignore @@ -0,0 +1,2 @@ +node_modules +build \ No newline at end of file diff --git a/zip-deployboard-deck/package.json b/zip-deployboard-deck/package.json index 4d40724..6dc97ff 100644 --- a/zip-deployboard-deck/package.json +++ b/zip-deployboard-deck/package.json @@ -15,6 +15,8 @@ "watch": "rollup -c -w --no-watch.clearScreen" }, "dependencies": { + "@material-ui/core": "4.12.4", + "@material-ui/icons": "^4.11.3", "@rollup/plugin-commonjs": "18.0.0", "@rollup/plugin-typescript": "8.2.1", "@rollup/plugin-url": "6.0.0", @@ -31,6 +33,8 @@ "react": "16.14.0", "react-bootstrap": "^2.5.0", "react-dom": "16.14.0", + "react-hot-toast": "^2.4.0", + "react-infinite-scroll-component": "^6.1.0", "react-router-dom": "^6.3.0", "rollup": "2.45.2", "rxjs": "6.6.7", diff --git a/zip-deployboard-deck/src/index.ts b/zip-deployboard-deck/src/index.ts index 107ef15..789b67f 100644 --- a/zip-deployboard-deck/src/index.ts +++ b/zip-deployboard-deck/src/index.ts @@ -7,7 +7,6 @@ import { Snapshots, SnapshotsDataSource } from './snapshots'; export const plugin: IDeckPlugin = { stages: [dynamoStatusStage], initialize: () => { - console.log('initializing'); const injector = (window as any).spinnaker.$injector; const applicationState: ApplicationStateProvider = injector.get('applicationState'); applicationState.addChildState({ diff --git a/zip-deployboard-deck/src/snapshots/Snapshots.less b/zip-deployboard-deck/src/snapshots/Snapshots.less new file mode 100644 index 0000000..222c356 --- /dev/null +++ b/zip-deployboard-deck/src/snapshots/Snapshots.less @@ -0,0 +1,7 @@ +.snapshot-modal { + opacity: 1; + top: 25%; + transform: translateY(-50%); + display: flex !important; + align-items: center; +} diff --git a/zip-deployboard-deck/src/snapshots/Snapshots.tsx b/zip-deployboard-deck/src/snapshots/Snapshots.tsx index db888a1..d1a9388 100644 --- a/zip-deployboard-deck/src/snapshots/Snapshots.tsx +++ b/zip-deployboard-deck/src/snapshots/Snapshots.tsx @@ -1,34 +1,190 @@ -import { useCurrentStateAndParams, useRouter } from '@uirouter/react'; -import React, { useState } from 'react'; +import { ArrowDropDown } from '@material-ui/icons'; +import { cloneDeep } from 'lodash'; +import React, { useEffect, useState } from 'react'; +import { Button, Dropdown, Modal, ModalBody } from 'react-bootstrap'; +import toast, { LoaderIcon } from 'react-hot-toast'; +import InfiniteScroll from 'react-infinite-scroll-component'; -import type { Application } from '@spinnaker/core'; -import { useDataSource } from '@spinnaker/core'; +import type { Application, IPipelineCommand } from '@spinnaker/core'; +import { ModalClose, ReactInjector, TextInput, useData } from '@spinnaker/core'; import type { SnapshotType } from './SnapshotsDataSource'; +import { SnapshotsReader } from './SnapshotsDataSource'; import { SnapshotsTable } from './SnapshotsTable'; +import { SNAPSHOT_CONFIGS } from './snapshot.config'; + +import './Snapshots.less'; interface SnapshotsProps { app: Application; } +const getBuildsWrapped = (branch: string, query?: string, lastSortKeySeen?: string) => () => + SnapshotsReader.getBuilds(branch, query, lastSortKeySeen); + export function Snapshots(props: SnapshotsProps) { - const dataSource = props.app.getDataSource('snapshots'); - const { data, status, loaded } = useDataSource(dataSource); - React.useEffect(() => { - dataSource.activate(); - }, []); + const [query, setQuery] = useState(''); + const [branch, setBranch] = useState('prod'); + const [lastSortKeySeen, setLastSortKeySeen] = useState(''); + const [deployBuild, setDeployBuild] = useState(''); + const [deployPipeline, setDeployPipeline] = useState('prod'); + const [expandedBuilds, setExpandedBuilds] = useState(new Set()); + + const { result, status } = useData( + getBuildsWrapped(branch, query || undefined, lastSortKeySeen || undefined), + [], + [query, branch, lastSortKeySeen], + ); + const [builds, setBuilds] = useState([]); + useEffect(() => { + setBuilds(dedupeBuilds(builds.concat(result))); + }, [result]); + + // Use the wrapped state setters so we can clear branch data cache. + const setBranchWrapped = (branch: string) => { + setBuilds([]); + setLastSortKeySeen(''); + setBranch(branch); + }; + const setQueryWrapped = (query: string) => { + setBuilds([]); + setLastSortKeySeen(''); + setQuery(query); + }; + + const expandBuild = (buildNumber: number) => setExpandedBuilds(new Set(expandedBuilds.add(buildNumber))); + const collapseBuild = (buildNumber: number) => { + const copy = new Set(expandedBuilds); + copy.delete(buildNumber); + setExpandedBuilds(copy); + }; - const router = useRouter(); - const { params, state } = useCurrentStateAndParams(); - const [deployCommit, setDeployCommit] = useState(''); - const [currentSort, setCurrentSort] = useState('Timestamp'); + const dedupeBuilds = (builds: SnapshotType[]): SnapshotType[] => { + const dedupedBuilds = builds.reduce((acc, val) => acc.set(val.buildNumber, val), new Map()); + return Array.from(dedupedBuilds.values()).sort((a, b) => b.buildNumber - a.buildNumber); + }; + + const startPipeline = (command: IPipelineCommand): PromiseLike => { + const { executionService } = ReactInjector; + const buildsCopy = cloneDeep(builds); + buildsCopy.find((val) => val.dockerImage === deployBuild).status = 'DEPLOYING'; + setBuilds(buildsCopy); + setDeployBuild(''); + return executionService + .startAndMonitorPipeline(props.app, command.pipelineName, command.trigger) + .then((monitor: any) => { + toast.success(`Pipeline '${command.pipelineName}' started!`); + return monitor.promise; + }); + }; return ( - + <> + setDeployBuild('')} + onSubmit={startPipeline} + /> +
+ } + height={'95vh'} + next={() => { + if (builds.length === 0) { + return; + } + const lastBuild = builds[builds.length - 1]; + const lastCommit = lastBuild.commits[lastBuild.commits.length - 1]; + setLastSortKeySeen(`${lastBuild.buildNumber}#${lastCommit.ts}#${lastCommit.author}#${lastCommit.sha}`); + }} + > +
+ setQueryWrapped(val.target.value)} + value={query} + placeholder="Author or commit message (note: search is case sensitive)..." + /> +
+ + + + {`Branch: ${branch}`} + + + + + {Array.from(SNAPSHOT_CONFIGS.values()).map((config) => ( +
  • + setBranchWrapped(config.gitBranch)}>{config.label} +
  • + ))} +
    +
    +
    +
    + {status === 'RESOLVED' || builds.length ? ( + + ) : ( + + )} +
    +
    + ); } + +interface SnapshotDeployModalProps { + pipeline: string; + setPipeline: (pipeline: string) => void; + image: string; + onClose: () => void; + onSubmit: (command: IPipelineCommand) => PromiseLike; +} + +const SnapshotDeployModal = ({ pipeline, setPipeline, image, onClose, onSubmit }: SnapshotDeployModalProps) => { + const command: IPipelineCommand = { + pipelineName: pipeline, + parameters: { image }, + trigger: { enabled: true, type: 'manual', parameters: { image } }, + }; + return ( + + + + Deploy build + + + + + + + {`Pipeline: ${pipeline}`} + + + + + {Array.from(SNAPSHOT_CONFIGS.values()).map((config) => ( +
  • + setPipeline(config.gitBranch)}>{config.label} +
  • + ))} +
    +
    +
    + + + +
    + ); +}; diff --git a/zip-deployboard-deck/src/snapshots/SnapshotsDataSource.ts b/zip-deployboard-deck/src/snapshots/SnapshotsDataSource.ts index 2e1c832..4554889 100644 --- a/zip-deployboard-deck/src/snapshots/SnapshotsDataSource.ts +++ b/zip-deployboard-deck/src/snapshots/SnapshotsDataSource.ts @@ -2,12 +2,33 @@ import type { Application, IDataSourceConfig } from '@spinnaker/core'; import { REST } from '@spinnaker/core'; export interface SnapshotType { + branch: string; + buildNumber: number; + dockerImage: string; + status: string; + commits: CommitType[]; +} + +export interface CommitType { + author: string; sha: string; message: string; - author: string; - timestamp: string; - branch: string; - currentlyDeployed?: string; + ts: string; +} + +interface SnapshotAPI { + builds: Array<{ + branch: string; + buildNumber: number; + dockerImage: string; + status: string; + commits: Array<{ + author: string; + sha: string; + message: string; + ts: string; + }>; + }>; } export const SnapshotsDataSource: IDataSourceConfig = { @@ -17,41 +38,26 @@ export const SnapshotsDataSource: IDataSourceConfig = { activeState: '**.snapshots.**', visible: true, sref: '.snapshots', - defaultData: [ - { - author: 'test', - sha: 'test', - message: 'test', - timestamp: 'test', - branch: 'test', - currentlyDeployed: 'test', - }, - { - author: 'test', - sha: 'test', - message: 'test', - timestamp: 'test', - branch: 'test', - currentlyDeployed: 'test', - }, - { - author: 'test', - sha: 'test', - message: 'test', - timestamp: 'test', - branch: 'test', - currentlyDeployed: 'test', - }, - ], + defaultData: [], description: 'Snapshot View', iconName: 'build', - loader: (application: Application) => SnapshotsReader.getBuilds(), + loader: (application: Application) => SnapshotsReader.getBuilds('prod'), onLoad: (application: Application, data: any) => Promise.resolve(data), lazy: true, }; -const transformSnapshot = (build) => { - return; +const transformSnapshot = (resp: SnapshotAPI): SnapshotType[] => { + return resp.builds.map((val) => ({ + branch: val.branch, + buildNumber: val.buildNumber, + dockerImage: val.dockerImage, + status: val.status, + commits: transformCommits(val.commits), + })); +}; + +const transformCommits = (commits: SnapshotAPI['builds'][0]['commits']): CommitType[] => { + return commits.map((val): CommitType => ({ author: val.author, sha: val.sha, message: val.message, ts: val.ts })); }; export class SnapshotsReader { @@ -59,9 +65,19 @@ export class SnapshotsReader { return 4095; } - public static getBuilds(): PromiseLike { - return REST('snapshots/builds') + public static getBuilds(branch: string, query?: string, lastSortKeySeen?: string): PromiseLike { + const searchQuery: any = { branch }; + if (query) { + searchQuery['query'] = query; + } + if (lastSortKeySeen) { + searchQuery['lastSortKeySeen'] = lastSortKeySeen; + } + return REST('/extensions/snapshots') + .query(searchQuery) .get() - .then((builds) => builds.map((build: any) => transformSnapshot(build))); + .then((builds) => { + return transformSnapshot(builds); + }); } } diff --git a/zip-deployboard-deck/src/snapshots/SnapshotsTable.tsx b/zip-deployboard-deck/src/snapshots/SnapshotsTable.tsx index ade8ecb..b554a1e 100644 --- a/zip-deployboard-deck/src/snapshots/SnapshotsTable.tsx +++ b/zip-deployboard-deck/src/snapshots/SnapshotsTable.tsx @@ -1,48 +1,123 @@ +import { ArrowDropDown, ArrowRight } from '@material-ui/icons'; import React from 'react'; import { Button } from 'react-bootstrap'; +import { CheckmarkIcon, LoaderIcon } from 'react-hot-toast'; -import { SortToggle, timestamp } from '@spinnaker/core'; -import type { SnapshotType } from './SnapshotsDataSource'; +import type { CommitType, SnapshotType } from './SnapshotsDataSource'; export interface SnapshotsTableProps { - commits: SnapshotType[]; - currentSort: string; - toggleSort: (column: string) => void; + builds: SnapshotType[]; + expandedBuilds: Set; + expandBuild: (buildNumber: number) => void; + collapseBuild: (buildNumber: number) => void; toggleDeploy: (sha: string) => void; } -export const SnapshotsTable = ({ commits, currentSort, toggleSort }: SnapshotsTableProps) => ( - - - - - - - - - - - +const getCommitSummary = (commits: CommitType[]): string => { + if (commits.length == 0) { + return ''; + } + if (commits.length == 1) { + return commits[0].message; + } + return `${commits[0].message} + ${commits.length - 1} ${commits.length === 2 ? 'other' : 'others'}...`; +}; - - {commits.map((commit) => { - return ( - - - - - - - - - ); - })} - -
    Deployed - - MessageSha - - Actions
    {commit.currentlyDeployed}{commit.author}{commit.message}{commit.sha}{commit.timestamp} - -
    -); +export const SnapshotsTable = ({ + builds, + expandedBuilds, + collapseBuild, + expandBuild, + toggleDeploy, +}: SnapshotsTableProps) => { + const toggleBuild = (buildNumber: number) => { + if (expandedBuilds.has(buildNumber)) { + collapseBuild(buildNumber); + } else { + expandBuild(buildNumber); + } + }; + + return builds.length ? ( + + + + + + + + + + + + + {builds.map((build) => { + return ( + <> + toggleBuild(build.buildNumber)}> + + + + + + + {expandedBuilds.has(build.buildNumber) && ( + + + + )} + + ); + })} + +
    StatusJenkins Buid NumberCommitsActions
    + {expandedBuilds.has(build.buildNumber) ? ( + + ) : ( + + )} + +
    + {build.status === 'DEPLOYING' ? ( + + ) : build.status === 'DEPLOYED' ? ( + + ) : ( + <> + )} +
    +
    {build.buildNumber}{getCommitSummary(build.commits)} + +
    + + + + + + + + {build.commits.map((commit) => { + return ( + + + + + + ); + })} + +
    AuthorMessageSha
    {commit.author}{commit.message} + {commit.sha} +
    +
    + ) : ( +

    No snapshots yet.

    + ); +}; diff --git a/zip-deployboard-deck/src/snapshots/snapshot.config.ts b/zip-deployboard-deck/src/snapshots/snapshot.config.ts index 7871c0e..7364075 100644 --- a/zip-deployboard-deck/src/snapshots/snapshot.config.ts +++ b/zip-deployboard-deck/src/snapshots/snapshot.config.ts @@ -4,25 +4,45 @@ export interface SnapshotConfigType { pipeline: string; } -export const SNAPSHOT_CONFIGS: SnapshotConfigType[] = [ - { - gitBranch: 'master', - label: 'Staging', - pipeline: 'Staging', - }, - { - gitBranch: 'production-release-branch-test', - label: 'Next', - pipeline: 'Next', - }, - { - gitBranch: 'qa', - label: 'QA', - pipeline: 'QA', - }, - { - gitBranch: 'prod', - label: 'Production', - pipeline: 'Website deployment', - }, -]; +export const SNAPSHOT_CONFIGS: Map = new Map([ + [ + 'prod', + { + gitBranch: 'prod', + label: 'Production', + pipeline: 'Website deployment', + }, + ], + [ + 'master', + { + gitBranch: 'master', + label: 'Staging', + pipeline: 'Staging', + }, + ], + [ + 'production-release-branch-test', + { + gitBranch: 'production-release-branch-test', + label: 'Next', + pipeline: 'Next', + }, + ], + [ + 'qa', + { + gitBranch: 'qa', + label: 'QA', + pipeline: 'QA', + }, + ], + [ + 'czhen-test', + { + gitBranch: 'czhen-test', + label: 'Test', + pipeline: 'test-czhen', + }, + ], +]); diff --git a/zip-deployboard-deck/yarn.lock b/zip-deployboard-deck/yarn.lock index 6660e5a..c881f00 100644 --- a/zip-deployboard-deck/yarn.lock +++ b/zip-deployboard-deck/yarn.lock @@ -970,7 +970,7 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/runtime@^7.7.6": +"@babel/runtime@^7.4.4", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3": version "7.19.0" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz" integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA== @@ -1018,6 +1018,11 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" +"@emotion/hash@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.8.0.tgz#bbbff68978fefdbe68ccb533bc8cbe1d1afb5413" + integrity sha512-kBJtf7PH6aWwZ6fka3zQ0p6SBYzx4fl1LoZXE2RrnYST9Xljm7WfKJrU4g/Xr3Beg72MLrp1AWNUmuYJTL7Cow== + "@eslint/eslintrc@^0.1.3": version "0.1.3" resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz" @@ -1100,6 +1105,77 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@material-ui/core@4.12.4": + version "4.12.4" + resolved "https://registry.yarnpkg.com/@material-ui/core/-/core-4.12.4.tgz#4ac17488e8fcaf55eb6a7f5efb2a131e10138a73" + integrity sha512-tr7xekNlM9LjA6pagJmL8QCgZXaubWUwkJnoYcMKd4gw/t4XiyvnTkjdGrUVicyB2BsdaAv1tvow45bPM4sSwQ== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/styles" "^4.11.5" + "@material-ui/system" "^4.12.2" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.3" + "@types/react-transition-group" "^4.2.0" + clsx "^1.0.4" + hoist-non-react-statics "^3.3.2" + popper.js "1.16.1-lts" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + react-transition-group "^4.4.0" + +"@material-ui/icons@^4.11.3": + version "4.11.3" + resolved "https://registry.yarnpkg.com/@material-ui/icons/-/icons-4.11.3.tgz#b0693709f9b161ce9ccde276a770d968484ecff1" + integrity sha512-IKHlyx6LDh8n19vzwH5RtHIOHl9Tu90aAAxcbWME6kp4dmvODM3UvOHJeMIDzUbd4muuJKHmlNoBN+mDY4XkBA== + dependencies: + "@babel/runtime" "^7.4.4" + +"@material-ui/styles@^4.11.5": + version "4.11.5" + resolved "https://registry.yarnpkg.com/@material-ui/styles/-/styles-4.11.5.tgz#19f84457df3aafd956ac863dbe156b1d88e2bbfb" + integrity sha512-o/41ot5JJiUsIETME9wVLAJrmIWL3j0R0Bj2kCOLbSfqEkKf0fmaPt+5vtblUh5eXr2S+J/8J3DaCb10+CzPGA== + dependencies: + "@babel/runtime" "^7.4.4" + "@emotion/hash" "^0.8.0" + "@material-ui/types" "5.1.0" + "@material-ui/utils" "^4.11.3" + clsx "^1.0.4" + csstype "^2.5.2" + hoist-non-react-statics "^3.3.2" + jss "^10.5.1" + jss-plugin-camel-case "^10.5.1" + jss-plugin-default-unit "^10.5.1" + jss-plugin-global "^10.5.1" + jss-plugin-nested "^10.5.1" + jss-plugin-props-sort "^10.5.1" + jss-plugin-rule-value-function "^10.5.1" + jss-plugin-vendor-prefixer "^10.5.1" + prop-types "^15.7.2" + +"@material-ui/system@^4.12.2": + version "4.12.2" + resolved "https://registry.yarnpkg.com/@material-ui/system/-/system-4.12.2.tgz#f5c389adf3fce4146edd489bf4082d461d86aa8b" + integrity sha512-6CSKu2MtmiJgcCGf6nBQpM8fLkuB9F55EKfbdTC80NND5wpTmKzwdhLYLH3zL4cLlK0gVaaltW7/wMuyTnN0Lw== + dependencies: + "@babel/runtime" "^7.4.4" + "@material-ui/utils" "^4.11.3" + csstype "^2.5.2" + prop-types "^15.7.2" + +"@material-ui/types@5.1.0": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@material-ui/types/-/types-5.1.0.tgz#efa1c7a0b0eaa4c7c87ac0390445f0f88b0d88f2" + integrity sha512-7cqRjrY50b8QzRSYyhSpx4WRw2YuO0KKIGQEVk5J8uoz2BanawykgZGoWEqKm7pVIbzFDN0SpPcVV4IhOFkl8A== + +"@material-ui/utils@^4.11.3": + version "4.11.3" + resolved "https://registry.yarnpkg.com/@material-ui/utils/-/utils-4.11.3.tgz#232bd86c4ea81dab714f21edad70b7fdf0253942" + integrity sha512-ZuQPV4rBK/V1j2dIkSSEcH5uT6AaHuKWFfotADHsC0wVL1NLd2WkFCm4ZZbX33iO4ydl6V0GPngKm8HZQ2oujg== + dependencies: + "@babel/runtime" "^7.4.4" + prop-types "^15.7.2" + react-is "^16.8.0 || ^17.0.0" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" @@ -1616,7 +1692,7 @@ dependencies: "@types/react" "*" -"@types/react-transition-group@^4.4.4": +"@types/react-transition-group@^4.2.0", "@types/react-transition-group@^4.4.4": version "4.4.5" resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA== @@ -2651,6 +2727,14 @@ css-url-regex@0.0.1: resolved "https://registry.npmjs.org/css-url-regex/-/css-url-regex-0.0.1.tgz" integrity sha512-nFtRgFyJUwz9pyMpyscglpHEFdEJ+y2Q8pK33I99gzhUV1OFzS3t5DtIop3VWLIoGFr4mWcM4hJuWPLXn1NXgA== +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.yarnpkg.com/css-vendor/-/css-vendor-2.0.8.tgz#e47f91d3bd3117d49180a3c935e62e3d9f7f449d" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + css-what@^6.0.1, css-what@^6.1.0: version "6.1.0" resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" @@ -2745,6 +2829,11 @@ csstype@^2.2.0: resolved "https://registry.npmjs.org/csstype/-/csstype-2.6.20.tgz" integrity sha512-/WwNkdXfckNgw6S5R125rrW8ez139lBHWouiBvX8dfMFtcn6V81REDqnH7+CRpRipfYlyU1CmOnOxrmGcFOjeA== +csstype@^2.5.2: + version "2.6.21" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.21.tgz#2efb85b7cc55c80017c66a5ad7cbd931fda3a90e" + integrity sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w== + csstype@^3.0.2: version "3.1.0" resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz" @@ -3655,6 +3744,11 @@ globby@^11.0.1: merge2 "^1.4.1" slash "^3.0.0" +goober@^2.1.10: + version "2.1.11" + resolved "https://registry.yarnpkg.com/goober/-/goober-2.1.11.tgz#bbd71f90d2df725397340f808dbe7acc3118e610" + integrity sha512-5SS2lmxbhqH0u9ABEWq7WPU69a4i2pYcHeCxqaNq6Cw3mnrF0ghWNM4tEGid4dKy8XNIAUbuThuozDHHKJVh3A== + good-listener@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz" @@ -3884,6 +3978,11 @@ husky@^6.0.0: resolved "https://registry.npmjs.org/husky/-/husky-6.0.0.tgz" integrity sha512-SQS2gDTB7tBN486QSoKPKQItZw97BMOd+Kdb6ghfpBc0yXyzrddI0oDV5MkDAbuB4X2mO3/nj60TRMcYxwzZeQ== +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" @@ -4117,6 +4216,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@~4.0.1: dependencies: is-extglob "^2.1.1" +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835" + integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== + is-interactive@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz" @@ -4372,6 +4476,76 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jss-plugin-camel-case@^10.5.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.2.tgz#76dddfa32f9e62d17daa4e3504991fd0933b89e1" + integrity sha512-wgBPlL3WS0WDJ1lPJcgjux/SHnDuu7opmgQKSraKs4z8dCCyYMx9IDPFKBXQ8Q5dVYij1FFV0WdxyhuOOAXuTg== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.9.2" + +jss-plugin-default-unit@^10.5.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-default-unit/-/jss-plugin-default-unit-10.9.2.tgz#3e7f4a1506b18d8fe231554fd982439feb2a9c53" + integrity sha512-pYg0QX3bBEFtTnmeSI3l7ad1vtHU42YEEpgW7pmIh+9pkWNWb5dwS/4onSfAaI0kq+dOZHzz4dWe+8vWnanoSg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.9.2" + +jss-plugin-global@^10.5.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-global/-/jss-plugin-global-10.9.2.tgz#e7f2ad4a5e8e674fb703b04b57a570b8c3e5c2c2" + integrity sha512-GcX0aE8Ef6AtlasVrafg1DItlL/tWHoC4cGir4r3gegbWwF5ZOBYhx04gurPvWHC8F873aEGqge7C17xpwmp2g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.9.2" + +jss-plugin-nested@^10.5.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-nested/-/jss-plugin-nested-10.9.2.tgz#3aa2502816089ecf3981e1a07c49b276d67dca63" + integrity sha512-VgiOWIC6bvgDaAL97XCxGD0BxOKM0K0zeB/ECyNaVF6FqvdGB9KBBWRdy2STYAss4VVA7i5TbxFZN+WSX1kfQA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.9.2" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.5.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-props-sort/-/jss-plugin-props-sort-10.9.2.tgz#645f6c8f179309667b3e6212f66b59a32fb3f01f" + integrity sha512-AP1AyUTbi2szylgr+O0OB7gkIxEGzySLITZ2GpsaoX72YMCGI2jYAc+WUhPfvUnZYiauF4zTnN4V4TGuvFjJlw== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.9.2" + +jss-plugin-rule-value-function@^10.5.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.9.2.tgz#9afe07596e477123cbf11120776be6a64494541f" + integrity sha512-vf5ms8zvLFMub6swbNxvzsurHfUZ5Shy5aJB2gIpY6WNA3uLinEcxYyraQXItRHi5ivXGqYciFDRM2ZoVoRZ4Q== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.9.2" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.5.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.9.2.tgz#410a0f3b9f8dbbfba58f4d329134df4849aa1237" + integrity sha512-SxcEoH+Rttf9fEv6KkiPzLdXRmI6waOTcMkbbEFgdZLDYNIP9UKNHFy6thhbRKqv0XMQZdrEsbDyV464zE/dUA== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.9.2" + +jss@10.9.2, jss@^10.5.1: + version "10.9.2" + resolved "https://registry.yarnpkg.com/jss/-/jss-10.9.2.tgz#9379be1f195ef98011dfd31f9448251bd61b95a9" + integrity sha512-b8G6rWpYLR4teTUbGd4I4EsnWjg7MN0Q5bSsjKhVkJVjhQDy2KzkbD2AW3TuT0RYZVmZZHKIrXDn6kjU14qkUg== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + keycode@^2.1.2: version "2.2.1" resolved "https://registry.npmjs.org/keycode/-/keycode-2.2.1.tgz" @@ -5218,6 +5392,11 @@ please-upgrade-node@^3.2.0: dependencies: semver-compare "^1.0.0" +popper.js@1.16.1-lts: + version "1.16.1-lts" + resolved "https://registry.yarnpkg.com/popper.js/-/popper.js-1.16.1-lts.tgz#cf6847b807da3799d80ee3d6d2f90df8a3f50b05" + integrity sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA== + postcss-calc@^8.2.3: version "8.2.4" resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" @@ -5765,6 +5944,20 @@ react-ga@2.4.1: prop-types "^15.6.0" react "^15.6.2 || ^16.0" +react-hot-toast@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/react-hot-toast/-/react-hot-toast-2.4.0.tgz#b91e7a4c1b6e3068fc599d3d83b4fb48668ae51d" + integrity sha512-qnnVbXropKuwUpriVVosgo8QrB+IaPJCpL8oBI6Ov84uvHZ5QQcTp2qg6ku2wNfgJl6rlQXJIQU5q+5lmPOutA== + dependencies: + goober "^2.1.10" + +react-infinite-scroll-component@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/react-infinite-scroll-component/-/react-infinite-scroll-component-6.1.0.tgz#7e511e7aa0f728ac3e51f64a38a6079ac522407f" + integrity sha512-SQu5nCqy8DxQWpnUVLx7V7b7LcA37aM7tvoWjTLZp1dk6EJibM5/4EJKzOnl07/BsM1Y40sKLuqjCwwH/xV0TQ== + dependencies: + throttle-debounce "^2.1.0" + react-input-autosize@^2.1.2: version "2.2.2" resolved "https://registry.npmjs.org/react-input-autosize/-/react-input-autosize-2.2.2.tgz" @@ -5777,6 +5970,11 @@ react-is@^16.13.1, react-is@^16.3.2, react-is@^16.7.0: resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== +"react-is@^16.8.0 || ^17.0.0": + version "17.0.2" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + react-lifecycles-compat@^3.0.4: version "3.0.4" resolved "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz" @@ -5887,7 +6085,7 @@ react-transition-group@^2.0.0, react-transition-group@^2.2.0: prop-types "^15.6.2" react-lifecycles-compat "^3.0.4" -react-transition-group@^4.4.2: +react-transition-group@^4.4.0, react-transition-group@^4.4.2: version "4.4.5" resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== @@ -6808,6 +7006,11 @@ text-table@^0.2.0: resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== +throttle-debounce@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz#fd31865e66502071e411817e241465b3e9c372e2" + integrity sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ== + through@^2.3.8: version "2.3.8" resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" diff --git a/zip-deployboard-orca/src/main/java/io/ziphq/deployboard/DynamoStatusTask.java b/zip-deployboard-orca/src/main/java/io/ziphq/deployboard/DynamoStatusTask.java index e4a0631..66d61dc 100644 --- a/zip-deployboard-orca/src/main/java/io/ziphq/deployboard/DynamoStatusTask.java +++ b/zip-deployboard-orca/src/main/java/io/ziphq/deployboard/DynamoStatusTask.java @@ -1,7 +1,5 @@ package io.ziphq.deployboard; -import java.util.*; - import com.amazonaws.auth.WebIdentityTokenCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.dynamodbv2.AmazonDynamoDB; @@ -14,8 +12,6 @@ import com.netflix.spinnaker.orca.api.pipeline.TaskResult; import com.netflix.spinnaker.orca.api.pipeline.models.StageExecution; import org.pf4j.Extension; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; @Extension public class DynamoStatusTask implements Task { @@ -28,7 +24,7 @@ public TaskResult execute(StageExecution stage) { Table table = dynamoDB.getTable(dynamoTableName); // On successful build, update deployed field in dynamo. - if (context.getSuccess()) { + if (context.getSuccess() != null) { Item item = new Item() .withPrimaryKey("branch", context.getBranch(), "status", "DEPLOYED") .withString("image", context.getImage());