Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(report-portal): plugin implementation #1

Merged
merged 1 commit into from
Mar 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions plugins/report-portal-backend/OWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
approvers:
- yashoswalyo
- riginoommen
- deshmukhmayur
reviewers:
- yashoswalyo
- riginoommen
- deshmukhmayur
61 changes: 61 additions & 0 deletions plugins/report-portal-backend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,64 @@ start` in the root directory, and then navigating to [/report-portal](http://loc
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.

## Installation

- Install the plugin
```shell
yarn workspace backend add @appdev-platform/backstage-plugin-report-portal-backend
```
- Update the following files

- Create `/packages/backend/src/plugins/report-portal.ts` and add following code:

```ts
import { createRouter } from '@appdev-platform/backstage-plugin-report-portal-backend';
import { Router } from 'express';

import { PluginEnvironment } from '../types';

export default async function createPlugin(
env: PluginEnvironment,
): Promise<Router> {
return await createRouter({ logger: env.logger, config: env.config });
}
```

- Add following lines to `/packages/backend/src/index.ts`:

```ts
import reportPortal from './plugins/report-portal';

async function main() {
// add the files to create backend router
const reportPortalEnv = useHotMemoize(module, () =>
createEnv('report-portal'),
);
apiRouter.use('/report-portal', await reportPortal(reportPortalEnv));
}
```

- Add below configuration to `app-config.yaml`:

```yaml
reportPortal:
# under integrations you can configure-
# multiple instances of report portal
integrations:
# host address of your instance
# for e.g: report-portal.mycorp.com
- host: ${REPORT_PORTAL_HOST}

# Baser API url of your instance
# for e.g: https://report-portal.mycorp.com/api/
baseUrl: ${REPORT_PORTAL_BASE_URL}

# Get the API key from profile page of your instance
# for e.g: Bearer fae22be1-0000-0000-8392-de1635eed9f4
token: ${REPORT_PORTAL_TOKEN}

