From 571c3493f2a9235f3f43422b26b606bcf693b98c Mon Sep 17 00:00:00 2001 From: Kevin Kondratuk Date: Thu, 6 Jun 2024 13:51:14 -0500 Subject: [PATCH 1/8] update to not load default radars and instead load a folder of fetch-defined ones --- README.md | 253 +------------- build_and_start_nginx.sh | 3 +- radars/fetch_radar.json | 688 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 704 insertions(+), 240 deletions(-) create mode 100644 radars/fetch_radar.json diff --git a/README.md b/README.md index dc2221024..472725295 100644 --- a/README.md +++ b/README.md @@ -1,252 +1,27 @@ -[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/thoughtworks/build-your-own-radar?sort=semver)](https://github.com/thoughtworks/build-your-own-radar/releases/latest) -[![Thoughtworks](https://circleci.com/gh/thoughtworks/build-your-own-radar.svg?style=shield)](https://circleci.com/gh/thoughtworks/build-your-own-radar) -[![Stars](https://badgen.net/github/stars/thoughtworks/build-your-own-radar)](https://github.com/thoughtworks/build-your-own-radar) -[![Docker Hub Pulls](https://img.shields.io/docker/pulls/wwwthoughtworks/build-your-own-radar.svg)](https://hub.docker.com/r/wwwthoughtworks/build-your-own-radar) -[![GitHub contributors](https://badgen.net/github/contributors/thoughtworks/build-your-own-radar?color=cyan)](https://github.com/thoughtworks/build-your-own-radar/graphs/contributors) -[![Prettier-Standard Style Guide](https://img.shields.io/badge/code_style-standard-brightgreen.svg)](https://github.com/sheerun/prettier-standard) -[![AGPL License](https://badgen.net/github/license/thoughtworks/build-your-own-radar)](https://github.com/thoughtworks/build-your-own-radar) +# build-your-own-radar -A library that generates an interactive radar, inspired by [thoughtworks.com/radar](http://thoughtworks.com/radar). +This project is forked from the upstream Thoughtworks project and constitutes Fetch's own Tech Radar. -## Demo +## Running Locally -You can see this in action at https://radar.thoughtworks.com. If you plug in [this data](https://docs.google.com/spreadsheets/d/1GBX3-jzlGkiKpYHF9RvVtu6GxSrco5OYTBv9YsOTXVg/edit#gid=0) you'll see [this visualization](https://radar.thoughtworks.com/?sheetId=https%3A%2F%2Fdocs.google.com%2Fspreadsheets%2Fd%2F1GBX3-jzlGkiKpYHF9RvVtu6GxSrco5OYTBv9YsOTXVg%2Fedit%23gid%3D0). +When running locally, it is relatively easy to build and run the application as it would be in production. Then, you can simply update the radar in `./radars` and refresh to see the updates. There's probably a better way using webpack, but my Javascript chops aren't up to snuff after all these years... -## How To Use - -The easiest way to use the app out of the box is to provide a _public_ Google Sheet ID from which all the data will be fetched. You can enter that ID into the input field and your radar will be generated once you click the submit button. The data must conform to the format below for the radar to be generated correctly. - -### Setting up your data - -You need to make your data public in a form we can digest. - -Create a Google Sheet. Give it at least the below column headers, and put in the content that you want: - -| name | ring | quadrant | isNew | description | -| ------------- | ------ | ---------------------- | ----- | ------------------------------------------------------- | -| Composer | adopt | tools | TRUE | Although the idea of dependency management ... | -| Canary builds | trial | techniques | FALSE | Many projects have external code dependencies ... | -| Apache Kylin | assess | platforms | TRUE | Apache Kylin is an open source analytics solution ... | -| JSF | hold | languages & frameworks | FALSE | We continue to see teams run into trouble using JSF ... | - -### Want to show blip movement information? - -If you want to show movement of blips, add the optional column `status` to your dataset. - -This column accepts the following case-insensitive values : - -- `New` - appearing on the radar for the first time -- `Moved In` - moving towards the center of the radar -- `Moved Out` - moving towards the edge of the radar -- `No Change` - no change in position - -### Sharing the sheet - -- In Google Sheets, click on "Share". -- On the pop-up that appears, set the General Access as "Anyone with the link" and add "Viewer" permission. -- Use the URL link of the sheet. - -The URL will be similar to [https://docs.google.com/spreadsheets/d/1waDG0_W3-yNiAaUfxcZhTKvl7AUCgXwQw8mdPjCz86U/edit](https://docs.google.com/spreadsheets/d/1waDG0_W3-yNiAaUfxcZhTKvl7AUCgXwQw8mdPjCz86U/edit). In theory we are only interested in the part between '/d/' and '/edit' but you can use the whole URL if you want. - -### Using private Google Sheet - -When using a private Google Sheet as your input, you will be prompted with a Google One Tap Login popup. Once you have logged in with the appropriate Google Account and authorized our app to access the sheet, the Radar will be generated. - -The input data format for the private sheet is the same as a public Google Sheet. - -### Using CSV data - -The other way to provide your data is using CSV document format. -You can enter a publicly accessible URL (not behind any authentication) of a CSV file into the input field on the first page. -For example, a [raw URL](https://raw.githubusercontent.com/thoughtworks/build-your-own-radar/master/spec/end_to_end_tests/resources/sheet.csv) for a CSV file hosted publicly on GitHub can be used. -The format is just the same as that of the Google Sheet, the example is as follows: - -``` -name,ring,quadrant,isNew,description -Composer,adopt,tools,TRUE,"Although the idea of dependency management ..." -Canary builds,trial,techniques,FALSE,"Many projects have external code dependencies ..." -Apache Kylin,assess,platforms,TRUE,"Apache Kylin is an open source analytics solution ..." -JSF,hold,languages & frameworks,FALSE,"We continue to see teams run into trouble using JSF ..." -``` - -If you do not want to host the CSV file publicly, you can follow [these steps](#advanced-option---docker-image-with-a-csvjson-file-from-the-host-machine) to host the file locally on your BYOR docker instance itself. - -**_Note:_** The CSV file parsing is using D3 library, so consult the [D3 documentation](https://github.com/d3/d3-request/blob/master/README.md#csv) for the data format details. - -### Using JSON data - -Another other way to provide your data is using a JSON array. -You can enter a publicly accessible URL (not behind any authentication) of a JSON file into the input field on the first page. -For example, a [raw URL](https://raw.githubusercontent.com/thoughtworks/build-your-own-radar/master/spec/end_to_end_tests/resources/data.json) for a JSON file hosted publicly on GitHub can be used. -The format of the JSON is an array of objects with the the fields: `name`, `ring`, `quadrant`, `isNew`, and `description`. - -An example: - -```json -[ - { - "name": "Composer", - "ring": "adopt", - "quadrant": "tools", - "isNew": "TRUE", - "description": "Although the idea of dependency management ..." - }, - { - "name": "Canary builds", - "ring": "trial", - "quadrant": "techniques", - "isNew": "FALSE", - "description": "Many projects have external code dependencies ..." - }, - { - "name": "Apache Kylin", - "ring": "assess", - "quadrant": "platforms", - "isNew": "TRUE", - "description": "Apache Kylin is an open source analytics solution ..." - }, - { - "name": "JSF", - "ring": "hold", - "quadrant": "languages & frameworks", - "isNew": "FALSE", - "description": "We continue to see teams run into trouble using JSF ..." - } -] -``` - -If you do not want to host the JSON file publicly, you can follow [these steps](#advanced-option---docker-image-with-a-csvjson-file-from-the-host-machine) to host the file locally on your BYOR docker instance itself. - -**_Note:_** The JSON file parsing is using D3 library, so consult the [D3 documentation](https://github.com/d3/d3-request/blob/master/README.md#json) for the data format details. - -### Building the radar - -Paste the URL in the input field on the home page. - -That's it! - -**_Note:_** When using the BYOR app on [radar.thoughtworks.com](https://radar.thoughtworks.com), the ring and quadrant names should be among the values mentioned in the [example above](#setting-up-your-data). This holds good for Google Sheet, CSV or JSON inputs. -For a self hosted BYOR app, there is no such condition on the names. Instructions to specify custom names are in the [next section](#more-complex-usage). - -Check [this page](https://www.thoughtworks.com/radar/byor) for step by step guidance. - -### More complex usage - -To create the data representation, you can use the Google Sheet [factory](/src/util/factory.js) methods or CSV/JSON, or you can also insert all your data straight into the code. - -The app uses [Google Sheets APIs](https://developers.google.com/sheets/api/reference/rest) to fetch the data from a Google Sheet or [D3.js](https://d3js.org/) if supplied as CSV/JSON, so refer to their documentation for more advanced interaction. The input data is sanitized by whitelisting HTML tags with [sanitize-html](https://github.com/punkave/sanitize-html). - -The application uses [webpack](https://webpack.github.io/) to package dependencies and minify all .js and .scss files. - -Google OAuth Client ID and API Key can be obtained from your Google Developer Console. OAuth Client ID is mandatory for private Google Sheets, as it is needed for Google Authentication and Authorization of our app. - -``` -export CLIENT_ID=[Google Client ID] -``` - -**_Note:_** Make sure to set the "Authorized JavaScript origins" field for the Client ID to the right origin domain, with port, where the app is hosted. Examples: `http://localhost:8080` or `https://radar.thoughtworks.com`. - -Optionally, API Key can be set to bypass Google Authentication for public sheets. +### Build -``` -export API_KEY=[Google API Key] +```bash +docker build -t tech-radar:latest . ``` -To enable Google Tag Manager, add the following environment variable. +### Run +```bash +docker run -it -p 8080:80 --mount type=bind,source=$(pwd)/radars/,target=/opt/build-your-own-radar/files/ tech-radar:latest ``` -export GTM_ID=[GTM ID] -``` - -To enable Adobe Launch, add the following environment variable. - -``` -export ADOBE_LAUNCH_SCRIPT_URL=[Adobe Launch URL] -``` - -To specify custom ring and/or quadrant names, add the following environment variables with the desired values. - -``` -export RINGS='["Adopt", "Trial", "Assess", "Hold"]' -export QUADRANTS='["Techniques", "Platforms", "Tools", "Languages & Frameworks"]' -``` - -## Docker Image - -We have released BYOR as a docker image for our users. The image is available in our [DockerHub Repo](https://hub.docker.com/r/wwwthoughtworks/build-your-own-radar/). To pull and run the image, run the following commands. - -``` -$ docker pull wwwthoughtworks/build-your-own-radar -$ docker run --rm -p 8080:80 -e CLIENT_ID="[Google Client ID]" wwwthoughtworks/build-your-own-radar:latest -$ open http://localhost:8080 -``` - -**_Notes:_** - -- The other environment variables mentioned in the previous section can be used with `docker run` as well. -- Docker images for all the [releases](https://github.com/thoughtworks/build-your-own-radar/releases) are available with their respective tags (eg: `wwwthoughtworks/build-your-own-radar:v1.0.0`). - -### Advanced option - Docker image with a CSV/JSON file from the host machine - -You can check your setup by clicking on "Build my radar" and by loading the `csv`/`json` file from these locations: - -- http://localhost:8080/files/radar.csv -- http://localhost:8080/files/radar.json - -``` -$ docker pull wwwthoughtworks/build-your-own-radar -$ docker run --rm -p 8080:80 -e SERVER_NAMES="localhost 127.0.0.1" -v /mnt/radar/files/:/opt/build-your-own-radar/files wwwthoughtworks/build-your-own-radar:latest -$ open http://localhost:8080 -``` - -This will: - -- Spawn a server that will listen locally on port 8080. -- Mount the host volume on `/mnt/radar/files/` into the container on `/opt/build-your-own-radar/files/`. -- Open http://localhost:8080 and for the URL enter: `http://localhost:8080/files/.`. It needs to be a csv/json file. - -You can now work locally on your machine, updating the csv/json file and render the result back on your browser. -There is a sample csv and json file placed in `spec/end_to_end_tests/resources/localfiles/` for reference. - -**_Notes:_** - -- If API Key is also available, same can be provided to the `docker run` command as `-e API_KEY=[Google API Key]`. -- For setting the `publicPath` in the webpack config while using this image, the path can be passed as an environment variable called `ASSET_PATH`. - -## Contribute - -All tasks are defined in `package.json`. - -Pull requests are welcome; please write tests whenever possible. -Make sure you have nodejs installed. You can run `nvm use` to use the version used by this repo. - -- `git clone git@github.com:thoughtworks/build-your-own-radar.git` -- `npm install` -- `npm run quality` - to run the linter and the unit tests -- `npm run dev` - to run application in localhost:8080. This will watch the .js and .css files and rebuild on file changes - -## End to End Tests - -To run End to End tests, start the dev server and follow the required steps below: - -- To run in headless mode: - - - add a new environment variable `TEST_URL` and set it to 'http://localhost:8080' - - `npm run test:e2e-headless` - -- To run in debug mode: - - add a new environment variable `TEST_URL` and set it to 'http://localhost:8080' - - `npm run e2e` - - Select 'E2E Testing' and choose the browser - - Click on the spec to run it's tests - -**_Notes:_** -- Currently, end to end tests are not supported for private Google Sheets, as it requires interacting with the Google One Tap popup. -- To run end to end tests for public Google Sheets, the `CLIENT_ID` and `API_KEY` environment variables need to set as well (steps details [here](#more-complex-usage)), to provide Cypress with an authenticated session (without having to interact with Google's auth popups). +### Access -### Don't want to install node? Run with one line docker +To access the locally-running radar, visit [this link](http://localhost:8080/?documentId=http%3A%2F%2Flocalhost%3A8080%2Ffiles%2Ffetch_radar.json). - $ docker run -p 8080:8080 -v $PWD:/app -w /app -it node:18 /bin/sh -c 'npm install && npm run dev' +## Adding a Radar -After building it will start on `localhost:8080`. +To add a radar, simply add another file to the `radars` folder and it will be deployed alongside the others! \ No newline at end of file diff --git a/build_and_start_nginx.sh b/build_and_start_nginx.sh index 5f6ed961e..0aa888962 100755 --- a/build_and_start_nginx.sh +++ b/build_and_start_nginx.sh @@ -11,7 +11,8 @@ mkdir -p /opt/build-your-own-radar cd /opt/build-your-own-radar cp -r /src/build-your-own-radar/dist/* ./ mkdir -p files -cp /src/build-your-own-radar/spec/end_to_end_tests/resources/localfiles/* ./files/ +# cp /src/build-your-own-radar/spec/end_to_end_tests/resources/localfiles/* ./files/ +# cp /src/build-your-own-radar/radars/* ./files/ cp /src/build-your-own-radar/default.template /etc/nginx/conf.d/default.conf echo "Starting nginx server..." diff --git a/radars/fetch_radar.json b/radars/fetch_radar.json new file mode 100644 index 000000000..7d26b517a --- /dev/null +++ b/radars/fetch_radar.json @@ -0,0 +1,688 @@ +[ + { + "name": "Java", + "ring": "assess", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Kotlin", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Swift", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Objective-C", + "ring": "hold", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Golang", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Javascript", + "ring": "hold", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "NodeJS", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Rust", + "ring": "assess", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Typescript", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Python", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Spring Framework", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Micronaut", + "ring": "assess", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "bubbletea", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Plotly Dash", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "straw", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "runner", + "ring": "trial", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Elastic Beanstalk (EB)", + "ring": "hold", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Simple Storage Service (S3)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Cloudfront", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Elastic Compute Cloud (EC2)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Elastic Container Service (ECS)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Elastic Kubernetes Service (EKS)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Lambda", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Batch", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Sagemaker", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Self-Hosted ML Models", + "ring": "assess", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Eventbridge", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Managed Service for Kafka (MSK)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Kinesis", + "ring": "hold", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Self-Hosted Apache Airflow", + "ring": "hold", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Self-Hosted Apache Flink", + "ring": "hold", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Managed Workflows for Apache Airflow (MWAA)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Managed Service for Apache Flink (MSAF)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "FSD", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "F-Zero", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Bitbucket", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Github", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Docker", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Okta", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Bitrise", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Argo", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "mise en place", + "ring": "trial", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "homebrew", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Windows Subsystem for Linux (WSL)", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Goland", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "IntelliJ", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "XCode", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "VS Code", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "vim/nvim", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Flagr", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Feature Flipper", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Secrets Manager", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS API Gateway", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Krakend", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Aurora", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS DynamoDB", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS DocumentDB", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Elasticache", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS ElasticSearch", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Relational Data Service (RDS)", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Neptune", + "ring": "assess", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Pinot", + "ring": "assess", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Snowflake", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Athena", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Iceberg", + "ring": "assess", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "InfluxDB", + "ring": "assess", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Mongo Atlas", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Self-Hosted MongoDB", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Grafana", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "HostedGraphite", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Prometheus", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Locust.io", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "JFrog Artifactory", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "hostbootstrap", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "cloud-deploy", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "service-deploy", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Snyk", + "ring": "trial", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Fetch Real-Time (FRT)", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Quasar", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "ansible", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "terraform", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Helm", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "deployer", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Web Taproom", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Local Functional Testing Before Deployment", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Application OTEL Intstrumentation", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Blue/Green Deployments", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Shadow Pipelines", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Custom Metric Scaling", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Resource-Based Scaling", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "GitOps", + "ring": "hold", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Large Monorepos", + "ring": "hold", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Container-Native Platforms & Deployments", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Omnibus Kafka Topics", + "ring": "hold", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Data & Service Contracts", + "ring": "trial", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Load Test for Scalability", + "ring": "trial", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Load Test for Capacity", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Forking Open-Source Libraries ", + "ring": "hold", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + } +] \ No newline at end of file From bd02a11765dfbed5e885f21f27b0686bfce9de72 Mon Sep 17 00:00:00 2001 From: Kevin Kondratuk Date: Thu, 6 Jun 2024 13:56:52 -0500 Subject: [PATCH 2/8] add reference to upstream in README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 472725295..a4bbc0e5b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # build-your-own-radar -This project is forked from the upstream Thoughtworks project and constitutes Fetch's own Tech Radar. +This project is forked from the [upstream Thoughtworks project](https://github.com/thoughtworks/build-your-own-radar) and constitutes Fetch's own Tech Radar. ## Running Locally From 4b2b8a549545e2a757846a47326bf2275c656a0f Mon Sep 17 00:00:00 2001 From: Kevin Kondratuk Date: Thu, 6 Jun 2024 13:58:21 -0500 Subject: [PATCH 3/8] this is representative of right now, so move java back to adopt --- radars/fetch_radar.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/radars/fetch_radar.json b/radars/fetch_radar.json index 7d26b517a..9238f9bf5 100644 --- a/radars/fetch_radar.json +++ b/radars/fetch_radar.json @@ -1,7 +1,7 @@ [ { "name": "Java", - "ring": "assess", + "ring": "adopt", "quadrant": "Languages & Frameworks", "isNew": "FALSE", "description": "" From 7ff393f1f1ab28e7fef23cad4797984302287f39 Mon Sep 17 00:00:00 2001 From: Kevin Kondratuk Date: Thu, 6 Jun 2024 16:40:41 -0500 Subject: [PATCH 4/8] updates for clearer delineation between present and future -- remove personal taste based tooling --- ...ar.json => devops_future_fetch_radar.json} | 123 ++-- radars/devops_present_fetch_radar.json | 681 ++++++++++++++++++ 2 files changed, 739 insertions(+), 65 deletions(-) rename radars/{fetch_radar.json => devops_future_fetch_radar.json} (95%) create mode 100644 radars/devops_present_fetch_radar.json diff --git a/radars/fetch_radar.json b/radars/devops_future_fetch_radar.json similarity index 95% rename from radars/fetch_radar.json rename to radars/devops_future_fetch_radar.json index 9238f9bf5..00126d166 100644 --- a/radars/fetch_radar.json +++ b/radars/devops_future_fetch_radar.json @@ -1,7 +1,7 @@ [ { "name": "Java", - "ring": "adopt", + "ring": "hold", "quadrant": "Languages & Frameworks", "isNew": "FALSE", "description": "" @@ -50,7 +50,7 @@ }, { "name": "Rust", - "ring": "assess", + "ring": "hold", "quadrant": "Languages & Frameworks", "isNew": "FALSE", "description": "" @@ -71,14 +71,14 @@ }, { "name": "Spring Framework", - "ring": "adopt", + "ring": "hold", "quadrant": "Languages & Frameworks", "isNew": "FALSE", "description": "" }, { "name": "Micronaut", - "ring": "assess", + "ring": "hold", "quadrant": "Languages & Frameworks", "isNew": "FALSE", "description": "" @@ -106,7 +106,7 @@ }, { "name": "runner", - "ring": "trial", + "ring": "adopt", "quadrant": "Languages & Frameworks", "isNew": "FALSE", "description": "" @@ -141,7 +141,7 @@ }, { "name": "AWS Elastic Container Service (ECS)", - "ring": "adopt", + "ring": "hold", "quadrant": "Platforms", "isNew": "FALSE", "description": "" @@ -169,14 +169,14 @@ }, { "name": "AWS Sagemaker", - "ring": "adopt", + "ring": "hold", "quadrant": "Platforms", "isNew": "FALSE", "description": "" }, { "name": "Self-Hosted ML Models", - "ring": "assess", + "ring": "adopt", "quadrant": "Platforms", "isNew": "FALSE", "description": "" @@ -246,7 +246,7 @@ }, { "name": "Bitbucket", - "ring": "adopt", + "ring": "hold", "quadrant": "Tools", "isNew": "FALSE", "description": "" @@ -293,55 +293,6 @@ "isNew": "FALSE", "description": "" }, - { - "name": "homebrew", - "ring": "adopt", - "quadrant": "Tools", - "isNew": "FALSE", - "description": "" - }, - { - "name": "Windows Subsystem for Linux (WSL)", - "ring": "adopt", - "quadrant": "Tools", - "isNew": "FALSE", - "description": "" - }, - { - "name": "Goland", - "ring": "adopt", - "quadrant": "Tools", - "isNew": "FALSE", - "description": "" - }, - { - "name": "IntelliJ", - "ring": "adopt", - "quadrant": "Tools", - "isNew": "FALSE", - "description": "" - }, - { - "name": "XCode", - "ring": "adopt", - "quadrant": "Tools", - "isNew": "FALSE", - "description": "" - }, - { - "name": "VS Code", - "ring": "adopt", - "quadrant": "Tools", - "isNew": "FALSE", - "description": "" - }, - { - "name": "vim/nvim", - "ring": "adopt", - "quadrant": "Tools", - "isNew": "FALSE", - "description": "" - }, { "name": "Flagr", "ring": "hold", @@ -365,14 +316,14 @@ }, { "name": "AWS API Gateway", - "ring": "adopt", + "ring": "assess", "quadrant": "Tools", "isNew": "FALSE", "description": "" }, { "name": "Krakend", - "ring": "adopt", + "ring": "assess", "quadrant": "Tools", "isNew": "FALSE", "description": "" @@ -435,7 +386,7 @@ }, { "name": "Snowflake", - "ring": "adopt", + "ring": "assess", "quadrant": "Tools", "isNew": "FALSE", "description": "" @@ -496,6 +447,20 @@ "isNew": "FALSE", "description": "" }, + { + "name": "Jaeger", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Grafana Tempo", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, { "name": "Locust.io", "ring": "adopt", @@ -538,6 +503,20 @@ "isNew": "FALSE", "description": "" }, + { + "name": "Sourcegraph", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AI Assistants", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, { "name": "Fetch Real-Time (FRT)", "ring": "adopt", @@ -547,7 +526,7 @@ }, { "name": "Quasar", - "ring": "adopt", + "ring": "assess", "quadrant": "Tools", "isNew": "FALSE", "description": "" @@ -659,14 +638,14 @@ }, { "name": "Data & Service Contracts", - "ring": "trial", + "ring": "adopt", "quadrant": "Techniques", "isNew": "FALSE", "description": "" }, { "name": "Load Test for Scalability", - "ring": "trial", + "ring": "adopt", "quadrant": "Techniques", "isNew": "FALSE", "description": "" @@ -679,10 +658,24 @@ "description": "" }, { - "name": "Forking Open-Source Libraries ", + "name": "Forking Open-Source Libraries", "ring": "hold", "quadrant": "Techniques", "isNew": "FALSE", "description": "" + }, + { + "name": "Pipeline Authentication With OIDC", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Access via Single Sign-On", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" } ] \ No newline at end of file diff --git a/radars/devops_present_fetch_radar.json b/radars/devops_present_fetch_radar.json new file mode 100644 index 000000000..f8f5bbc8e --- /dev/null +++ b/radars/devops_present_fetch_radar.json @@ -0,0 +1,681 @@ +[ + { + "name": "Java", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Kotlin", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Swift", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Objective-C", + "ring": "hold", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Golang", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Javascript", + "ring": "hold", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "NodeJS", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Rust", + "ring": "assess", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Typescript", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Python", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Spring Framework", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Micronaut", + "ring": "assess", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "bubbletea", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Plotly Dash", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "straw", + "ring": "adopt", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "runner", + "ring": "trial", + "quadrant": "Languages & Frameworks", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Elastic Beanstalk (EB)", + "ring": "hold", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Simple Storage Service (S3)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Cloudfront", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Elastic Compute Cloud (EC2)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Elastic Container Service (ECS)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Elastic Kubernetes Service (EKS)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Lambda", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Batch", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Sagemaker", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Self-Hosted ML Models", + "ring": "assess", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Eventbridge", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Managed Service for Kafka (MSK)", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Kinesis", + "ring": "hold", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Self-Hosted Apache Airflow", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Self-Hosted Apache Flink", + "ring": "adopt", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Managed Workflows for Apache Airflow (MWAA)", + "ring": "assess", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Managed Service for Apache Flink (MSAF)", + "ring": "assess", + "quadrant": "Platforms", + "isNew": "FALSE", + "description": "" + }, + { + "name": "FSD", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "F-Zero", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Bitbucket", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Github", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Docker", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Okta", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Bitrise", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Argo", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "mise en place", + "ring": "trial", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Flagr", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Feature Flipper", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Secrets Manager", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS API Gateway", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Krakend", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Aurora", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS DynamoDB", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS DocumentDB", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Elasticache", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS ElasticSearch", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Relational Data Service (RDS)", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Neptune", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Pinot", + "ring": "trial", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Snowflake", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Athena", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Iceberg", + "ring": "assess", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "InfluxDB", + "ring": "trial", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Mongo Atlas", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Self-Hosted MongoDB", + "ring": "hold", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Grafana", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "HostedGraphite", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Prometheus", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Jaeger", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Grafana Tempo", + "ring": "trial", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Locust.io", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "JFrog Artifactory", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "hostbootstrap", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "cloud-deploy", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "service-deploy", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Snyk", + "ring": "trial", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Sourcegraph", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AI Assistants", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Fetch Real-Time (FRT)", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Quasar", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "ansible", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "terraform", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Helm", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "deployer", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Web Taproom", + "ring": "adopt", + "quadrant": "Tools", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Local Functional Testing Before Deployment", + "ring": "trial", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Application OTEL Intstrumentation", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Blue/Green Deployments", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Shadow Pipelines", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Custom Metric Scaling", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Resource-Based Scaling", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "GitOps", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Large Monorepos", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Container-Native Platforms & Deployments", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Omnibus Kafka Topics", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Data & Service Contracts", + "ring": "trial", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Load Test for Scalability", + "ring": "trial", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Load Test for Capacity", + "ring": "trial", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Forking Open-Source Libraries", + "ring": "trial", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "Pipeline Authentication With OIDC", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + }, + { + "name": "AWS Access via Single Sign-On", + "ring": "adopt", + "quadrant": "Techniques", + "isNew": "FALSE", + "description": "" + } +] \ No newline at end of file From 156dbb6f11c4e1689f640ec283e52a2647bd5407 Mon Sep 17 00:00:00 2001 From: Kevin Kondratuk Date: Thu, 6 Jun 2024 16:43:06 -0500 Subject: [PATCH 5/8] update wording --- radars/devops_future_fetch_radar.json | 2 +- radars/devops_present_fetch_radar.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/radars/devops_future_fetch_radar.json b/radars/devops_future_fetch_radar.json index 00126d166..01b30189a 100644 --- a/radars/devops_future_fetch_radar.json +++ b/radars/devops_future_fetch_radar.json @@ -567,7 +567,7 @@ "description": "" }, { - "name": "Local Functional Testing Before Deployment", + "name": "Local Functional Integration Testing Before Deployment", "ring": "adopt", "quadrant": "Techniques", "isNew": "FALSE", diff --git a/radars/devops_present_fetch_radar.json b/radars/devops_present_fetch_radar.json index f8f5bbc8e..c65ff183f 100644 --- a/radars/devops_present_fetch_radar.json +++ b/radars/devops_present_fetch_radar.json @@ -567,7 +567,7 @@ "description": "" }, { - "name": "Local Functional Testing Before Deployment", + "name": "Local Functional Integration Testing Before Deployment", "ring": "trial", "quadrant": "Techniques", "isNew": "FALSE", From 969f004b0ea4f5c3f3e23dff89dff364dcb3cdd7 Mon Sep 17 00:00:00 2001 From: Kevin Kondratuk Date: Thu, 6 Jun 2024 16:45:35 -0500 Subject: [PATCH 6/8] update links for less fragility --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a4bbc0e5b..e1ef12eba 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,7 @@ docker run -it -p 8080:80 --mount type=bind,source=$(pwd)/radars/,target=/opt/bu ### Access -To access the locally-running radar, visit [this link](http://localhost:8080/?documentId=http%3A%2F%2Flocalhost%3A8080%2Ffiles%2Ffetch_radar.json). +To access the locally-running radar, visit [this link](http://localhost:8080/?documentId=http%3A%2F%2Flocalhost%3A8080%2Ffiles%2Fdevops_present_fetch_radar.json). Additionally, you can see the accessible radars at [this location](http://localhost:8080/files/). ## Adding a Radar From 7637a3699c2337aafe758b3f46b218b2fa592d1b Mon Sep 17 00:00:00 2001 From: Kevin Kondratuk Date: Mon, 10 Jun 2024 10:31:21 -0500 Subject: [PATCH 7/8] add github workflows to deploy --- .github/workflows/deploy_to_env.yml | 78 +++++++++++++++++++++++++++++ .github/workflows/on_main.yml | 25 +++++++++ .github/workflows/on_pr.yml | 28 +++++++++++ 3 files changed, 131 insertions(+) create mode 100644 .github/workflows/deploy_to_env.yml create mode 100644 .github/workflows/on_main.yml create mode 100644 .github/workflows/on_pr.yml diff --git a/.github/workflows/deploy_to_env.yml b/.github/workflows/deploy_to_env.yml new file mode 100644 index 000000000..95e1c15cc --- /dev/null +++ b/.github/workflows/deploy_to_env.yml @@ -0,0 +1,78 @@ +name: Deploy to env + +permissions: + id-token: write # This is required for requesting the JWT + contents: read # This is required for actions/checkout +on: + workflow_dispatch: + inputs: + environment: + description: Environment to deploy to + type: environment + required: true + version: + description: Version to upload and deploy + type: string + workflow_call: + inputs: + env: + description: Environment to deploy to + type: string + required: true + region: + description: region to deploy to + type: string + required: true + account: + description: account to deploy to + type: string + required: true + version: + description: Version to upload and deploy + type: string + required: true +env: + VERSION: ${{inputs.version || github.sha}} + env: ${{ vars.ENV || inputs.env }} + region: ${{ vars.REGION || inputs.region }} + account: ${{ vars.ACCOUNT || inputs.account }} +jobs: + set-vars: + runs-on: ubuntu-latest + environment: ${{ inputs.environment }} + steps: + - name: print env vars + id: export-env-vars + run: | + echo "$account" + echo "$region" + echo "$env" + + echo "region=$region" >> "$GITHUB_OUTPUT" + echo "account=$account" >> "$GITHUB_OUTPUT" + echo "env=$env" >> "$GITHUB_OUTPUT" + echo "version=$VERSION" >> "$GITHUB_OUTPUT" + outputs: + region: ${{ steps.export-env-vars.outputs.region }} + account: ${{ steps.export-env-vars.outputs.account }} + env: ${{ steps.export-env-vars.outputs.env }} + version: ${{ steps.export-env-vars.outputs.version }} + upload: + needs: set-vars + name: Build and push image + uses: fetch-rewards/common-workflows/.github/workflows/publish-ecr.yml@main + with: + service-name: ${{ vars.SERVICE_NAME }} + version-tag: ${{ needs.set-vars.outputs.version }} + fsd-diff: + needs: [upload, set-vars] + name: Diff to ${{ inputs.environment }} + uses: fetch-rewards/common-workflows/.github/workflows/run-fsd.yml@main + with: + cmd_args: service eks diff --env ${{ needs.set-vars.outputs.env }} --region ${{ needs.set-vars.outputs.region }} --account ${{ needs.set-vars.outputs.account }} --version ${{ needs.set-vars.outputs.version }} --skip-ephemeris ${{ vars.SERVICE_NAME }}.yml + fsd-deploy: + needs: [upload, set-vars, fsd-diff] + name: Deploy to ${{ inputs.environment }} + uses: fetch-rewards/common-workflows/.github/workflows/run-fsd.yml@main + with: + cmd_args: service eks deploy --env ${{ needs.set-vars.outputs.env }} --region ${{ needs.set-vars.outputs.region }} --account ${{ needs.set-vars.outputs.account }} --version ${{ needs.set-vars.outputs.version }} --skip-ephemeris --source-legacy ${{ vars.SERVICE_NAME }}.yml diff --git a/.github/workflows/on_main.yml b/.github/workflows/on_main.yml new file mode 100644 index 000000000..696407b3a --- /dev/null +++ b/.github/workflows/on_main.yml @@ -0,0 +1,25 @@ +name: On main +permissions: + id-token: write # This is required for requesting the JWT + contents: write # This is required for actions/checkout + +on: + workflow_dispatch: + push: + branches: + - main +jobs: + increment-version: + name: Increment release version tag + uses: fetch-rewards/common-workflows/.github/workflows/increment-semantic-version.yml@main + with: + version-type: patch + deploy-prod: + name: Deploy prod env + needs: [increment-version] + uses: fetch-rewards/build-your-own-radar/.github/workflows/deploy_to_env.yml@main + with: + env: prod + account: prod-services + region: us-east-1 + version: ${{ needs.increment-version.outputs.new-tag }} diff --git a/.github/workflows/on_pr.yml b/.github/workflows/on_pr.yml new file mode 100644 index 000000000..c80faa3dd --- /dev/null +++ b/.github/workflows/on_pr.yml @@ -0,0 +1,28 @@ +name: On pr +permissions: + id-token: write # This is required for requesting the JWT + contents: write # This is required for actions/checkout + actions: write + discussions: write + pull-requests: write + packages: write + +on: + pull_request: + types: [opened, reopened, edited] +jobs: + fsd-diff: + name: Fsd diff + uses: fetch-rewards/common-workflows/.github/workflows/fsd-diff.yml@main + with: + config: ${{ vars.SERVICE_NAME }}.yml + region: us-east-1 + env: dev + deploy-prod: + name: Deploy stage env + needs: [fsd-diff] + uses: fetch-rewards/build-your-own-radar/.github/workflows/deploy_to_env.yml@main + with: + env: stage + account: stage-services + region: us-east-1 From da5541b5d3f6935aff1eddaa9e137fbae0669767 Mon Sep 17 00:00:00 2001 From: Kevin Kondratuk Date: Mon, 10 Jun 2024 10:35:04 -0500 Subject: [PATCH 8/8] remove codeowners file --- .github/CODEOWNERS | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index 6085dc221..000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @thoughtworks/tw-digital @will-amaral