From a55ea24c26de336342a56e15a058207849b94b00 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 27 Mar 2024 14:22:36 +0100 Subject: [PATCH 01/37] A bunch of changes --- modules/contributor/nav.adoc | 10 +- .../{steps.adoc => contributing-code.adoc} | 128 ++++++++---------- .../pages/contributing-documentation.adoc | 21 +++ .../contributor/pages/guidelines/logging.adoc | 2 +- .../pages/guidelines/opa-configuration.adoc | 2 +- .../pages/guidelines/service-discovery.adoc | 2 +- .../pages/guidelines/webhook-server.adoc | 2 +- modules/contributor/pages/index.adoc | 110 +++++++-------- .../pages/testing-on-kubernetes.adoc | 1 - 9 files changed, 137 insertions(+), 141 deletions(-) rename modules/contributor/pages/{steps.adoc => contributing-code.adoc} (62%) create mode 100644 modules/contributor/pages/contributing-documentation.adoc diff --git a/modules/contributor/nav.adoc b/modules/contributor/nav.adoc index 006847cee..8a3ace26e 100644 --- a/modules/contributor/nav.adoc +++ b/modules/contributor/nav.adoc @@ -1,12 +1,12 @@ * xref:index.adoc[] ** xref:project-overview.adoc[] -** xref:steps.adoc[] -** xref:testing_on_kubernetes.adoc[] -** xref:code-style-guide.adoc[] -** xref:docs-style-guide.adoc[] -** Implementation guidelines +** xref:contributing-code.adoc[] +*** xref:testing_on_kubernetes.adoc[] +*** xref:code-style-guide.adoc[] *** xref:guidelines/logging.adoc[] *** xref:guidelines/service-discovery.adoc[] *** xref:guidelines/opa-configuration.adoc[] *** xref:guidelines/webhook-server.adoc[] +** xref:contributing-documentation.adoc[] +*** xref:docs-style-guide.adoc[] include::partial$adr-nav.adoc[] diff --git a/modules/contributor/pages/steps.adoc b/modules/contributor/pages/contributing-code.adoc similarity index 62% rename from modules/contributor/pages/steps.adoc rename to modules/contributor/pages/contributing-code.adoc index af8fc3b42..d986d211e 100644 --- a/modules/contributor/pages/steps.adoc +++ b/modules/contributor/pages/contributing-code.adoc @@ -1,4 +1,4 @@ -= Steps to contribute += Contributing code :docs-readme: https://github.com/stackabletech/documentation/blob/main/README.adoc :templating-repo: https://github.com/stackabletech/operator-templating @@ -6,63 +6,57 @@ :docker-repo: https://github.com/stackabletech/docker-images :docs-repo: https://github.com/stackabletech/documentation -This guide covers the steps for internal and external contributors. Differences will be outlined. +== Development Environment -Depending on the project, not all steps make sense. For instance, if the documentation was changed then the integration -tests need not to be adapted. Please skip the steps which are not applicable. +In order to contribute source code, you need an environment that is capable of running the following tools: -== Preparation +* https://www.docker.com/[Docker] +* https://kind.sigs.k8s.io/[Kind] +* https://helm.sh/[Helm] +* https://kuttl.dev/[Kuttl] +* https://www.rust-lang.org/[Rust] +* https://www.python.org/[Python] -. As an external contributor, please fork the according repository on GitHub. -. Clone the repository to the local machine or if it is already cloned then make sure to pull the latest changes. - Backports to previous releases are not covered in this guide. -. Create a feature branch. As for now, there is no naming convention. +Almost all build scripts assume a Unix based environment (preferably Linux). -== Changes in Rust projects +=== IDEs and Editors -. Make your desired changes in the according repository and test them manually. Ensure that the code compiles without +Of course you are free to use whatever works for you best. No editor is perfect but we have positive experience with: + +* https://www.jetbrains.com/idea/[IntelliJ Idea] with the `Rust` plug-in +* https://code.visualstudio.com/[VisualStudio Code] with the `rust-analyzer` extension + +For `VisualStudio Code` we also recommend the following extensions: + +* https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml[Even Better TOML] +* https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb[CodeLLDB] (for debugging) +* https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens[Error Lens] (inline error messages) +* https://marketplace.visualstudio.com/items?itemName=asciidoctor.asciidoctor-vscode[AsciiDoc] +* https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github[GitHub Pull requests and Issues] +* https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens[GitLens] +* https://marketplace.visualstudio.com/items?itemName=ms-python.python[Python] +* https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker[Docker] + +== Steps + +* Make your desired changes in the according repository and test them manually. Ensure that the code compiles without warnings (`cargo clippy --all-targets`) and that the code is formatted with `cargo fmt`. Also make sure that all changes are made in accordance to the xref:code-style-guide.adoc[source code style guide]. -. If code was added or adapted then please create or adapt the unit tests in the same file as well as the integration +* If code was added or adapted then please create or adapt the unit tests in the same file as well as the integration tests in the `tests` directory. Ensure that all unit tests run successfully `cargo test`) and all integration tests run successfully (`./scripts/run_tests.sh`). See also <<_changes_in_the_integration_tests>>. -. Comment your code and check with `cargo doc --document-private-items` that there are no syntax errors. -. The YAML schemas of the custom resource definitions (CRDs) are rebuilt when the project is compiled (see +* Comment your code and check with `cargo doc --document-private-items` that there are no syntax errors. +* The YAML schemas of the custom resource definitions (CRDs) are rebuilt when the project is compiled (see `rust/operator-binary/build.rs` if changing an operator). These CRDs as well as the product configuration are also required in the Helm chart and the Kubernetes manifest. To ensure that everything is in a consistent state, please execute `make regenerate-charts`. -. If it is useful for the users of the project to know about the change then it must be added to the changelog. For +* If it is useful for the users of the project to know about the change then it must be added to the changelog. For instance, if only the dependencies in an operator are upgraded but nothing changes for the user then the upgrade should not be added to the changelog. Conversely, if the dependencies in the {operator-repo}[operator framework] are upgraded then changes are probably required in the operators (which are the clients of the framework) and therefore the upgrade must be mentioned in the changelog. The changelog must be formatted according to https://keepachangelog.com/en/1.1.0/[keep a changelog]. -== Changes in the product images - -. The code for building the product images can be found in the {docker-repo}[docker-images repository]. Please follow - the steps in <>. -. Make the desired changes. -. Add an entry to the product image changelog and use the pattern `-stackable` to - reference the next image version. The `` follows semantic versioning and is independent of - the upstream version. -. If a new version of a product was added then the following tasks must be performed: - * Add the new version to the supported ones in the documentation of the operators (see - `docs/modules/\{product name\}/partials/supported-versions.adoc` in the operator repositories). - * Update the operator to support the new version if necessary. - * Update the examples in the operator to use the new version. - * Update the integration tests. The tests should cover the latest patch version of each supported versions. -. Run the integration tests with the new product image. The image can be built and uploaded to the kind cluster with the - following commands: -+ -[source,bash] ----- -./build_product_images.py --product --image_version -kind load docker-image --name=integration-tests ----- -+ -See the output of `build_product_images.py` to retrieve the image tag for ``. - == Changes in the integration tests . Most code changes should also be tested with integration tests. The tests for every operator can be found in the @@ -87,15 +81,6 @@ helm install deploy/helm// . Run the tests from the repository root with `./scripts/run_tests.sh`. -== Changes in the documentation - -. The Stackable Platform documentation can be found at https://docs.stackable.tech/. The documentation is built with - Antora from the sources in the {docs-repo}[documentation repository] and the `docs` directories in the operator - repositories. Follow the steps in <> to be able to change the documentation. -. Make your changes. -. Build the documentation locally to ensure that the formatting is fine and all links are specified correctly. See the - {docs-readme}[`README.adoc`] file for further details and the xref:docs-style-guide.adoc[] for style and formatting - guidelines. == Changes in the operator-templating @@ -110,24 +95,27 @@ helm install deploy/helm// which creates again pull requests for all operators. Changes in the GitHub workflow actions cannot be tested until finally merged. -== Create pull requests - -. Finally, pull requests must be created for all adapted repositories. - * Have a look at the review checklist and ensure that all applicable points are fulfilled. - * Create a comprehensive description of the changes. - * Link the according issue to the pull request by using a keyword like "Closes". - * Add references to other pull requests, like the pull request in the integration-tests repository which contains test - cases for the change in the operator pull request. - * Select a reviewer. Usually "stackabletech/developers" is a good choice. - * If you are an internal contributor then assign yourself to the issue. -. All pull requests must pass a quality gate before they can be merged. This gate consists of required and not strictly - required checks which are performed by automated GitHub checks, as well as the mentioned checklist which is checked - manually in the review. The number of checks seems to be overwhelming but in practice they can be quite easily - fulfilled if following this guide. A properly set-up development environment (see - xref:index.adoc#_development_environment[Development Environment]) makes it even easier because the most critical - steps are performed automatically like showing Clippy warnings while developing and formatting the code. Have a look - at the status of the checks after they are processed and fix them. The `reviewdog` checks are not mandatory and can be - ignored if the according change was intentionally. For instance, if a Kubernetes secret was added to the examples of - an operator then the `detect-secrets` steps could fail which is okay in this case. -. After the pull request is approved, it can be merged. Internal contributors merge them on their own. Pull request from - external contributors are merged by the approver. +== Contributing to product images + +. The code for building the product images can be found in the {docker-repo}[docker-images repository]. Please follow + the steps in <>. +. Make the desired changes. +. Add an entry to the product image changelog and use the pattern `-stackable` to + reference the next image version. The `` follows semantic versioning and is independent of + the upstream version. +. If a new version of a product was added then the following tasks must be performed: + * Add the new version to the supported ones in the documentation of the operators (see + `docs/modules/\{product name\}/partials/supported-versions.adoc` in the operator repositories). + * Update the operator to support the new version if necessary. + * Update the examples in the operator to use the new version. + * Update the integration tests. The tests should cover the latest patch version of each supported versions. +. Run the integration tests with the new product image. The image can be built and uploaded to the kind cluster with the + following commands: ++ +[source,bash] +---- +./build_product_images.py --product --image_version +kind load docker-image --name=integration-tests +---- ++ +See the output of `build_product_images.py` to retrieve the image tag for ``. diff --git a/modules/contributor/pages/contributing-documentation.adoc b/modules/contributor/pages/contributing-documentation.adoc new file mode 100644 index 000000000..103810dd3 --- /dev/null +++ b/modules/contributor/pages/contributing-documentation.adoc @@ -0,0 +1,21 @@ += Contributing to documentation + +:docs-readme: https://github.com/stackabletech/documentation/blob/main/README.adoc +:templating-repo: https://github.com/stackabletech/operator-templating +:operator-repo: https://github.com/stackabletech/operator-rs +:docker-repo: https://github.com/stackabletech/docker-images +:docs-repo: https://github.com/stackabletech/documentation + + +The documentation is written in https://asciidoctor.org[AsciiDoc] format and processed with https://antora.org[Antora] + +Almost all build scripts assume a Unix based environment (preferably Linux). + + +. The Stackable Platform documentation can be found at https://docs.stackable.tech/. The documentation is built with + Antora from the sources in the {docs-repo}[documentation repository] and the `docs` directories in the operator + repositories. Follow the steps in <> to be able to change the documentation. +. Make your changes. +. Build the documentation locally to ensure that the formatting is fine and all links are specified correctly. See the + {docs-readme}[`README.adoc`] file for further details and the xref:docs-style-guide.adoc[] for style and formatting + guidelines. \ No newline at end of file diff --git a/modules/contributor/pages/guidelines/logging.adoc b/modules/contributor/pages/guidelines/logging.adoc index 64d419619..ebf73d53a 100644 --- a/modules/contributor/pages/guidelines/logging.adoc +++ b/modules/contributor/pages/guidelines/logging.adoc @@ -2,7 +2,7 @@ :highlightjs-languages: rust :page-aliases: logging.adoc -= Logging aggregation implementation guidelines += Implementing log aggregation For a conceptual overview of logging aggregation, consult the xref:concepts:logging.adoc[logging concept page]. diff --git a/modules/contributor/pages/guidelines/opa-configuration.adoc b/modules/contributor/pages/guidelines/opa-configuration.adoc index 57c35618b..a7228f91f 100644 --- a/modules/contributor/pages/guidelines/opa-configuration.adoc +++ b/modules/contributor/pages/guidelines/opa-configuration.adoc @@ -1,4 +1,4 @@ -= OPA connection implementation guidelines += Implementing OPA authorization :page-aliases: opa_configuration.adoc, opa-configuration.adoc :source-highlighter: highlight.js :highlightjs-languages: rust diff --git a/modules/contributor/pages/guidelines/service-discovery.adoc b/modules/contributor/pages/guidelines/service-discovery.adoc index 0e473f6ca..8edc0adc4 100644 --- a/modules/contributor/pages/guidelines/service-discovery.adoc +++ b/modules/contributor/pages/guidelines/service-discovery.adoc @@ -1,4 +1,4 @@ -= Service discovery implementation guidelines += Implementing service discovery :page-aliases: service_discovery.adoc, service-discovery.adoc :source-highlighter: highlight.js :highlightjs-languages: rust diff --git a/modules/contributor/pages/guidelines/webhook-server.adoc b/modules/contributor/pages/guidelines/webhook-server.adoc index 9ded69326..4fcdac025 100644 --- a/modules/contributor/pages/guidelines/webhook-server.adoc +++ b/modules/contributor/pages/guidelines/webhook-server.adoc @@ -1,4 +1,4 @@ -= Webhook server implementation guidelines += Implementing Kubernetes webhooks == Creating a new binary crate diff --git a/modules/contributor/pages/index.adoc b/modules/contributor/pages/index.adoc index bd407db33..192fe4d59 100644 --- a/modules/contributor/pages/index.adoc +++ b/modules/contributor/pages/index.adoc @@ -1,74 +1,62 @@ -= Contributor's Guide += Contributor's guide + +:gh-pr: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request +:gh-create-issue: https://docs.github.com/en/issues/tracking-your-work-with-issues/creating-an-issue + +Welcome to Stackable, we're happy to have your contributions! +Contributions can come in many different ways, and this document is the entry point to point you into the right direction to get your contribution posted as soon as possible. + +* First of all, if you have a **question** and something is unclear and you couldn't find the information you needed, ask a question on https://github.com/orgs/stackabletech/discussions[GitHub discussions]. + This is the first place you should go to if you don't know where to start. +* If you found a **bug or a feature request** and you already know where it would need to go, _search for similar issues first_! + If you cannot find anything, {gh-create-issue}[create an issue] in the repository that belongs to the component where you found the bug or have the feature request. + You can also have a look at the xref:project-overview.adoc[] to find out which repository might be the right place to go to. + An issue is also the right tool if you have a suggestion for a fix for a bug but first want to report the bug to raise awareness. + When creating a new issue please provide as much information as you consider relevant. + Issues can be bug reports, feature requests and so on. + The Stackable repositories provide templates to make it easier to submit high-quality issues. +* If you are already familiar with the xref:project-overview.adoc[] and you have a **particular fix or feature to contribute in code**, you can {gh-pr}[create a pull request] in the specific repository. + Again, it is useful to first to a quick search if there is already an issue or other pull request that is similar to yours. + If that is the case, consider contributing to the existing issue by either adding new feedback or code. + The steps to contribute a pull request are outlined below, and you should also consult the xref:contributing-code.adoc[] guidelines to make sure your contribution isn't missing anything and follow the <> below. +* If you want to contribute **documentation**, follow the xref:contributing-documentation.adoc[] guideline, as well as the <> below. + +== Project overview -Welcome to Stackable! - -This document will show you the steps needed to contribute to the Stackable Platform. Contributions can come in many -shapes and forms but in this document we'll focus on code and documentation improvements. We'll assume you already know -what the Stackable Platform is and have a specific issue that you want solved. - -This document aims at getting your contribution posted as soon as possible. - -== Contribution Workflow - -The development of the Stackable Platform takes place on https://github.com/stackabletech[GitHub]. -On GitHub, each repository has its own issue tracker and since Stackable is a platform, there are several repositories where issues and pull requests can be created. -If you already have a good idea where the issue or pull request belongs, then you can skip reading to the contribution steps below. -Otherwise, you might want to a have a look at the xref:project-overview.adoc[] for hints. - -Contribution steps: - -. Lookup if an existing issue already covers your problem -. Submit a new issue. If it is only a trivial change like fixing a typo then an issue is not necessary and a - pull-request can be created directly. -. Submit a pull-request if you want. The necessary steps to successfully create an approvable pull-request are detailed - in xref:steps.adoc[]. -. Respond to questions or feedback -. Improve your submission if necessary -. Closing your contribution - -Before submitting a new issue or pull-request, it's always a good idea to check if the issue has already been discussed -in the past and if there is a resolution for it. If that is the case, consider contributing to the existing issue by -either adding new feedback or code. - -When creating a new issue please provide as much information as you consider relevant. Issues can be bug reports, -feature requests and so on. The Stackable repositories provide templates to make it easier to submit high-quality -issues. - -When submitting a pull-request, you might be interested in knowing about the necessary <>. +Please see the xref:project-overview.adoc[] page to get an overview of the most important Git repositories used by us. -== Repo Walkthrough +[[contributing-workflow]] +== General pull request guidelines -Please see the xref:project-overview.adoc[] page to get an overview of the most important Git repositories used by us. +All our development is done on https://github.com/stackabletech[GitHub] with a and contributions should be made through {gh-pr}[creating pull requests], +follow the GitHub instructions on how to do this. +If you are an external contributor, you will need to fork the repository where you want your change to be made. -== Development Environment +Please make sure that you base your pull request on the latest changes in the `main` branch of the repository if it is a general change you want to see added to the platform, or off of a specific release branch (named `release-23.11` for example) if you want to contribute a fix that is specific to a release. +At Stackable we use a branch structure based on https://trunkbaseddevelopment.com/[trunk based development]. -In order to contribute source code, you need an environment that is capable of running the following tools: +=== Review preparation -* https://www.docker.com/[Docker] -* https://kind.sigs.k8s.io/[Kind] -* https://helm.sh/[Helm] -* https://kuttl.dev/[Kuttl] -* https://www.rust-lang.org/[Rust] -* https://www.python.org/[Python] +In your pull request, give a comprehensive description of the changes you are making and why, and reference any issues that are relevant to your pull request. -The documentation is written in https://asciidoctor.org[AsciiDoc] format and processed with https://antora.org[Antora] +Some repositories have _review checklists_ that are found in the pull request template, for example the operator repositories have these checklists. +Before requesting a review, make sure to go through the list and ensure that everything is ready for review. -Almost all build scripts assume a Unix based environment (preferably Linux). +Some repositories also have automated checks in place that check code style and general consistency. +Make sure that all checks are running successfully on your pull request. +If you follow the xref:contributing-code.adoc[] guide, a lot of checks should already be covered by your development environment setup (this includes things like linters and formatting). -=== IDEs and Editors +Once you are ready for review, request a review from 'stackabletech/developers'. +If you are an internal contributor, assign yourself to your pull request. -Of course you are free to use whatever works for you best. No editor is perfect but we have positive experience with: +=== Review -* https://www.jetbrains.com/idea/[IntelliJ Idea] with the `Rust` plug-in -* https://code.visualstudio.com/[VisualStudio Code] with the `rust-analyzer` extension +During the review phase, a Stackable employee will review your contribution. +Respond to questions and feedback, and improve your submission if necessary. -For `VisualStudio Code` we also recommend the following extensions: +A single approval of your contribution is sufficient for it to be merged. +After your pull request is approved, it can be merged. +Internal contributors merge them on their own, pull requests from external contributors are merged by the approver. -* https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml[Even Better TOML] -* https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb[CodeLLDB] (for debugging) -* https://marketplace.visualstudio.com/items?itemName=usernamehw.errorlens[Error Lens] (inline error messages) -* https://marketplace.visualstudio.com/items?itemName=asciidoctor.asciidoctor-vscode[AsciiDoc] -* https://marketplace.visualstudio.com/items?itemName=GitHub.vscode-pull-request-github[GitHub Pull requests and Issues] -* https://marketplace.visualstudio.com/items?itemName=eamodio.gitlens[GitLens] -* https://marketplace.visualstudio.com/items?itemName=ms-python.python[Python] -* https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-docker[Docker] +Once your pull request is merged, you have successfully contributed! +Congratulations! diff --git a/modules/contributor/pages/testing-on-kubernetes.adoc b/modules/contributor/pages/testing-on-kubernetes.adoc index 099612c1c..86b973a51 100644 --- a/modules/contributor/pages/testing-on-kubernetes.adoc +++ b/modules/contributor/pages/testing-on-kubernetes.adoc @@ -1,7 +1,6 @@ = Testing your Code on Kubernetes :page-aliases: testing_on_kubernetes.adoc -== Description It can sometimes be a bit cumbersome to actually test your code on Kubernetes proper, as there are many moving parts involved. You need to compile the code, build helm charts, build and push the container images, etc. From c8731f91ede40470749fa2b180033d455d0f6048 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 27 Mar 2024 14:28:09 +0100 Subject: [PATCH 02/37] formatting fixes --- .../contributor/pages/contributing-code.adoc | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) diff --git a/modules/contributor/pages/contributing-code.adoc b/modules/contributor/pages/contributing-code.adoc index d986d211e..1d5c41bd0 100644 --- a/modules/contributor/pages/contributing-code.adoc +++ b/modules/contributor/pages/contributing-code.adoc @@ -39,18 +39,18 @@ For `VisualStudio Code` we also recommend the following extensions: == Steps -* Make your desired changes in the according repository and test them manually. Ensure that the code compiles without +. Make your desired changes in the according repository and test them manually. Ensure that the code compiles without warnings (`cargo clippy --all-targets`) and that the code is formatted with `cargo fmt`. Also make sure that all changes are made in accordance to the xref:code-style-guide.adoc[source code style guide]. -* If code was added or adapted then please create or adapt the unit tests in the same file as well as the integration +. If code was added or adapted then please create or adapt the unit tests in the same file as well as the integration tests in the `tests` directory. Ensure that all unit tests run successfully `cargo test`) and all integration tests run successfully (`./scripts/run_tests.sh`). See also <<_changes_in_the_integration_tests>>. -* Comment your code and check with `cargo doc --document-private-items` that there are no syntax errors. -* The YAML schemas of the custom resource definitions (CRDs) are rebuilt when the project is compiled (see +. Comment your code and check with `cargo doc --document-private-items` that there are no syntax errors. +. The YAML schemas of the custom resource definitions (CRDs) are rebuilt when the project is compiled (see `rust/operator-binary/build.rs` if changing an operator). These CRDs as well as the product configuration are also required in the Helm chart and the Kubernetes manifest. To ensure that everything is in a consistent state, please execute `make regenerate-charts`. -* If it is useful for the users of the project to know about the change then it must be added to the changelog. For +. If it is useful for the users of the project to know about the change then it must be added to the changelog. For instance, if only the dependencies in an operator are upgraded but nothing changes for the user then the upgrade should not be added to the changelog. Conversely, if the dependencies in the {operator-repo}[operator framework] are upgraded then changes are probably required in the operators (which are the clients of the framework) and therefore @@ -60,17 +60,17 @@ For `VisualStudio Code` we also recommend the following extensions: == Changes in the integration tests . Most code changes should also be tested with integration tests. The tests for every operator can be found in the - operator repository in the `tests` directory. Follow the steps in <> for the integration tests as well. -. Create or adapt the tests. Try to mimic the style of the other tests. They are written with https://kuttl.dev/[KUTTL] - and using a jinja2 templating mechanism to test multiple product versions at once. -. Start a test cluster using https://kind.sigs.k8s.io/[kind]. You can also use - xref:management:stackablectl:commands/operator.adoc#_install_operator[stackablectl] to install a kind cluster. -. If changes in an operator are tested then the according version of the operator must be started. The operator can be - started outside the cluster with `cargo run -- crd | kubectl apply -f - && cargo run -- run`. This approach allows a - fast test develop cycle but has the downside that the RBAC rules are not tested. So a proper Helm installation should - be tested before creating a pull request. First a Docker image of the operator must be built locally and uploaded to - the kind cluster and then the Helm chart must be installed. This can be achieved in the operator directory with the - following commands: + operator repository in the `tests` directory. +. Create or adapt the tests. + Try to mimic the style of the other tests. + They are written with https://kuttl.dev/[KUTTL] and our own templating tool https://github.com/stackabletech/beku.py[beku.py] to template tests and test multiple product versions at once. +. Start a test cluster using https://kind.sigs.k8s.io/[kind]. +. If changes in an operator are tested then the according version of the operator must be started. + The operator can be started outside the cluster with `cargo run -- crd | kubectl apply -f - && cargo run -- run`. + This approach allows a fast test develop cycle but has the downside that the RBAC rules are not tested. + So a proper Helm installation should be tested before creating a pull request. + First a Docker image of the operator must be built locally and uploaded to the kind cluster and then the Helm chart must be installed. + This can be achieved in the operator directory with the following commands: + [source,bash] ---- @@ -78,7 +78,6 @@ docker build --file docker/Dockerfile --tag docker.stackable.tech/stackable/:-dev --name=integration-tests helm install deploy/helm// ---- - . Run the tests from the repository root with `./scripts/run_tests.sh`. From 8323a2b0cce30cdd7acd383e231965f790464f9c Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 27 Mar 2024 14:35:41 +0100 Subject: [PATCH 03/37] Added some languages that are needed --- modules/contributor/pages/contributing-code.adoc | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/contributor/pages/contributing-code.adoc b/modules/contributor/pages/contributing-code.adoc index 1d5c41bd0..df1ccdacb 100644 --- a/modules/contributor/pages/contributing-code.adoc +++ b/modules/contributor/pages/contributing-code.adoc @@ -10,6 +10,7 @@ In order to contribute source code, you need an environment that is capable of running the following tools: +* https://git-scm.com/[Git] * https://www.docker.com/[Docker] * https://kind.sigs.k8s.io/[Kind] * https://helm.sh/[Helm] @@ -17,6 +18,8 @@ In order to contribute source code, you need an environment that is capable of r * https://www.rust-lang.org/[Rust] * https://www.python.org/[Python] +Depending on the repository, you might also need https://go.dev/[Go], https://www.java.com/en/[Java] or other programming language support. + Almost all build scripts assume a Unix based environment (preferably Linux). === IDEs and Editors From 4d8abbba69fd518457022313b556b8ffc6b33950 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 27 Mar 2024 16:05:30 +0100 Subject: [PATCH 04/37] Turn doc page into a stub to be written later. --- .../contributor/pages/contributing-code.adoc | 48 ++++--------------- .../pages/contributing-documentation.adoc | 20 +------- 2 files changed, 10 insertions(+), 58 deletions(-) diff --git a/modules/contributor/pages/contributing-code.adoc b/modules/contributor/pages/contributing-code.adoc index df1ccdacb..9f7ffff63 100644 --- a/modules/contributor/pages/contributing-code.adoc +++ b/modules/contributor/pages/contributing-code.adoc @@ -1,16 +1,15 @@ = Contributing code -:docs-readme: https://github.com/stackabletech/documentation/blob/main/README.adoc :templating-repo: https://github.com/stackabletech/operator-templating :operator-repo: https://github.com/stackabletech/operator-rs :docker-repo: https://github.com/stackabletech/docker-images -:docs-repo: https://github.com/stackabletech/documentation == Development Environment In order to contribute source code, you need an environment that is capable of running the following tools: * https://git-scm.com/[Git] +* https://www.gnu.org/software/make/manual/make.html[make] * https://www.docker.com/[Docker] * https://kind.sigs.k8s.io/[Kind] * https://helm.sh/[Helm] @@ -83,41 +82,12 @@ helm install deploy/helm// ---- . Run the tests from the repository root with `./scripts/run_tests.sh`. +== Adding support for a new product version -== Changes in the operator-templating - -. Files which are common in all operators are handled and rolled out by the {templating-repo}[operator-templating]. - Follow the steps in <> to check out the repository. -. Make your changes. -. Test the changes locally. Create the directory `work`, clone all operators into this directory, and run the `test.sh` - script. The changes can be examined with `git status`. When the pull request is later merged into the `main` branch - then pull requests with these changes will be created automatically. Depending on the change, it makes sense to run - the integration tests for all changed operators. If the tests are not run in this stage and if there is even just one - integration test failing in the subsequential generated pull requests then the operator-templating must be adapted - which creates again pull requests for all operators. Changes in the GitHub workflow actions cannot be tested until - finally merged. - -== Contributing to product images - -. The code for building the product images can be found in the {docker-repo}[docker-images repository]. Please follow - the steps in <>. -. Make the desired changes. -. Add an entry to the product image changelog and use the pattern `-stackable` to - reference the next image version. The `` follows semantic versioning and is independent of - the upstream version. -. If a new version of a product was added then the following tasks must be performed: - * Add the new version to the supported ones in the documentation of the operators (see - `docs/modules/\{product name\}/partials/supported-versions.adoc` in the operator repositories). - * Update the operator to support the new version if necessary. - * Update the examples in the operator to use the new version. - * Update the integration tests. The tests should cover the latest patch version of each supported versions. -. Run the integration tests with the new product image. The image can be built and uploaded to the kind cluster with the - following commands: -+ -[source,bash] ----- -./build_product_images.py --product --image_version -kind load docker-image --name=integration-tests ----- -+ -See the output of `build_product_images.py` to retrieve the image tag for ``. +If a new version of a product was added then the following tasks must be performed: + +* Add the new version to the supported ones in the documentation of the operators (see + `docs/modules/\{product name\}/partials/supported-versions.adoc` in the operator repositories). +* Update the operator to support the new version if necessary. +* Update the examples in the operator to use the new version. +* Update the integration tests. The tests should cover the latest patch version of each supported versions. diff --git a/modules/contributor/pages/contributing-documentation.adoc b/modules/contributor/pages/contributing-documentation.adoc index 103810dd3..1c10c974d 100644 --- a/modules/contributor/pages/contributing-documentation.adoc +++ b/modules/contributor/pages/contributing-documentation.adoc @@ -1,21 +1,3 @@ = Contributing to documentation -:docs-readme: https://github.com/stackabletech/documentation/blob/main/README.adoc -:templating-repo: https://github.com/stackabletech/operator-templating -:operator-repo: https://github.com/stackabletech/operator-rs -:docker-repo: https://github.com/stackabletech/docker-images -:docs-repo: https://github.com/stackabletech/documentation - - -The documentation is written in https://asciidoctor.org[AsciiDoc] format and processed with https://antora.org[Antora] - -Almost all build scripts assume a Unix based environment (preferably Linux). - - -. The Stackable Platform documentation can be found at https://docs.stackable.tech/. The documentation is built with - Antora from the sources in the {docs-repo}[documentation repository] and the `docs` directories in the operator - repositories. Follow the steps in <> to be able to change the documentation. -. Make your changes. -. Build the documentation locally to ensure that the formatting is fine and all links are specified correctly. See the - {docs-readme}[`README.adoc`] file for further details and the xref:docs-style-guide.adoc[] for style and formatting - guidelines. \ No newline at end of file +This section is still to be written. From 39e16e7ae0096cc0f5ddc013831caace53de6c33 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 27 Mar 2024 16:05:36 +0100 Subject: [PATCH 05/37] ~ --- modules/contributor/pages/contributing-documentation.adoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/contributor/pages/contributing-documentation.adoc b/modules/contributor/pages/contributing-documentation.adoc index 1c10c974d..f27a15113 100644 --- a/modules/contributor/pages/contributing-documentation.adoc +++ b/modules/contributor/pages/contributing-documentation.adoc @@ -1,3 +1,7 @@ = Contributing to documentation This section is still to be written. + +All info is here for now: https://app.nuclino.com/Stackable/Engineering/Overview-147afda8-9d93-42ae-8dbe-ad9d3b1a87bd + +Will be migrated into the docs. From 3e5923b1ddf19504acaa832303710e6bf10dc4de Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 27 Mar 2024 16:07:29 +0100 Subject: [PATCH 06/37] ~ --- modules/contributor/pages/contributing-documentation.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/contributing-documentation.adoc b/modules/contributor/pages/contributing-documentation.adoc index f27a15113..22c88dea6 100644 --- a/modules/contributor/pages/contributing-documentation.adoc +++ b/modules/contributor/pages/contributing-documentation.adoc @@ -4,4 +4,4 @@ This section is still to be written. All info is here for now: https://app.nuclino.com/Stackable/Engineering/Overview-147afda8-9d93-42ae-8dbe-ad9d3b1a87bd -Will be migrated into the docs. +Will be migrated into the docs: https://github.com/stackabletech/documentation/issues/578 From 8cd5ddb859ddd37bdb52aff880363782910a73ee Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Tue, 2 Apr 2024 11:58:18 +0200 Subject: [PATCH 07/37] a bunch of changes --- README.adoc | 37 ++++++++-- antora-playbook.yml | 2 +- local-antora-playbook.yml | 2 +- modules/contributor/images/diataxis.png | Bin 0 -> 144575 bytes modules/contributor/nav.adoc | 5 +- .../pages/contributing-documentation.adoc | 7 -- .../docs/contributing-documentation.adoc | 6 ++ modules/contributor/pages/docs/overview.adoc | 63 ++++++++++++++++++ .../style-guide.adoc} | 2 +- modules/contributor/pages/index.adoc | 2 +- 10 files changed, 106 insertions(+), 20 deletions(-) create mode 100644 modules/contributor/images/diataxis.png delete mode 100644 modules/contributor/pages/contributing-documentation.adoc create mode 100644 modules/contributor/pages/docs/contributing-documentation.adoc create mode 100644 modules/contributor/pages/docs/overview.adoc rename modules/contributor/pages/{docs-style-guide.adoc => docs/style-guide.adoc} (98%) diff --git a/README.adoc b/README.adoc index 27ba3cb81..d10fa26ae 100644 --- a/README.adoc +++ b/README.adoc @@ -5,10 +5,22 @@ :base-repo: https://github.com/stackabletech This is the main repository for the documentation of the Stackable platform. -Have a look at the https://docs.stackable.tech/[live version]. +Have a look at the https://docs.stackable.tech/[live version] and the current https://docs.stackable.tech/home/nightly/[nightly live version]. The documentation is built with https://antora.org[Antora]. This repository hosts the Antora playbook file as well as platform documentation. Other Stackable repos contain 'docs' directories which are pulled in by this repo. + +== Repository structure + +* The `antora.yml` file defines the main `home` https://docs.antora.org/antora/latest/component-version/#docs-component[Component]. +* The various `*-playbook.yml` files are https://docs.antora.org/antora/latest/playbook/[Antora playbook files] used to build the docs, either locally or for production. The playbooks link to all the other repositories that contain content. +* The `modules` directory contains the platform level documentation content. + + +== Building locally + +**Dependencies**: `make`, `npm`. + To build the site, pull submodules, install dependencies and run `make`: [source,console] @@ -20,6 +32,21 @@ $ make NOTE: Antora caches the external content repos in the cache directory (configured to be `./cache`). It will _not_ automatically update those. Use the `--fetch` flag (`make ANTORAFLAGS=--fetch`) to update all sources, or use `make clean` to delete the `cache` and `build` directory. +== Production deployment + +The documentation is deployed on Netlify and is deployed when there is a new commit on the `main` branch, as well as freshly every night. +If you want to trigger a deploy right now, you can use the _Build and deploy production site_ GitHub action (internal contributors only). + +Deployment is run every night to pick up changes in the operator repositories, because these changes do not automatically trigger a new deployment. + +@fhennig is responsible for anything Netlify related. + +=== Netlify configuration + +Netlify is configured with the netlify.toml file inside of the documentation repo. In there, the command make netlify-build is configured as the build command. Further documentation of the build process can then be found in the Makefile. + +The build process creates a static site in `build/site` which is then published (as it is configured in the `netlify.toml`). + == Development === Generating the documentation @@ -40,10 +67,6 @@ The design & layout comes from our https://github.com/stackabletech/documentatio `LIVERELOAD=true gulp` may be used to recreate the built documentation after each edit. The 'live reload' feature does not work over gitpod currently due to https://github.com/schickling/gulp-webserver/pull/126 -=== Remote IDE - -A remote vscode instance can be used via https://gitpod.io/#/github.com/stackabletech/documentation - -== Tracking +== More useful links -The documentation UI includes a script for user tracking. The documentation can be built with or without it. Tracking enabled/disabled by setting `site.keys.enable_tracking` to `true` or `false`. The tracking code is in the UI repository in `src/partials/head-scripts.hbs`. +* The https://github.com/stackabletech/documentation-ui[documentation-ui] repository. \ No newline at end of file diff --git a/antora-playbook.yml b/antora-playbook.yml index ff23d9bb0..2f1c166ab 100644 --- a/antora-playbook.yml +++ b/antora-playbook.yml @@ -5,7 +5,7 @@ site: start_page: home::index.adoc robots: allow keys: - enable_tracking: true + enable_tracking: true # this key is used in the documentation-ui # URL config settings. # docs: https://docs.antora.org/antora/latest/playbook/configure-urls/ urls: diff --git a/local-antora-playbook.yml b/local-antora-playbook.yml index 42f1b2b7f..b125535fd 100644 --- a/local-antora-playbook.yml +++ b/local-antora-playbook.yml @@ -5,7 +5,7 @@ site: start_page: home::index.adoc robots: allow keys: - enable_tracking: false + enable_tracking: false # this key is used in the documentation-ui urls: # This replaces the component version in the URL of the latest stable version with 'stable' # i.e. /commons-operator/stable/index.html instead of /commons-operator/0.3/index.html diff --git a/modules/contributor/images/diataxis.png b/modules/contributor/images/diataxis.png new file mode 100644 index 0000000000000000000000000000000000000000..861f59a2b276959c3aaecb70bc0ed7e194d7d80a GIT binary patch literal 144575 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 below. -* If you want to contribute **documentation**, follow the xref:contributing-documentation.adoc[] guideline, as well as the <> below. +* If you want to contribute **documentation**, follow the xref:docs/contributing-documentation.adoc[] guideline, as well as the <> below. == Project overview From d34885c4b83a4abfa2b6a68b93e75808587763b6 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Tue, 2 Apr 2024 12:30:04 +0200 Subject: [PATCH 08/37] docs: Add release guide --- modules/contributor/nav.adoc | 1 + .../pages/docs/releasing-a-new-version.adoc | 13 +++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 modules/contributor/pages/docs/releasing-a-new-version.adoc diff --git a/modules/contributor/nav.adoc b/modules/contributor/nav.adoc index faeed48f4..25a758166 100644 --- a/modules/contributor/nav.adoc +++ b/modules/contributor/nav.adoc @@ -10,4 +10,5 @@ ** xref:docs/contributing-documentation.adoc[] *** xref:docs/overview.adoc[] *** xref:docs/style-guide.adoc[] +*** xref:docs/releasing-a-new-version.adoc[] include::partial$adr-nav.adoc[] diff --git a/modules/contributor/pages/docs/releasing-a-new-version.adoc b/modules/contributor/pages/docs/releasing-a-new-version.adoc new file mode 100644 index 000000000..a0d170036 --- /dev/null +++ b/modules/contributor/pages/docs/releasing-a-new-version.adoc @@ -0,0 +1,13 @@ += Releasing a new documentation version + +NOTE: This guide is directed at internal contributors, as an external contributor, you cannot release a new documentation version. + +Whenever there is a new Stackable Data Platform release, the documentation is also released with a new version. +This process has been automated with scripts, which are found in the https://github.com/stackabletech/documentation/tree/main/scripts[`scripts`] directory of the documentation repository. + +The process consists of two steps: + +. Making a new release branch (`make-release-branch.sh`) +. Publishing the new version by modifying the playbooks (`publish-new-version.sh`) + +Consult the scripts for details about the required steps, as well as prerequisites. From bc42df4fd167ac28469424a398f5fc3b1b193c91 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Tue, 2 Apr 2024 12:44:13 +0200 Subject: [PATCH 09/37] docs: Add backporting guide --- modules/contributor/nav.adoc | 1 + .../pages/docs/backporting-changes.adoc | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 modules/contributor/pages/docs/backporting-changes.adoc diff --git a/modules/contributor/nav.adoc b/modules/contributor/nav.adoc index 25a758166..9bf99fa96 100644 --- a/modules/contributor/nav.adoc +++ b/modules/contributor/nav.adoc @@ -10,5 +10,6 @@ ** xref:docs/contributing-documentation.adoc[] *** xref:docs/overview.adoc[] *** xref:docs/style-guide.adoc[] +*** xref:docs/backporting-changes.adoc[] *** xref:docs/releasing-a-new-version.adoc[] include::partial$adr-nav.adoc[] diff --git a/modules/contributor/pages/docs/backporting-changes.adoc b/modules/contributor/pages/docs/backporting-changes.adoc new file mode 100644 index 000000000..71ead16e1 --- /dev/null +++ b/modules/contributor/pages/docs/backporting-changes.adoc @@ -0,0 +1,22 @@ += Backporting changes + +The documentation uses https://trunkbaseddevelopment.com/[trunk based development], so any new content or fixes should first be applied to the `main` branch and then ported to the release branches where the feature/fix also applies. + +== Prerequisites + +* Make sure your changes are committed to the `main` branch and you have all the latest changes checked out locally on your `main` branch. +* Have the commit ID of the commit that you want to port to a release branch. + You can get the commit ID for example by looking at the log: `git log --oneline -n 5`. + The commit ID might look like this: `bc0b08e9`. + +== Steps + +. Switch to the release branch you want to backport to, for example: `git switch release/23.11`. + Make sure the release branch is up to date with the upstream (`git pull`). +. Cherry-pick the commit with the ID you retrieved earlier: `git cherry-pick bc0b08e9`. + In most cases this will work without changes, sometimes you need to do conflict resolution, similar to how you would need to do it for a merge. +. Push the new commit in the `release/23.11` branch upstream with `git push`. + That's it, you're done! + +The changes will become visible in the online documentation once the next build is triggered. +You can either wait for the nightly build, or trigger a build yourself with the https://github.com/stackabletech/documentation/actions/workflows/deploy.yml[Build and deploy production site] GitHub action. From 3093ecfff4d1976ea9277781a3fcb7d2a12c11c4 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Tue, 2 Apr 2024 12:51:38 +0200 Subject: [PATCH 10/37] docs: add troubleshooting page --- modules/contributor/nav.adoc | 1 + modules/contributor/pages/docs/troubleshooting-antora.adoc | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 modules/contributor/pages/docs/troubleshooting-antora.adoc diff --git a/modules/contributor/nav.adoc b/modules/contributor/nav.adoc index 9bf99fa96..9b81b827a 100644 --- a/modules/contributor/nav.adoc +++ b/modules/contributor/nav.adoc @@ -12,4 +12,5 @@ *** xref:docs/style-guide.adoc[] *** xref:docs/backporting-changes.adoc[] *** xref:docs/releasing-a-new-version.adoc[] +*** xref:docs/troubleshooting-antora.adoc[] include::partial$adr-nav.adoc[] diff --git a/modules/contributor/pages/docs/troubleshooting-antora.adoc b/modules/contributor/pages/docs/troubleshooting-antora.adoc new file mode 100644 index 000000000..24cd621d1 --- /dev/null +++ b/modules/contributor/pages/docs/troubleshooting-antora.adoc @@ -0,0 +1,6 @@ += Troubleshooting Antora build errors + +* Netlify build error: `Duplicate nav in nightly@home: modules/ROOT/nav.adoc` +** This probably means that there are two branches of the same repository defined in the Antora playbook, that have the same version set. + They both supply a `nav.adoc` file for the same component and version, and Antora doesn't know which one to pick. + Make sure that the release branches have the correct version set in their `antora.yml` files and also make sure that the `main` branch is still set to `nightly`. \ No newline at end of file From e77124f0fe25bee03d8acc990a93b6c371c11905 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Tue, 2 Apr 2024 12:54:03 +0200 Subject: [PATCH 11/37] docs: add note about executable tutorials --- modules/contributor/pages/docs/overview.adoc | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index 1857f3bad..e81599bd6 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -55,6 +55,13 @@ For Antora, the https://antora.zulipchat.com/[Antora Zulip chatroom] is a good p Building the documentation and also the deployment process on Netlify are documented in the https://github.com/stackabletech/documentation/blob/main/README.adoc[README] file of the documentation repository. +== Executable tutorials + +The Getting started guides for each operator are written with an executable script in the background from which the documentation includes excerpts. +This has the benefit that the tutorials are easily tested. +When writing a new tutorial, please also write it in this way. +Have a look at the Getting started guides on how to do this. + == Branch and version structure All Stackable repositories use https://trunkbaseddevelopment.com/[trunk based development], and so the documentation is also pulled from different release branches. From 5b9d53dffaa888d30048c633a2bacf34febde1df Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Tue, 2 Apr 2024 13:00:07 +0200 Subject: [PATCH 12/37] docs: add note about templating --- modules/contributor/pages/docs/overview.adoc | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index e81599bd6..838184c13 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -62,6 +62,18 @@ This has the benefit that the tutorials are easily tested. When writing a new tutorial, please also write it in this way. Have a look at the Getting started guides on how to do this. +== Templating + +There is a templating mechanism in the docs. +This has been introduced to template in mostly version numbers, so the updating doesn't have to be done by hand. + +Every Operator repo has a script `scripts/docs_templating.sh` and a file with templating variables `docs/templating_vars.yaml`. +The script applies the variables to all `.j2` files in the `docs` directory. + +This is used for getting started scripts, and in there only for versions of operators and for Helm Chart URLs. + +Without this templating mechanism, every release these values would need to be updated by hand (or possibly with a search and replace) with is error prone and time consuming. + == Branch and version structure All Stackable repositories use https://trunkbaseddevelopment.com/[trunk based development], and so the documentation is also pulled from different release branches. From 734593589f1b7ec224fe81933a8c3e196133cbe3 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Tue, 2 Apr 2024 16:20:10 +0200 Subject: [PATCH 13/37] docs: add note about signed commits --- modules/contributor/pages/index.adoc | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/modules/contributor/pages/index.adoc b/modules/contributor/pages/index.adoc index 32809a508..a631e1f6e 100644 --- a/modules/contributor/pages/index.adoc +++ b/modules/contributor/pages/index.adoc @@ -23,7 +23,7 @@ Contributions can come in many different ways, and this document is the entry po == Project overview -Please see the xref:project-overview.adoc[] page to get an overview of the most important Git repositories used by us. +Please see the xref:project-overview.adoc[] page to get an overview of the most important Git repositories in the Stackable organization. [[contributing-workflow]] == General pull request guidelines @@ -32,10 +32,19 @@ All our development is done on https://github.com/stackabletech[GitHub] with a a follow the GitHub instructions on how to do this. If you are an external contributor, you will need to fork the repository where you want your change to be made. +=== Signed commits + +As a supply chain security policy, all commits and tags in Stackable repositories need to be signed. +Signed commits ensure authenticity by verifying that a commit has indeed been made by a certain person and integrity to make sure that no data has been changed after the fact. + +Read https://stackable.tech/en/notes-on-signed-commits-with-git-and-github/[Notes on Signed Commits with Git and Github] for more information on using signed commits. + +=== Instructions + Please make sure that you base your pull request on the latest changes in the `main` branch of the repository if it is a general change you want to see added to the platform, or off of a specific release branch (named `release-23.11` for example) if you want to contribute a fix that is specific to a release. At Stackable we use a branch structure based on https://trunkbaseddevelopment.com/[trunk based development]. -=== Review preparation +==== Review preparation In your pull request, give a comprehensive description of the changes you are making and why, and reference any issues that are relevant to your pull request. @@ -49,7 +58,7 @@ If you follow the xref:contributing-code.adoc[] guide, a lot of checks should al Once you are ready for review, request a review from 'stackabletech/developers'. If you are an internal contributor, assign yourself to your pull request. -=== Review +==== Review During the review phase, a Stackable employee will review your contribution. Respond to questions and feedback, and improve your submission if necessary. @@ -60,3 +69,7 @@ Internal contributors merge them on their own, pull requests from external contr Once your pull request is merged, you have successfully contributed! Congratulations! + +== Further reading + +Read more about specifically xref:contributing-code.adoc[] or xref:docs/contributing-documentation.adoc[]. From 9cf130d479aa771cfb119be5020d2ef627f5a030 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:35:42 +0200 Subject: [PATCH 14/37] Update README.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- README.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.adoc b/README.adoc index d10fa26ae..0e26e5f23 100644 --- a/README.adoc +++ b/README.adoc @@ -34,7 +34,7 @@ NOTE: Antora caches the external content repos in the cache directory (configure == Production deployment -The documentation is deployed on Netlify and is deployed when there is a new commit on the `main` branch, as well as freshly every night. +The documentation is deployed by Netlify on a regular basis or when something is pushed to the `main` branch. If you want to trigger a deploy right now, you can use the _Build and deploy production site_ GitHub action (internal contributors only). Deployment is run every night to pick up changes in the operator repositories, because these changes do not automatically trigger a new deployment. From ee59db9efec56dedf1bf5c24d892e93261b31d59 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:36:00 +0200 Subject: [PATCH 15/37] Update modules/contributor/pages/docs/overview.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/overview.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index 838184c13..c208f905f 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -60,7 +60,7 @@ Building the documentation and also the deployment process on Netlify are docume The Getting started guides for each operator are written with an executable script in the background from which the documentation includes excerpts. This has the benefit that the tutorials are easily tested. When writing a new tutorial, please also write it in this way. -Have a look at the Getting started guides on how to do this. +Have a look at the existing getting started guides on how to do this. == Templating From 2b244f62da68cef2247585f95a301c2c7c110e44 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:36:13 +0200 Subject: [PATCH 16/37] Update README.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- README.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.adoc b/README.adoc index 0e26e5f23..39fafdff2 100644 --- a/README.adoc +++ b/README.adoc @@ -35,7 +35,7 @@ NOTE: Antora caches the external content repos in the cache directory (configure == Production deployment The documentation is deployed by Netlify on a regular basis or when something is pushed to the `main` branch. -If you want to trigger a deploy right now, you can use the _Build and deploy production site_ GitHub action (internal contributors only). +To trigger an out of band deployment, use the _Build and deploy production site_ GitHub action (internal contributors only). Deployment is run every night to pick up changes in the operator repositories, because these changes do not automatically trigger a new deployment. From 3256c51294a2cc2c847e95e91593233154d20694 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:38:21 +0200 Subject: [PATCH 17/37] Update README.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- README.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.adoc b/README.adoc index 39fafdff2..cfc1a201b 100644 --- a/README.adoc +++ b/README.adoc @@ -37,7 +37,7 @@ NOTE: Antora caches the external content repos in the cache directory (configure The documentation is deployed by Netlify on a regular basis or when something is pushed to the `main` branch. To trigger an out of band deployment, use the _Build and deploy production site_ GitHub action (internal contributors only). -Deployment is run every night to pick up changes in the operator repositories, because these changes do not automatically trigger a new deployment. +Regular (nightly) deployments are run to pick up changes in the operator repositories. These repositories are not watched by Netlify and thus any changes to the documentation there would be ignored. @fhennig is responsible for anything Netlify related. From aa42a98d512b45626dd63dceb4bf1a64eb2650fd Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:39:29 +0200 Subject: [PATCH 18/37] Update modules/contributor/pages/contributing-code.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/contributing-code.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/contributing-code.adoc b/modules/contributor/pages/contributing-code.adoc index 9f7ffff63..f2588d73b 100644 --- a/modules/contributor/pages/contributing-code.adoc +++ b/modules/contributor/pages/contributing-code.adoc @@ -46,7 +46,7 @@ For `VisualStudio Code` we also recommend the following extensions: changes are made in accordance to the xref:code-style-guide.adoc[source code style guide]. . If code was added or adapted then please create or adapt the unit tests in the same file as well as the integration tests in the `tests` directory. Ensure that all unit tests run successfully `cargo test`) and all integration tests - run successfully (`./scripts/run_tests.sh`). See also <<_changes_in_the_integration_tests>>. + run successfully (`./scripts/run-tests`). See also <<_changes_in_the_integration_tests>>. . Comment your code and check with `cargo doc --document-private-items` that there are no syntax errors. . The YAML schemas of the custom resource definitions (CRDs) are rebuilt when the project is compiled (see `rust/operator-binary/build.rs` if changing an operator). These CRDs as well as the product configuration are also From c658eba6ad3160da9300929ed2cc7df77f77eeae Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:40:25 +0200 Subject: [PATCH 19/37] Update modules/contributor/pages/docs/overview.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/overview.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index c208f905f..0cecada0a 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -35,7 +35,7 @@ There are also the xref:demos:index.adoc[Demos] which serve more for study. **Guides** are also instructional, but focus a narrow topic, something that the user might want to solve in their particular setup. For example: "How do I set up Kerberos with HDFS?" or "How do I connect Superset to Druid?" The guide has to account for eventualities (i.e. the user is using their own pre-existing ZooKeeper instead of our ZooKeeper. This is not the case for tutorials). -This kind of information is typically product specific and as such it is put with all the individual operators inside of the Usage guides section. +Since this kind of information is typically product specific, it is located in the usage guide section of individual operators. **Reference** information for the Stackable platform entails all the settings and Options in our YAMLs, which we generate. The reference is found at https://crds.stackable.tech/ and generated from the https://github.com/stackabletech/crddocs[crddocs repository]. From bb7e6d2214de6fde23b3f490a29f70196d8bcd50 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:41:28 +0200 Subject: [PATCH 20/37] Update modules/contributor/pages/contributing-code.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/contributing-code.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/contributing-code.adoc b/modules/contributor/pages/contributing-code.adoc index f2588d73b..c20819346 100644 --- a/modules/contributor/pages/contributing-code.adoc +++ b/modules/contributor/pages/contributing-code.adoc @@ -80,7 +80,7 @@ docker build --file docker/Dockerfile --tag docker.stackable.tech/stackable/:-dev --name=integration-tests helm install deploy/helm// ---- -. Run the tests from the repository root with `./scripts/run_tests.sh`. +. Run the tests from the repository root with `./scripts/run-tests`. == Adding support for a new product version From b8532ae59d9e356b7707cf8bab0ebfe907dfb973 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:42:03 +0200 Subject: [PATCH 21/37] Update modules/contributor/pages/docs/contributing-documentation.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/contributing-documentation.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/docs/contributing-documentation.adoc b/modules/contributor/pages/docs/contributing-documentation.adoc index 77454e8cf..180eb2572 100644 --- a/modules/contributor/pages/docs/contributing-documentation.adoc +++ b/modules/contributor/pages/docs/contributing-documentation.adoc @@ -1,6 +1,6 @@ = Contributing to documentation :page-alias: contributing-documentation.adoc -Have a look at the documentation section of the xref:project-overview.adoc[] to understand the repositories involved in building the documentation, and read the xref:docs/overview.adoc[] for a overview of the content structure and the tools involved in building the documentation. +To understand the repositories involved in building the documentation, see xref:project-overview.adoc[]. For an overview of the content structure and the tools involved, see the xref:docs/overview.adoc[]. To contribute, follow the pull request flow outlined in the xref:index.adoc[]. From a151b9d0d1097660344acbca3a84137395e709f1 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:42:34 +0200 Subject: [PATCH 22/37] Update modules/contributor/pages/docs/overview.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/overview.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index 0cecada0a..8b2d15ed3 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -23,7 +23,7 @@ Documentation exists along two axis: _study_ or _work_; _pracital steps_ and _th Practical learning happens in tutorials, and they are backed up by conceptual background information (theory). On the work oriented side, documentation should contain exhaustive reference information (every commandline flag, every yaml property, their type and whether they are optional or not etc.) as well as narrow, task oriented guides. -At Stackable we have to document the platform as a whole, as well as individual operators. +At Stackable we have to document the platform as a whole, individual operators, products and command line tools like `stackablectl`. Then there is also stackablectl. **Conceptual** information lives at the platform level in the xref:concepts:index.adoc[] section. Some operators have their own specific concepts such as xref:zookeeper:znodes.adoc[] for ZooKeeper, but most conceptual things apply to all operators (i.e. roles and role groups, resource management, config overrides). From 6c953c21060c5d450967400298420ee344d3bd38 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:43:14 +0200 Subject: [PATCH 23/37] Update modules/contributor/pages/docs/overview.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/overview.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index 8b2d15ed3..369446de3 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -59,7 +59,7 @@ Building the documentation and also the deployment process on Netlify are docume The Getting started guides for each operator are written with an executable script in the background from which the documentation includes excerpts. This has the benefit that the tutorials are easily tested. -When writing a new tutorial, please also write it in this way. +When writing a new guide, please also write it in this way. Have a look at the existing getting started guides on how to do this. == Templating From 7cba0433c0fcb121aa8b839ff6d11a8a1c5ef0b8 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:48:35 +0200 Subject: [PATCH 24/37] fixes from the review --- README.adoc | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/README.adoc b/README.adoc index cfc1a201b..7d936e4f9 100644 --- a/README.adoc +++ b/README.adoc @@ -39,11 +39,9 @@ To trigger an out of band deployment, use the _Build and deploy production site_ Regular (nightly) deployments are run to pick up changes in the operator repositories. These repositories are not watched by Netlify and thus any changes to the documentation there would be ignored. -@fhennig is responsible for anything Netlify related. - === Netlify configuration -Netlify is configured with the netlify.toml file inside of the documentation repo. In there, the command make netlify-build is configured as the build command. Further documentation of the build process can then be found in the Makefile. +Netlify is configured with the [`netlify.toml`](./netlify.toml) file inside of the documentation repo. In there, the command `make netlify-build` is configured as the build command. Further documentation of the build process can then be found in the [`Makefile`](./Makefile). The build process creates a static site in `build/site` which is then published (as it is configured in the `netlify.toml`). From be80378a6c475382b0933427df058aab952f65b1 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:50:01 +0200 Subject: [PATCH 25/37] formatting fixes --- README.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.adoc b/README.adoc index 7d936e4f9..9763d8baf 100644 --- a/README.adoc +++ b/README.adoc @@ -41,7 +41,7 @@ Regular (nightly) deployments are run to pick up changes in the operator reposi === Netlify configuration -Netlify is configured with the [`netlify.toml`](./netlify.toml) file inside of the documentation repo. In there, the command `make netlify-build` is configured as the build command. Further documentation of the build process can then be found in the [`Makefile`](./Makefile). +Netlify is configured with the `[netlify.toml](./netlify.toml)` file inside of the documentation repo. In there, the command `make netlify-build` is configured as the build command. Further documentation of the build process can then be found in the `[Makefile](./Makefile)`. The build process creates a static site in `build/site` which is then published (as it is configured in the `netlify.toml`). From 91926dcbf684e728f750f6bbc3e41c1e8e2f6528 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:52:03 +0200 Subject: [PATCH 26/37] formatting fixes --- README.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.adoc b/README.adoc index 9763d8baf..bac0877d0 100644 --- a/README.adoc +++ b/README.adoc @@ -41,7 +41,7 @@ Regular (nightly) deployments are run to pick up changes in the operator reposi === Netlify configuration -Netlify is configured with the `[netlify.toml](./netlify.toml)` file inside of the documentation repo. In there, the command `make netlify-build` is configured as the build command. Further documentation of the build process can then be found in the `[Makefile](./Makefile)`. +Netlify is configured with the netlify.toml[./netlify.toml] file inside of the documentation repo. In there, the command `make netlify-build` is configured as the build command. Further documentation of the build process can then be found in the Makefile[./Makefile]. The build process creates a static site in `build/site` which is then published (as it is configured in the `netlify.toml`). From c2f0f4781f86599c64af7a4bea0dccf018a2bc20 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:54:17 +0200 Subject: [PATCH 27/37] formatting fixes --- README.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.adoc b/README.adoc index bac0877d0..e4a7f799a 100644 --- a/README.adoc +++ b/README.adoc @@ -41,7 +41,7 @@ Regular (nightly) deployments are run to pick up changes in the operator reposi === Netlify configuration -Netlify is configured with the netlify.toml[./netlify.toml] file inside of the documentation repo. In there, the command `make netlify-build` is configured as the build command. Further documentation of the build process can then be found in the Makefile[./Makefile]. +Netlify is configured with the link:netlify.toml[`netlify.toml`] file inside of the documentation repo. In there, the command `make netlify-build` is configured as the build command. Further documentation of the build process can then be found in the link:Makefile[`Makefile`]. The build process creates a static site in `build/site` which is then published (as it is configured in the `netlify.toml`). From 8c29fb24c92b2c991e073d296ee20872a72626dd Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:57:26 +0200 Subject: [PATCH 28/37] more mini README improvements --- README.adoc | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/README.adoc b/README.adoc index e4a7f799a..aec5ea36e 100644 --- a/README.adoc +++ b/README.adoc @@ -1,6 +1,3 @@ -// Header of this document: -// - = Stackable Documentation :base-repo: https://github.com/stackabletech @@ -9,14 +6,12 @@ Have a look at the https://docs.stackable.tech/[live version] and the current ht The documentation is built with https://antora.org[Antora]. This repository hosts the Antora playbook file as well as platform documentation. Other Stackable repos contain 'docs' directories which are pulled in by this repo. - == Repository structure -* The `antora.yml` file defines the main `home` https://docs.antora.org/antora/latest/component-version/#docs-component[Component]. +* The link:antora.yml[`antora.yml`] file defines the main `home` https://docs.antora.org/antora/latest/component-version/#docs-component[Component]. * The various `*-playbook.yml` files are https://docs.antora.org/antora/latest/playbook/[Antora playbook files] used to build the docs, either locally or for production. The playbooks link to all the other repositories that contain content. * The `modules` directory contains the platform level documentation content. - == Building locally **Dependencies**: `make`, `npm`. @@ -67,4 +62,6 @@ The design & layout comes from our https://github.com/stackabletech/documentatio == More useful links -* The https://github.com/stackabletech/documentation-ui[documentation-ui] repository. \ No newline at end of file +* The https://github.com/stackabletech/documentation-ui[documentation-ui] repository. +* The https://github.com/stackabletech/crddocs[crddocs] repository from which the https://crds.stackable.tech/[CRD reference] is generated. +* The Stackable https://docs.stackable.tech/home/stable/contributor/[contributor's guide] containing more info on how to contribute to the documentation. From 498e880e2ef375bf338de859898a64d6391f1702 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:58:00 +0200 Subject: [PATCH 29/37] Update modules/contributor/pages/docs/overview.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/overview.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index 369446de3..871318dc3 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -58,7 +58,7 @@ Building the documentation and also the deployment process on Netlify are docume == Executable tutorials The Getting started guides for each operator are written with an executable script in the background from which the documentation includes excerpts. -This has the benefit that the tutorials are easily tested. +This has the benefit that the guides are easily tested. When writing a new guide, please also write it in this way. Have a look at the existing getting started guides on how to do this. From 6c87730287a1e08032975657592f4908696db2ce Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:58:10 +0200 Subject: [PATCH 30/37] Update modules/contributor/pages/docs/overview.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/overview.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index 871318dc3..ee9ecaff1 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -57,7 +57,7 @@ Building the documentation and also the deployment process on Netlify are docume == Executable tutorials -The Getting started guides for each operator are written with an executable script in the background from which the documentation includes excerpts. +The getting started guides for each operator are backed by an executable script from which the documentation includes excerpts. This has the benefit that the guides are easily tested. When writing a new guide, please also write it in this way. Have a look at the existing getting started guides on how to do this. From c5bfdb1e4531c15b79dfed06df9d167579f358b4 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 08:59:20 +0200 Subject: [PATCH 31/37] Update modules/contributor/pages/docs/overview.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/overview.adoc | 1 - 1 file changed, 1 deletion(-) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index ee9ecaff1..a603bfc02 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -24,7 +24,6 @@ Practical learning happens in tutorials, and they are backed up by conceptual ba On the work oriented side, documentation should contain exhaustive reference information (every commandline flag, every yaml property, their type and whether they are optional or not etc.) as well as narrow, task oriented guides. At Stackable we have to document the platform as a whole, individual operators, products and command line tools like `stackablectl`. -Then there is also stackablectl. **Conceptual** information lives at the platform level in the xref:concepts:index.adoc[] section. Some operators have their own specific concepts such as xref:zookeeper:znodes.adoc[] for ZooKeeper, but most conceptual things apply to all operators (i.e. roles and role groups, resource management, config overrides). From 0bb4739ad4776baf4336c5e634e81923ae8b3c9b Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 09:01:38 +0200 Subject: [PATCH 32/37] Update modules/contributor/pages/docs/overview.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/overview.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index a603bfc02..005befcef 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -25,7 +25,7 @@ On the work oriented side, documentation should contain exhaustive reference inf At Stackable we have to document the platform as a whole, individual operators, products and command line tools like `stackablectl`. -**Conceptual** information lives at the platform level in the xref:concepts:index.adoc[] section. Some operators have their own specific concepts such as xref:zookeeper:znodes.adoc[] for ZooKeeper, but most conceptual things apply to all operators (i.e. roles and role groups, resource management, config overrides). +**Conceptual** information lives at the platform level in the xref:concepts:index.adoc[] section. Some operators have their own specific concepts such as xref:zookeeper:znodes.adoc[] for ZooKeeper, but most concepts apply to all operators (i.e. roles and role groups, resource management, config overrides). **Tutorials** (learning oriented guides) exist at the xref:tutorials:index.adoc[top level] but there are also the Getting Started guides for all the individual operators. Tutorials provide complete set up information and require very little to be there already in contrast to guides (work instead of study oriented) which are more focused on solving specific tasks. From e627d4638e8abb4c61890ddafa69422eb65e5769 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 09:01:58 +0200 Subject: [PATCH 33/37] Update modules/contributor/pages/docs/overview.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/overview.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index 005befcef..b4da3653b 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -33,7 +33,7 @@ There are also the xref:demos:index.adoc[Demos] which serve more for study. **Guides** are also instructional, but focus a narrow topic, something that the user might want to solve in their particular setup. For example: "How do I set up Kerberos with HDFS?" or "How do I connect Superset to Druid?" -The guide has to account for eventualities (i.e. the user is using their own pre-existing ZooKeeper instead of our ZooKeeper. This is not the case for tutorials). +The guide has to account for different use-cases (i.e. the user is using their own pre-existing ZooKeeper instead of our ZooKeeper). This is not the case for tutorials. Since this kind of information is typically product specific, it is located in the usage guide section of individual operators. **Reference** information for the Stackable platform entails all the settings and Options in our YAMLs, which we generate. From 51ff9140bf5eaa18528f3cdfedcc320df47d13be Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 09:02:19 +0200 Subject: [PATCH 34/37] Update modules/contributor/pages/docs/overview.adoc Co-authored-by: Razvan-Daniel Mihai <84674+razvan@users.noreply.github.com> --- modules/contributor/pages/docs/overview.adoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/contributor/pages/docs/overview.adoc b/modules/contributor/pages/docs/overview.adoc index b4da3653b..0a2338d86 100644 --- a/modules/contributor/pages/docs/overview.adoc +++ b/modules/contributor/pages/docs/overview.adoc @@ -29,7 +29,7 @@ At Stackable we have to document the platform as a whole, individual operators, **Tutorials** (learning oriented guides) exist at the xref:tutorials:index.adoc[top level] but there are also the Getting Started guides for all the individual operators. Tutorials provide complete set up information and require very little to be there already in contrast to guides (work instead of study oriented) which are more focused on solving specific tasks. -There are also the xref:demos:index.adoc[Demos] which serve more for study. +There are also the xref:demos:index.adoc[Demos] which are complete solutions that showcase how the platform integrates different products in a unified, reproducible and transparent way. **Guides** are also instructional, but focus a narrow topic, something that the user might want to solve in their particular setup. For example: "How do I set up Kerberos with HDFS?" or "How do I connect Superset to Druid?" From 2c1a5cb7c7e3ac05fd50c1dc5f085d592f3927e2 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 09:17:21 +0200 Subject: [PATCH 35/37] added a couple more tools to the list --- modules/contributor/pages/contributing-code.adoc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/contributor/pages/contributing-code.adoc b/modules/contributor/pages/contributing-code.adoc index c20819346..8fc072cc4 100644 --- a/modules/contributor/pages/contributing-code.adoc +++ b/modules/contributor/pages/contributing-code.adoc @@ -16,6 +16,10 @@ In order to contribute source code, you need an environment that is capable of r * https://kuttl.dev/[Kuttl] * https://www.rust-lang.org/[Rust] * https://www.python.org/[Python] +* https://jqlang.github.io/jq/[jq] +* https://github.com/mikefarah/yq[yq] +* https://tilt.dev/[Tilt] +* https://pre-commit.com/[pre-commit] (optional) Depending on the repository, you might also need https://go.dev/[Go], https://www.java.com/en/[Java] or other programming language support. From c2552c2c3718349f3533cd0c35831fd3ba5560cc Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 13:28:22 +0200 Subject: [PATCH 36/37] clarified some aspects of integration test instructions --- modules/contributor/pages/contributing-code.adoc | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/contributor/pages/contributing-code.adoc b/modules/contributor/pages/contributing-code.adoc index 8fc072cc4..41f7d15bf 100644 --- a/modules/contributor/pages/contributing-code.adoc +++ b/modules/contributor/pages/contributing-code.adoc @@ -71,10 +71,9 @@ For `VisualStudio Code` we also recommend the following extensions: Try to mimic the style of the other tests. They are written with https://kuttl.dev/[KUTTL] and our own templating tool https://github.com/stackabletech/beku.py[beku.py] to template tests and test multiple product versions at once. . Start a test cluster using https://kind.sigs.k8s.io/[kind]. -. If changes in an operator are tested then the according version of the operator must be started. - The operator can be started outside the cluster with `cargo run -- crd | kubectl apply -f - && cargo run -- run`. - This approach allows a fast test develop cycle but has the downside that the RBAC rules are not tested. - So a proper Helm installation should be tested before creating a pull request. +. Run your development version of the operator with `make run-dev` (see also xref:testing-on-kubernetes.adoc[] for more information on this). + This will deploy the operator directly into the cluster, also using part of the Helm Chart definition and therefore the RBAC rules. +. When making changes to the Helm Chart, you should however test the Helm Chart explicitly. First a Docker image of the operator must be built locally and uploaded to the kind cluster and then the Helm chart must be installed. This can be achieved in the operator directory with the following commands: + From 4394be8533f93692812288f4dfd37bead1bdd0c5 Mon Sep 17 00:00:00 2001 From: Felix Hennig Date: Wed, 3 Apr 2024 13:30:53 +0200 Subject: [PATCH 37/37] add 'add product image' step to the instructions for adding a new version --- modules/contributor/pages/contributing-code.adoc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/contributor/pages/contributing-code.adoc b/modules/contributor/pages/contributing-code.adoc index 41f7d15bf..b021423ec 100644 --- a/modules/contributor/pages/contributing-code.adoc +++ b/modules/contributor/pages/contributing-code.adoc @@ -89,8 +89,10 @@ helm install deploy/helm// If a new version of a product was added then the following tasks must be performed: -* Add the new version to the supported ones in the documentation of the operators (see - `docs/modules/\{product name\}/partials/supported-versions.adoc` in the operator repositories). +* Add the new version in the https://github.com/stackabletech/docker-images[docker-images] repository. * Update the operator to support the new version if necessary. * Update the examples in the operator to use the new version. -* Update the integration tests. The tests should cover the latest patch version of each supported versions. +* Update the integration tests. + The tests should cover the latest patch version of each supported versions. +* Add the new version to the supported ones in the documentation of the operators (see + `docs/modules/\{product name\}/partials/supported-versions.adoc` in the operator repositories).