From 26e86c07ea927f9e3f9a208be5380712c698a6cd Mon Sep 17 00:00:00 2001 From: PatrickMiraP <79307293+PatrickMiraP@users.noreply.github.com> Date: Wed, 26 Jun 2024 14:19:26 +0200 Subject: [PATCH] Last onboarding improvements + Readme/Overview updates (#42) --- README.md | 31 +++--- docs/cli-quickstart.md | 122 ++++++++------------- docs/images/cli/add-readme-github-repo.png | Bin 0 -> 12138 bytes docs/images/cli/create-github-repo.png | Bin 0 -> 31185 bytes docs/overview.md | 22 +--- 5 files changed, 69 insertions(+), 106 deletions(-) create mode 100644 docs/images/cli/add-readme-github-repo.png create mode 100644 docs/images/cli/create-github-repo.png diff --git a/README.md b/README.md index 2b89f05..9e1740d 100644 --- a/README.md +++ b/README.md @@ -4,19 +4,28 @@ > > This repository is intended for internal use only and is currently a work in progress. Features and documentation may be incomplete or subject to change. Please ensure you have the necessary permissions and understand the implications of using unreleased or unstable features. -Welcome to Quix CLI, your powerful command-line companion for seamlessly managing and interacting with the features of our Quix Cloud product. While Quix offers a robust Frontend UI for a user-friendly experience, the CLI empowers you with efficiency and flexibility, allowing you to streamline your workflow and take control from the command line. +The **Quix CLI** is a free tool that enables you to create, debug, and run streaming pipelines locally using Docker and Quix Streams. -- **Effortless Control:** Execute commands effortlessly to manage various aspects of your Quix organisation. - -- **Script Automation:** Integrate Quix operations into your scripts for automated workflows and enhanced productivity. +It also serves as a companion app for seamlessly managing and interacting with the features of your [Quix Cloud](https://quix.io/docs/quix-cloud/overview.md){target=_blank} account. While Quix Cloud offers a robust Frontend UI for a user-friendly experience, the CLI empowers you with efficiency and flexibility, allowing you to streamline your workflow and take control from the command line. + +Quix CLI offers three groups of functionality: + +1. Local commands +2. Cloud commands +3. Utility commands + +Using the **local commands**, you can create your pipeline with predefined samples or write your code from scratch in Python, leveraging the power of Quix Streams. The CLI allows you to run these pipelines locally in Docker containers for testing and debugging. Optionally, you can deploy and synchronize your local pipeline to Quix Cloud. + +Using the **cloud commands**, you can manage your Quix Cloud account from the command line. While Quix Cloud offers a robust frontend UI for a user-friendly experience, the CLI provides efficiency and flexibility, allowing you to streamline your workflow and take control from the command line. The CLI aims to offer feature parity with the Quix Cloud UI, although some Quix Cloud functionalities are only available through the CLI, such as: -- **Accessibility:** Access and manipulate Quix features directly from the command line, providing an alternative interface for users who prefer terminal-based interactions. +* Permissions - Management of user permissions against the resources +* Auditing - Users auditing data -- **Scalability:** Seamlessly scale your Quix operations, whether you are working on a single instance or orchestrating tasks across multiple environments. +With the **utility commands**, you can perform tasks such as checking your status, updating the CLI, changing the CLI configuration, using interactive help, and managing contexts (the endpoint or environment the CLI is connected to). -Quix CLI is designed to be intuitive, consistent, and respectful of user preferences following [CLI design best practices](https://clig.dev/). +For a quick tutorial of how to use the basic functionalities of Quix CLI, visit [CLI Quickstart](https://www.quix.io/). -For more information and detailed documentation, visit [quix.io](https://www.quix.io/). +For more information and detailed documentation, visit [quix.io](https://www.quix.io/docs). ## Installation of Quix CLI @@ -75,12 +84,6 @@ To view and choose from all available versions, visit the [releases section](htt 2. Copy the executable to a location of your choice. 3. Add the location to your system's PATH. -### Installation via Dotnet Global tools - -```bash -dotnet tool install --global QuixCLI --prerelease -``` - ## Usage in order to get a list of available commands run: diff --git a/docs/cli-quickstart.md b/docs/cli-quickstart.md index ab009cb..4fb55fe 100644 --- a/docs/cli-quickstart.md +++ b/docs/cli-quickstart.md @@ -26,19 +26,19 @@ To install Quix CLI: === "macOS" - ``` + ``` bash curl -fsSL https://github.com/quixio/quix-cli/raw/main/install.sh | bash ``` === "Linux" - ``` + ``` bash curl -fsSL https://github.com/quixio/quix-cli/raw/main/install.sh | bash ``` === "Windows" - ``` + ``` powershell iwr https://github.com/quixio/quix-cli/raw/main/install.ps1 -useb | iex ``` @@ -54,27 +54,10 @@ This guide requires you to have certain dependencies installed. These include [D To verify you have the dependencies installed, run the following command: -``` +``` bash quix status ``` -This produces output similar to the following: - -``` -✗ Not logged in - User: ! Not logged in to Quix Cloud - Current context: default (https://portal-api.platform.quix.io) - Default environment: ! Not set - Sdk Broker configuration: Local (localhost:19092) -! Local Pipeline Status: Not Running -! Local Broker Status: Not Running -✓ Docker installed -✓ Git installed - Git Root: \path\to\your\repo -✓ VS Code installed -! PyCharm not installed -``` - View the output carefully to confirm you have Git and Docker installed: ``` @@ -84,14 +67,15 @@ View the output carefully to confirm you have Git and Docker installed: ## Step 3: Create a GitHub repository -Create a Git repo in GitHub, where you are going to store your project files. Create a repo initialized with a `README.md` file, so it can be cloned more easily. +Create a [**new Git repo**](https://github.com/new){target=_blank} on GitHub to store your project files. -See also the [GitHub documentation](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories){target=_blank}. +![Create a new Github repo](./images/cli/create-github-repo.png) -!!! note +Initialize the repo with a `README.md` file to make it easier to clone. - Make sure your GitHub repo is properly configured in your Git client to push changes to the remote repo. +![Add a README.md](./images/cli/add-readme-github-repo.png) +If you encounter any issues creating your GitHub repository, refer to this [documentation](https://docs.github.com/en/repositories/creating-and-managing-repositories/quickstart-for-repositories){target=_blank} on Github. ## Step 4: Clone your GitHub repo into your local project directory @@ -99,7 +83,7 @@ Copy your GitHub repository URL. Now, clone the repository using the URL. For example: -``` +``` bash git clone https://github.com// ``` @@ -107,25 +91,23 @@ git clone https://github.com// Replace `` and `` with your actual username and repository name. -See also the [GitHub documentation](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository){target=_blank}. +If you encounter any issues cloning your GitHub repository, refer to this [documentation](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository){target=_blank} on Github. + +!!! note + + Ensure your GitHub account is [correctly configured in your Git client](https://docs.github.com/en/get-started/getting-started-with-git/set-up-git) to push changes to the remote repository. -## Step 5: Navigate to your project folder +## Step 5: Initialize your project as a Quix project Change into your project directory: -``` +``` bash cd ``` -!!! tip - - Replace `` with your repository name. - -## Step 6: Initialize your project as a Quix project - In your Git project directory, enter ```quix init```. This initializes your Quix project with a `quix.yaml` file, which describes your Quix project. As a convenience a `.gitignore` file is also created for you, or if one is present it is updated to ignore files such as virtual environment files, `.env` files, and so on.: -``` +``` bash quix init ``` @@ -153,11 +135,11 @@ You can see there are currently no applications (deployments) or topics. The `quix.yaml` file defines the project pipeline in its entirety. -## Step 7: Create a source application +## Step 6: Create a source application Now create a source application that will ingest simulated telemetry data into the broker as if it were coming from a real car in real-time: -``` +``` bash quix app create demo-data-source ``` @@ -165,11 +147,11 @@ When prompted, assign it a name of `demo-data-source`. This creates a demo data source for you. A directory has been created for this application, along with all the necessary files. You can explore the files created with `ls`. -## Step 8: Create a transform application +## Step 7: Create a transform application Now let's create a simple transform application. This application will read data from the source and will generate a message when a hard braking is detected: -``` +``` bash quix app create event-detection-transformation ``` @@ -177,17 +159,20 @@ When prompted, assign it a name of `event-detection-transformation`. This creates the transform for you. A directory has been created for this application, along with all the necessary files. You can explore the files created with `ls`. -## Step 9: Update your pipeline +## Step 8: Update the deployments of your pipeline -Update your pipeline with the newly created applications of the project: +Update the deployments of your pipeline with the newly created applications of the project: -``` +``` bash quix pipeline update ``` -This command updates the deployment configuration of your pipeline based on the default configuration of your applications. +This command adds or updates the deployment configuration of your pipeline based on the default configuration of the existing applications in the project. + +!!! tip + Typically, each application corresponds to a single deployment (1:1). However, the system supports multiple deployments for a single application within your project (1:N) -Now, view your `quix.yaml` file again to see how the applications have been added: +Now, view your `quix.yaml` file again to see how a deployment for each application has been added: ``` yaml # Quix Project Descriptor @@ -236,13 +221,11 @@ deployments: topics: [] ``` -You can see here the applications that are going to be deployed as part of the pipeline. - -## Step 10: View your pipeline +Notice that the `quix.yaml` file has been updated with the variables defined in the `app.yaml` files located in each application folder. -View a graph representation of your local pipeline: +You can also view a graph representation of your local pipeline with the following command: -``` +``` bash quix pipeline view ``` @@ -252,17 +235,17 @@ If you have VSCode installed, the pipeline is displayed in the IDE for you, othe When you update your `quix.yaml` using the command `quix pipeline update`, the visualization is updated for you. -## Step 11: Run your pipeline +## Step 9: Run your pipeline -Run your pipeline in Docker based on your `quix.yaml` file: +Run your pipeline in Docker: -``` +``` bash quix pipeline up ``` -You'll see various console messages displayed in your terminal. When these have finished, then your deployed services are running in Docker. +This command generates a `compose.yaml` in the root of your project based on your `quix.yaml` file. -## Step 12: View your pipeline running in Docker +You'll see various console messages displayed in your terminal. When these have finished, then your deployed services are running in Docker. Now switch to Docker Desktop and view the containers of the pipeline running: @@ -272,33 +255,23 @@ You can also click on a **Event Detection** container and check its logs: ![Event detection transformation](./images/cli/docker-event-detection.png) -You can see that **hard braking** has been detected. +You can see that **hard braking** has been detected! !!! tip - A detailed explanation of the applications is beyond the scope of this Quickstart, but you can read more about the application code used in the [Quix Streams documentation](https://quix.io/docs/quix-streams/introduction.html). - -## Step 13: Stop your pipeline running - -You can stop your pipeline with the following command: - -``` -quix pipeline down -``` - -If you switch to Docker Desktop, you'll see your container has been halted and removed. + A detailed explanation of the applications code is beyond the scope of this guide. However, you can read more about Quix Streams library [here](https://quix.io/docs/quix-streams/introduction.html). -## Step 14: Push your local pipeline to Github +## Step 10: Push your local pipeline to Github To push your changes to Git, and sync your pipeline to Quix Cloud, enter: -``` +``` bash quix pipeline sync ``` -This pushes all changes to your Git repository. If you view your repository in your Git provider (for example GitHub), you'll see your files have been pushed. +This **pushes all changes** to your Git repository. If you view your repository in your Git provider (for example GitHub), you'll see your files have been pushed. -This command also synchronizes your Git repository with Quix Cloud. But, at this stage you do not have Quix Cloud available, so you receive the following error message: +This command also **synchronizes** your Git repository with Quix Cloud. But, at this stage you do not have Quix Cloud available, so you will receive the following error message: ``` You're not connected to Quix Cloud @@ -306,7 +279,7 @@ You're not connected to Quix Cloud ## Are you ready to level up? -**Quix Cloud** offers a robust and user-friendly platform for managing data pipelines, making it an ideal choice for organizations looking to streamline their development processes, enhance collaboration, and maintain high levels of observability and security. +[**Quix Cloud**](../quix-cloud/why-quix-cloud.md){target=_blank} offers a robust and user-friendly platform for managing data pipelines, making it an ideal choice for organizations looking to streamline their development processes, enhance collaboration, and maintain high levels of observability and security. - **Streamlined Development and Deployment**: Quix Cloud simplifies the development and deployment of data pipelines with its integrated online code editors, CI/CD tools, and YAML synchronization features. - **Enhanced Collaboration**: The platform allows multiple users to collaborate efficiently, manage permissions, and maintain visibility over projects and environments. @@ -315,10 +288,7 @@ You're not connected to Quix Cloud - **Security and Compliance**: Securely manage secrets and ensure compliance with dedicated infrastructure and SLA options. - **Fully Managed Infrastructure**: Isolated cloud infrastructure, managed Kafka or BYO broker, topics management, and YAML-based infrastructure as code. -[Learn more about Quix Cloud features](../quix-cloud/why-quix-cloud.md) - - -## Next step +## Next steps
diff --git a/docs/images/cli/add-readme-github-repo.png b/docs/images/cli/add-readme-github-repo.png new file mode 100644 index 0000000000000000000000000000000000000000..cbe2588818d131e93575ecd8b6f32a1d0cf2a181 GIT binary patch literal 12138 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�M{IWjtPVDX83-4TBV=DU`#x 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 K%9co*hy5>Bw#5wq literal 0 HcmV?d00001 diff --git a/docs/overview.md b/docs/overview.md index 17bd411..25258d6 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -5,32 +5,22 @@ description: The Quix Command-Line Interface. A powerful command-line companion # Quix Command-Line Interface (CLI) -The [Quix CLI](https://github.com/quixio/quix-cli){target=_blank} is a powerful command-line interface that enables you to develop stream processing pipelines and manage your Quix Cloud account. +The [Quix CLI](https://github.com/quixio/quix-cli){target=_blank} is a free tool that enables you to create, debug, and run streaming pipelines locally using Docker and Quix Streams. It also serves as a companion app for seamlessly managing and interacting with the features of your [Quix Cloud](../quix-cloud/overview.md){target=_blank} account. Quix CLI offers three groups of functionality: -1. Local development commands -2. Manage Quix Cloud commands +1. Local commands +2. Cloud commands 3. Utility commands -Using the local commands, you develop your pipeline using predefined samples, or write your code from scratch in Python, leveraging the power of Quix Streams. Using the CLI you can run these pipelines locally in Docker containers, for testing and debugging. You can then deploy to Cloud for scalability and observability. +Using the **local commands**, you can create your pipeline with predefined samples or write your code from scratch in Python, leveraging the power of Quix Streams. The CLI allows you to run these pipelines locally in Docker containers for testing and debugging. Optionally, you can deploy and synchronize your local pipeline to Quix Cloud. -Using the cloud commands, you can manage your Quix Cloud account, and all the pipelines within, as the CLI offers feature parity with the Quix Cloud UI. For example, you can manage: - -* Your organization -* Projects -* Environments -* Applications -* Deployments -* Topics -* Users - -There are some Quix Cloud functionaly that is only available from the CLI currently, such as: +Using the **cloud commands**, you can manage your Quix Cloud account from the command line. While Quix Cloud offers a robust frontend UI for a user-friendly experience, the CLI provides efficiency and flexibility, allowing you to streamline your workflow and take control from the command line. The CLI aims to offer feature parity with the Quix Cloud UI, although some Quix Cloud functionalities are only available through the CLI, such as: * Permissions - Management of user permissions against the resources * Auditing - Users auditing data -With the utility commands you can do things such as check your status, update the CLI, check version, use interactive help, and manage contexts (the environment the CLI is connected to). +With the **utility commands**, you can perform tasks such as checking your status, updating the CLI, changing the CLI configuration, using interactive help, and managing contexts (the endpoint or environment the CLI is connected to). ## Development status