# (optional) Filter the projects by type
# Default: "INTERNAL"
filterType: 'INTERNAL'
```
1 change: 1 addition & 0 deletions plugins/report-portal-backend/app-config.janus-idp.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@ reportPortal:
- host: ${REPORT_PORTAL_HOST}
baseUrl: ${REPORT_PORTAL_BASE_URL}
token: ${REPORT_PORTAL_TOKEN}
filterType: ${REPORT_PORTAL_FILTER_TYPE}
6 changes: 6 additions & 0 deletions plugins/report-portal-backend/config.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export interface Config {
integrations: Array<{
/**
* Host of report portal url
* @visibility frontend
*/
host: string;
/**
Expand All @@ -17,6 +18,11 @@ export interface Config {
* @visibility secret
*/
token: string;
/**
* Filter type to apply for current host
* @visibility frontend
*/
filterType: string;
}>;
};
}
8 changes: 4 additions & 4 deletions plugins/report-portal-backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
"tsc": "tsc"
},
"dependencies": {
"@backstage/backend-common": "^0.19.8",
"@backstage/backend-common": "^0.21.0",
"@backstage/backend-plugin-api": "^0.6.6",
"@backstage/backend-plugin-manager": "npm:@janus-idp/[email protected]",
"@backstage/config": "^1.1.1",
Expand Down Expand Up @@ -70,13 +70,13 @@
"configSchema": "config.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/janus-idp/backstage-plugins",
"directory": "plugins/report-portal"
"url": "https://github.com/appdev-platform/backstage-plugins",
"directory": "plugins/report-portal-backend"
},
"keywords": [
"backstage",
"plugin"
],
"homepage": "https://janus-idp.io/",
"bugs": "https://github.com/janus-idp/backstage-plugins/issues"
"bugs": "https://github.com/appdev-platform/backstage-plugins/issues"
}
10 changes: 4 additions & 6 deletions plugins/report-portal-backend/src/service/router.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import { getVoidLogger } from '@backstage/backend-common';
import { ConfigReader } from '@backstage/config';

import express from 'express';
import request from 'supertest';

import { createRouter } from './router';

Expand All @@ -11,6 +11,7 @@ describe('createRouter', () => {
beforeAll(async () => {
const router = await createRouter({
logger: getVoidLogger(),
config: new ConfigReader({ reportPortal: { integrations: [] } }),
});
app = express().use(router);
});
Expand All @@ -19,12 +20,9 @@ describe('createRouter', () => {
jest.resetAllMocks();
});

describe('GET /health', () => {
describe('just a test', () => {
it('returns ok', async () => {
const response = await request(app).get('/health');

expect(response.status).toEqual(200);
expect(response.body).toEqual({ status: 'ok' });
expect(app).toBeDefined();
});
});
});
2 changes: 1 addition & 1 deletion plugins/report-portal-backend/src/service/router.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export interface RouterOptions {
export async function createRouter(
options: RouterOptions,
): Promise<express.Router> {
const { logger, config } = options;
const { config } = options;
const hostsConfig = config.getConfigArray('reportPortal.integrations');

const router = Router();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { createServiceBuilder } from '@backstage/backend-common';
import { Config, ConfigReader } from '@backstage/config';
import { ConfigReader } from '@backstage/config';

import { Logger } from 'winston';

Expand Down
8 changes: 8 additions & 0 deletions plugins/report-portal/OWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
approvers:
- yashoswalyo
- riginoommen
- deshmukhmayur
reviewers:
- yashoswalyo
- riginoommen
- deshmukhmayur
80 changes: 80 additions & 0 deletions plugins/report-portal/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,83 @@ Your plugin has been added to the example app in this repository, meaning you'll
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.

## Prequisite

- [report-portal-backend](../report-portal/) plugin

## Installation:

- Run the following command in your backstage project

```shell
yarn workspace app add @appdev-platform/backstage-plugin-report-portal
```

- Now import the components

- open `/packages/app/src/App.tsx` and add the following code

```js
import { ReportPortalGlobalPage } from '@appdev-platform/backstage-plugin-report-portal';

export const AppBase = () => {
// In <FlatRoutes> add the following route
<Route path="/report-portal" element={<ReportPortalGlobalPage />} />;
};
```

- open `/packages/app/src/components/Root/Root.tsx` and add the following code

```js
import AssessmentIcon from '@material-ui/icons/Assessment';
//...
//...
export const Root = ({ children }: PropsWithChildren<{}>) => (
<SidebarPage>

<!-- Add the link to route in your sidebar component -->
<SidebarItem icon={AssessmentIcon} to="report-portal" text="Report Portal" />
</SidebarPage>
)
```

- To add a card on overview tab of entity page, open `/packages/app/src/components/catalog/EntityPage.tsx` and add the following code:

```js
import { ReportPortalOverviewCard } from '@appdev-platform/backstage-plugin-report-portal';

const overviewContent = (
<Grid>

<!-- add your card on overview -->
<Grid item lg={4} md={6} xs={12}>
<ReportPortalOverviewCard variant="gridItem" />
</Grid>
</Grid>
);
```

- Add the below configuration to your `app-config.yaml` file

```yaml
reportPortal:
# under integrations you can configure-
# multiple instances of report portal
integrations:
# host address of your instance
# for e.g: report-portal.mycorp.com
- host: ${REPORT_PORTAL_HOST}

# Baser API url of your instance
# for e.g: https://report-portal.mycorp.com/api/
baseUrl: ${REPORT_PORTAL_BASE_URL}

# Get the API key from profile page of your instance
# for e.g: Bearer fae22be1-0000-0000-8392-de1635eed9f4
token: ${REPORT_PORTAL_TOKEN}

