| <!-- |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you 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. |
| --> |
| |
| The Beam Playground is a web application to run Beam code snippets in a modern browser. This directory holds code to |
| build, test, and deploy the frontend and backend services. |
| |
| - [Setup development prerequisites](#setup-development-prerequisites) |
| - [Common tasks](#common-tasks) |
| - [Run Beam Playground locally](#run-beam-playground-locally) |
| - [Configure frontend to use local backend](#configure-frontend-to-use-local-backend) |
| - [Run local deployment using Gradle task](#run-local-deployment-using-gradle-task) |
| - [Deploy examples](#deploy-examples) |
| - [How to add your own example](#how-to-add-your-own-example) |
| - [Deployment guide](#deployment-guide) |
| - [Manual deployment](#manual-deployment) |
| - [Manual CloudBuild setup](#manual-cloudbuild-setup) |
| - [Project structure](#project-structure) |
| - [Contribution guide](#contribution-guide) |
| |
| # Setup development prerequisites |
| > ***Google Cloud Shell note***: Google Cloud Shell already has most of the prerequisites installed. Only the following has to be installed manually: |
| > - Flutter - run `flutter precache` |
| > - Go protobuf dependencies |
| > - Dart protobuf dependencies |
| > - buf |
| > - sbt |
| |
| 1. Install Go 1.23+ |
| |
| **Ubuntu 22.04 and newer:** |
| ```shell |
| sudo apt install golang |
| ``` |
| |
| **Other Linux variants:** Follow manual at https://go.dev/doc/install |
| 1. Install [flutter](https://docs.flutter.dev/get-started/install/linux) |
| |
| **Ubuntu 22.04 or newer:** |
| ```shell |
| sudo apt install flutter |
| ``` |
| |
| **Other Linux variants:** Follow manual at https://flutter.dev/docs/get-started/install/linux |
| |
| 1. Install [protoc](https://grpc.io/docs/protoc-installation/) |
| |
| **Ubuntu 22.04 or newer/Debian 11 or newer:** |
| ```shell |
| sudo apt install protobuf-compiler |
| ``` |
| **Other Linux variants:** Follow manual at https://grpc.io/docs/protoc-installation/ |
| |
| 1. Install Go protobuf dependencies: [Go gRPC Quickstart](https://grpc.io/docs/languages/go/quickstart/) |
| > Do not forget to update your `PATH` environment variable |
| 1. Install Dart protobuf dependencies: [Dart gRPC Quickstart](https://grpc.io/docs/languages/dart/quickstart/) |
| > Do not forget to update your `PATH` environment variable |
| 1. Install npm |
| **Ubuntu 22.04 and newer/Debian 11 and newer:** |
| ```shell |
| sudo apt install npm |
| ``` |
| **Other Linux variants:** Follow manual at https://docs.npmjs.com/downloading-and-installing-node-js-and-npm |
| 1. Install [buf](https://docs.buf.build/installation) |
| ```shell |
| npm install -g @bufbuild/buf |
| ``` |
| 1. Install Docker |
| **Ubuntu 22.04 and newer/Debian 11 and newer:** |
| ```shell |
| sudo apt install docker.io |
| ``` |
| **Other Linux variants:** Follow manual at https://docs.docker.com/engine/install/ |
| |
| To verify your docker installation, run: |
| ```shell |
| docker ps |
| ``` |
| It should finish without any errors. If you get a permission denied error, you need to add your user to the docker group: |
| ```shell |
| sudo usermod -aG docker $USER |
| ``` |
| Then, log out and log back in to apply the changes. |
| 1. Install Docker Compose |
| **Ubuntu 22.04 and newer/Debian 11 and newer:** |
| ```shell |
| sudo apt install docker-compose |
| ``` |
| **Other Linux variants:** Follow manual at https://docs.docker.com/compose/install/ |
| 1. Install gcloud CLI by following the [manual](https://cloud.google.com/sdk/docs/install) for your system |
| 1. Install Cloud Datastore Emulator |
| ```shell |
| gcloud components install cloud-datastore-emulator |
| ``` |
| or, if you have install gcloud CLI using APT: |
| ```shell |
| sudo apt install google-cloud-cli-datastore-emulator |
| ``` |
| 1. Install `sbt` following instruction at https://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Linux.html |
| > **Optional**: Run `sbt` comamnd once after installation to let it cache its dependencies |
| 1. Make sure that you have the full installation of Python 3.8 or newer. On Debian or Ubuntu it can be installed using `sudo apt install python3-full`. |
| |
| # Common tasks |
| To get an overview of common tasks, see [TASKS.md](TASKS.md) |
| |
| # Run Beam Playground locally |
| ## Configure frontend to use local backend |
| > **Note:** Follow this step only if you want to have a local deployment of Playground. Skip this step entirely if you want to deploy Playground to Google Cloud. |
| |
| Uncommend lines after `// Uncomment the following lines to use local backend.` in [frontend/playground_components/lib/src/constants/backend_urls.dart](/playground/frontend/playground_components/lib/src/constants/backend_urls.dart) |
| |
| ## Run local deployment using Gradle task |
| > For more information read the corresponding section in [TASKS.md](./TASKS.md#router-runners-and-frontend) |
| |
| Run the deployment script: |
| ```shell |
| ./gradlew :playground:dockerComposeLocalUp |
| ``` |
| |
| To shut down the playground, run: |
| ```shell |
| ./gradlew :playground:dockerComposeLocalDown |
| ``` |
| |
| ## Deploy examples |
| 1. Go to `/playground/infrastucture` directory |
| ```shell |
| cd playground/infrastucture |
| ``` |
| 1. Setup python venv |
| ```shell |
| python3 -m venv venv |
| ``` |
| 1. Activate venv |
| ```shell |
| source venv/bin/activate |
| ``` |
| 1. Install dependencies |
| ```shell |
| pip install -r requirements.txt |
| ``` |
| 1. Setup the environment variables |
| ```shell |
| export BEAM_ROOT_DIR=$(realpath ../../) |
| export SDK_CONFIG="../../playground/sdks.yaml" |
| export BEAM_EXAMPLE_CATEGORIES="../categories.yaml" |
| export BEAM_USE_WEBGRPC=yes |
| export BEAM_CONCURRENCY=4 |
| export DATASTORE_EMULATOR_HOST=localhost:8081 |
| ``` |
| |
| 1. Run the `ci_cd.py` script |
| |
| ```shell |
| export SERVER_ADDRESS=<runner_address> # see the note below |
| python ci_cd.py --step CD \ |
| --sdk <SDK> \ # SDK_GO, SDK_JAVA, SDK_PYTHON, SDK_SCIO |
| --namespace Playground \ |
| --datastore-project test \ |
| --origin PG_EXAMPLES \ |
| --subdirs $BEAM_ROOT_DIR/sdks $BEAM_ROOT_DIR/examples $BEAM_ROOT_DIR/learning/katas # For SCIO examples see note below |
| ``` |
| > **Note:** The `SERVER_ADDRESS` variable should be set to the address of the runner server for the particular SDK. For the local deployment the default values are: |
| > | SDK | Address | |
| > | --- | --- | |
| > | Go | `localhost:8084` | |
| > | Java | `localhost:8086` | |
| > | Python | `localhost:8088` | |
| > | SCIO | `localhost:8090` | |
| |
| > **Note:** SCIO examples are not committed to the Beam tree. You will need to use [`fetch_scala_examples.py`](infrastructure/fetch_scala_examples.py) script to download them to some directory and then use `--subdirs` option to point to that directory. For example: |
| > ```shell |
| > python fetch_scala_examples.py --output-dir /tmp/scio-examples |
| > python ci_cd.py --step CD \ |
| > --sdk SDK_SCIO \ |
| > --namespace Playground \ |
| > --datastore-project test \ |
| > --origin PG_EXAMPLES \ |
| > --subdirs /tmp/scio-examples |
| > ``` |
| > See [this section](TASKS.md##obtaining-scio-examples) for more information. |
| |
| # How to add your own example |
| Please refer to [this document](load_your_code.md). |
| |
| # Deployment guide |
| ## Manual deployment |
| See deployment guide at [terraform/README.md](/playground/terraform/README.md) |
| ## Manual CloudBuild setup |
| To set up CloudBuild triggers manually please refer to [this guide](/playground/terraform/infrastructure/cloudbuild-manual-setup/README.md) |
| |
| # Project structure |
| |
| Several directories in this repository are used for the Beam Playground project. The list of the directories used can be seen below. |
| |
| | Directory | Purpose | |
| |-----------|---------| |
| | [`/examples`](/examples) | Contains code of the examples for Java SDK. The examples are getting loaded into the main catalog. | |
| | [`/learning/beamdoc`](/learning/beamdoc) | Contains code of the examples which should not be available in the main Playground catalog. | |
| | [`/learning/katas`](/learning/katas) | Containes small code examples, loaded into main catalog. |
| | [`/playground`](/playground) | Root of Playground sources. | |
| | [`/playground/api`](/playground/api) | Protobuf definitions for the Playground gRPC API. | |
| | [`/playground/backend`](/playground/backend) | Root of Playground backend sources. See [this document](/playground/backend/CONTRIBUTE.md) for detailed description. | |
| | [`/playground/frontend`](/playground/frontend) | Root of Playground frontend sources. See [this document](/playground/frontend/CONTRIBUTE.md) for detailed description. | |
| | [`/playground/infrastructure`](/playground/infrastructure) | Scripts used in Playground CI/CD pipelines for verifying and uploading examples. | |
| | [`/playground/kafka-emulator`](/playground/kafka-emulator) | Sources of a Kafka emulator used for demonstrating KafkaIO examples. | |
| | [`/playground/terraform`](/playground/terraform) | Terraform configuration files for Playground deployment to Google Cloud Platform. | |
| | [`/sdks`](/sdks) | Source of the BEAM SDKs. Used by Playground as a source of examples for Go and Python SDKs. | |
| |
| # Contribution guide |
| - Backend: see [backend/README.md](/playground/backend/README.md) and [backend/CONTRIBUTE.md](/playground/backend/CONTRIBUTE.md) |
| - Frontend: see [frontend/README.md](/playground/frontend/README.md) and [frontend/CONTRIBUTE.md](/playground/frontend/CONTRIBUTE.md) |