diff --git a/packages/app/package.json b/packages/app/package.json
index 706c2d82bb..41d72a89db 100644
--- a/packages/app/package.json
+++ b/packages/app/package.json
@@ -9,6 +9,7 @@
"@backstage/plugin-circleci": "^0.1.1-alpha.18",
"@backstage/plugin-explore": "^0.1.1-alpha.18",
"@backstage/plugin-github-actions": "^0.1.1-alpha.18",
+ "@backstage/plugin-jenkins": "^0.1.1-alpha.18",
"@backstage/plugin-gitops-profiles": "^0.1.1-alpha.18",
"@backstage/plugin-graphiql": "^0.1.1-alpha.18",
"@backstage/plugin-lighthouse": "^0.1.1-alpha.18",
diff --git a/packages/app/src/plugins.ts b/packages/app/src/plugins.ts
index 3e2b69a28f..7e803698fe 100644
--- a/packages/app/src/plugins.ts
+++ b/packages/app/src/plugins.ts
@@ -29,3 +29,4 @@ export { plugin as GithubActions } from '@backstage/plugin-github-actions';
export { plugin as Rollbar } from '@backstage/plugin-rollbar';
export { plugin as Newrelic } from '@backstage/plugin-newrelic';
export { plugin as TravisCI } from '@roadiehq/backstage-plugin-travis-ci';
+export { plugin as Jenkins } from '@backstage/plugin-jenkins';
diff --git a/plugins/jenkins/.eslintrc.js b/plugins/jenkins/.eslintrc.js
new file mode 100644
index 0000000000..13573efa9c
--- /dev/null
+++ b/plugins/jenkins/.eslintrc.js
@@ -0,0 +1,3 @@
+module.exports = {
+ extends: [require.resolve('@backstage/cli/config/eslint')],
+};
diff --git a/plugins/jenkins/README.md b/plugins/jenkins/README.md
new file mode 100644
index 0000000000..230f96dc72
--- /dev/null
+++ b/plugins/jenkins/README.md
@@ -0,0 +1,13 @@
+# jenkins
+
+Welcome to the jenkins plugin!
+
+_This plugin was created through the Backstage CLI_
+
+## Getting started
+
+Your plugin has been added to the example app in this repository, meaning you'll be able to access it by running `yarn start` in the root directory, and then navigating to [/jenkins](http://localhost:3000/jenkins).
+
+You can also serve the plugin in isolation by running `yarn start` in the plugin directory.
+This method of serving the plugin provides quicker iteration speed and a faster startup and hot reloads.
+It is only meant for local development, and the setup for it can be found inside the [/dev](/dev) directory.
diff --git a/plugins/jenkins/dev/index.tsx b/plugins/jenkins/dev/index.tsx
new file mode 100644
index 0000000000..812a5585d4
--- /dev/null
+++ b/plugins/jenkins/dev/index.tsx
@@ -0,0 +1,20 @@
+/*
+ * 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 { createDevApp } from '@backstage/dev-utils';
+import { plugin } from '../src/plugin';
+
+createDevApp().registerPlugin(plugin).render();
diff --git a/plugins/jenkins/package.json b/plugins/jenkins/package.json
new file mode 100644
index 0000000000..766a79a290
--- /dev/null
+++ b/plugins/jenkins/package.json
@@ -0,0 +1,49 @@
+{
+ "name": "@backstage/plugin-jenkins",
+ "version": "0.1.1-alpha.18",
+ "main": "src/index.ts",
+ "types": "src/index.ts",
+ "license": "Apache-2.0",
+ "private": false,
+ "publishConfig": {
+ "access": "public",
+ "main": "dist/index.esm.js",
+ "types": "dist/index.d.ts"
+ },
+ "scripts": {
+ "build": "backstage-cli plugin:build",
+ "start": "backstage-cli plugin:serve",
+ "lint": "backstage-cli lint",
+ "test": "backstage-cli test",
+ "diff": "backstage-cli plugin:diff",
+ "prepack": "backstage-cli prepack",
+ "postpack": "backstage-cli postpack",
+ "clean": "backstage-cli clean"
+ },
+ "dependencies": {
+ "@backstage/core": "^0.1.1-alpha.18",
+ "@backstage/theme": "^0.1.1-alpha.18",
+ "@material-ui/core": "^4.9.1",
+ "@material-ui/icons": "^4.9.1",
+ "@material-ui/lab": "4.0.0-alpha.45",
+ "react": "^16.13.1",
+ "react-dom": "^16.13.1",
+ "react-use": "^14.2.0",
+ "react-router": "^6.0.0-alpha.5",
+ "react-router-dom": "^6.0.0-alpha.5"
+ },
+ "devDependencies": {
+ "@backstage/cli": "^0.1.1-alpha.9",
+ "@backstage/dev-utils": "^0.1.1-alpha.9",
+ "@testing-library/jest-dom": "^5.7.0",
+ "@testing-library/react": "^9.3.2",
+ "@testing-library/user-event": "^10.2.4",
+ "@types/jest": "^25.2.2",
+ "@types/node": "^12.0.0",
+ "@types/testing-library__jest-dom": "^5.0.4",
+ "jest-fetch-mock": "^3.0.3"
+ },
+ "files": [
+ "dist/**/*.{js,d.ts}"
+ ]
+}
diff --git a/plugins/jenkins/src/components/App.tsx b/plugins/jenkins/src/components/App.tsx
new file mode 100644
index 0000000000..ca8bb4c454
--- /dev/null
+++ b/plugins/jenkins/src/components/App.tsx
@@ -0,0 +1,28 @@
+/*
+ * 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 { BuildsPage } from '../pages/BuildsPage';
+
+export const App = () => {
+ return (
+ <>
+
+ } />
+
+ >
+ );
+};
diff --git a/plugins/jenkins/src/components/Layout/Layout.tsx b/plugins/jenkins/src/components/Layout/Layout.tsx
new file mode 100644
index 0000000000..c6000437a3
--- /dev/null
+++ b/plugins/jenkins/src/components/Layout/Layout.tsx
@@ -0,0 +1,29 @@
+/*
+ * 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
new file mode 100644
index 0000000000..236fc98851
--- /dev/null
+++ b/plugins/jenkins/src/components/Layout/index.ts
@@ -0,0 +1,16 @@
+/*
+ * 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
new file mode 100644
index 0000000000..60b774713d
--- /dev/null
+++ b/plugins/jenkins/src/components/PluginHeader/PluginHeader.tsx
@@ -0,0 +1,57 @@
+/*
+ * 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 } from 'react';
+import { Link as RouterLink, useLocation } from 'react-router-dom';
+import { ContentHeader, SupportButton } from '@backstage/core';
+import { Button, IconButton, Box, Typography } from '@material-ui/core';
+import ArrowBack from '@material-ui/icons/ArrowBack';
+import SettingsIcon from '@material-ui/icons/Settings';
+
+export type Props = { title?: string };
+export const PluginHeader: FC = ({ title = 'CircleCI' }) => {
+ const location = useLocation();
+ const notRoot = !location.pathname.match(/\/circleci\/?$/);
+
+ return (
+ (
+
+ {notRoot && (
+
+
+
+ )}
+ {title}
+
+ )}
+ >
+
+
+
+ This plugin allows you to view and interact with your builds in Jenkins.
+
+
+ );
+};
diff --git a/plugins/jenkins/src/components/PluginHeader/index.ts b/plugins/jenkins/src/components/PluginHeader/index.ts
new file mode 100644
index 0000000000..4de972f6f2
--- /dev/null
+++ b/plugins/jenkins/src/components/PluginHeader/index.ts
@@ -0,0 +1,16 @@
+/*
+ * 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 './PluginHeader';
diff --git a/plugins/jenkins/src/index.ts b/plugins/jenkins/src/index.ts
new file mode 100644
index 0000000000..3a0a0fe2d3
--- /dev/null
+++ b/plugins/jenkins/src/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 { plugin } from './plugin';
diff --git a/plugins/jenkins/src/pages/BuildsPage/BuildsPage.tsx b/plugins/jenkins/src/pages/BuildsPage/BuildsPage.tsx
new file mode 100644
index 0000000000..7b124c03c1
--- /dev/null
+++ b/plugins/jenkins/src/pages/BuildsPage/BuildsPage.tsx
@@ -0,0 +1,43 @@
+/*
+ * 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 } from 'react';
+import { Content } from '@backstage/core';
+import { Grid } from '@material-ui/core';
+import { Builds as BuildsComp } from './lib/Builds';
+import { Layout } from '../../components/Layout';
+import { PluginHeader } from '../../components/PluginHeader';
+
+const BuildsPage: FC<{}> = () => (
+
+
+
+
+
+);
+
+const Builds = () => (
+ <>
+
+
+
+
+
+
+ >
+);
+
+export default BuildsPage;
+export { Builds };
diff --git a/plugins/jenkins/src/pages/BuildsPage/index.ts b/plugins/jenkins/src/pages/BuildsPage/index.ts
new file mode 100644
index 0000000000..72b46d6bc9
--- /dev/null
+++ b/plugins/jenkins/src/pages/BuildsPage/index.ts
@@ -0,0 +1,16 @@
+/*
+ * 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 { default as BuildsPage, Builds } from './BuildsPage';
diff --git a/plugins/jenkins/src/pages/BuildsPage/lib/Builds/Builds.tsx b/plugins/jenkins/src/pages/BuildsPage/lib/Builds/Builds.tsx
new file mode 100644
index 0000000000..b14be76ddc
--- /dev/null
+++ b/plugins/jenkins/src/pages/BuildsPage/lib/Builds/Builds.tsx
@@ -0,0 +1,26 @@
+/*
+ * 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 } from 'react';
+// import { useBuilds } from '../../../../state';
+
+export const Builds: FC<{}> = () => {
+ // const [
+ // { total, loading, value, projectName, page, pageSize },
+ // { setPage, retry, setPageSize },
+ // ] = useBuilds();
+
+ return
Builds go here
;
+};
diff --git a/plugins/jenkins/src/pages/BuildsPage/lib/Builds/index.ts b/plugins/jenkins/src/pages/BuildsPage/lib/Builds/index.ts
new file mode 100644
index 0000000000..e91a9496b7
--- /dev/null
+++ b/plugins/jenkins/src/pages/BuildsPage/lib/Builds/index.ts
@@ -0,0 +1,16 @@
+/*
+ * 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 { Builds } from './Builds';
diff --git a/plugins/jenkins/src/plugin.test.ts b/plugins/jenkins/src/plugin.test.ts
new file mode 100644
index 0000000000..8c3f057ecb
--- /dev/null
+++ b/plugins/jenkins/src/plugin.test.ts
@@ -0,0 +1,23 @@
+/*
+ * 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 { plugin } from './plugin';
+
+describe('jenkins', () => {
+ it('should export plugin', () => {
+ expect(plugin).toBeDefined();
+ });
+});
diff --git a/plugins/jenkins/src/plugin.ts b/plugins/jenkins/src/plugin.ts
new file mode 100644
index 0000000000..f5b2210257
--- /dev/null
+++ b/plugins/jenkins/src/plugin.ts
@@ -0,0 +1,30 @@
+/*
+ * 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 { createPlugin, createRouteRef } from '@backstage/core';
+import { App } from './components/App';
+
+export const rootRouteRef = createRouteRef({
+ path: '/jenkins',
+ title: 'jenkins',
+});
+
+export const plugin = createPlugin({
+ id: 'jenkins',
+ register({ router }) {
+ router.addRoute(rootRouteRef, App, { exact: false });
+ },
+});
diff --git a/plugins/jenkins/src/setupTests.ts b/plugins/jenkins/src/setupTests.ts
new file mode 100644
index 0000000000..e34bc46f4b
--- /dev/null
+++ b/plugins/jenkins/src/setupTests.ts
@@ -0,0 +1,18 @@
+/*
+ * 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 '@testing-library/jest-dom';
+require('jest-fetch-mock').enableMocks();