# (optional) Filter the projects by type
# Default: "INTERNAL"
filterType: 'INTERNAL'
```
4 changes: 4 additions & 0 deletions plugins/report-portal/app-config.janus-idp.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,7 @@ dynamicPlugins:
dynamicRoutes: []
mountPoints: []
routeBindings: []
reportPortal:
integrations:
- host: ${REPORT_PORTAL_HOST}
filterType: ${REPORT_PORTAL_FILTER_TYPE}
20 changes: 19 additions & 1 deletion plugins/report-portal/config.d.ts
Original file line number Diff line number Diff line change
@@ -1 +1,19 @@
export interface Config {}
export interface Config {
/**
* Configuration values for Report Portal plugin
*/
reportPortal: {
integrations: Array<{
/**
* Host of report portal url
* @visibility frontend
*/
host: string;
/**
* Type of projects to list
* @visibility frontend
*/
filterType: string;
}>;
};
}
1 change: 0 additions & 1 deletion plugins/report-portal/dev/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { createDevApp } from '@backstage/dev-utils';
import {
EntityAboutCard,
EntityHasSubcomponentsCard,
EntityLayout,
EntityLinksCard,
} from '@backstage/plugin-catalog';
import { EntityProvider } from '@backstage/plugin-catalog-react';
Expand Down
77 changes: 77 additions & 0 deletions plugins/report-portal/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
{
"name": "@appdev-platform/backstage-plugin-report-portal",
"version": "0.1.0",
"main": "src/index.ts",
"types": "src/index.ts",
"license": "Apache-2.0",
"private": true,
"publishConfig": {
"access": "public",
"main": "dist/index.esm.js",
"types": "dist/index.d.ts"
},
"backstage": {
"role": "frontend-plugin"
},
"sideEffects": false,
"scripts": {
"build": "backstage-cli package build",
"clean": "backstage-cli package clean",
"export-dynamic": "janus-cli package export-dynamic-plugin",
"lint": "backstage-cli package lint",
"postpack": "backstage-cli package postpack",
"postversion": "yarn run export-dynamic",
"prepack": "backstage-cli package prepack",
"start": "backstage-cli package start",
"test": "backstage-cli package test --passWithNoTests --coverage",
"tsc": "tsc"
},
"dependencies": {
"@backstage/catalog-model": "^1.4.4",
"@backstage/core-components": "^0.14.0",
"@backstage/core-plugin-api": "^1.9.0",
"@backstage/plugin-catalog-react": "^1.10.0",
"@backstage/theme": "^0.5.1",
"@material-ui/core": "^4.12.2",
"@material-ui/icons": "^4.11.3",
"@material-ui/lab": "^4.0.0-alpha.61",
"luxon": "^3.4.4",
"react-multi-progress": "^1.3.0",
"react-use": "^17.2.4"
},
"peerDependencies": {
"react": "16.13.1 || ^17.0.0 || ^18.0.0",
"react-router-dom": "^6.22.0"
},
"devDependencies": {
"@backstage/cli": "0.25.2",
"@backstage/core-app-api": "1.11.0",
"@backstage/dev-utils": "1.0.22",
"@backstage/plugin-catalog": "^1.16.1",
"@backstage/test-utils": "1.5.0",
"@janus-idp/cli": "1.7.3",
"@testing-library/jest-dom": "^6.0.0",
"@testing-library/react": "^14.0.0",
"@testing-library/user-event": "^14.0.0",
"@types/luxon": "^3.4.2",
"msw": "1.0.0"
},
"files": [
"dist",
"config.d.ts",
"dist-scalprum",
"app-config.janus-idp.yaml"
],
"configSchema": "config.d.ts",
"repository": {
"type": "git",
"url": "https://github.com/appdev-platform/backstage-plugins",
"directory": "plugins/report-portal"
},
"keywords": [
"backstage",
"plugin"
],
"homepage": "https://janus-idp.io/",
"bugs": "https://github.com/appdev-platform/backstage-plugins/issues"
}
Loading