diff --git a/release/README.md b/release/README.md index 1d05736..f4d2a54 100644 --- a/release/README.md +++ b/release/README.md @@ -1,41 +1,98 @@ # Release workflow -This is the recommended release flow in a nutshell for the release 24.7: +This is the recommended release flow in a nutshell for the release 25.3. +These steps are repeated for each release tag i.e. for both release-candidates and non-release-candidates: ```shell # start with the product images ... # create and push the release branch -./release/create-release-branch.sh -b 24.7 -w products # Only add the -p flag after testing locally first +./release/create-release-branch.sh -b 25.3 -w products # Only add the -p flag after testing locally first -# create and push the release tag -./release/create-release-tag.sh -t 24.7.0 -w products # Only add the -p flag after testing locally first +# create a new PR dedicated to the current release tag +./release/create-release-candidate-branch.sh -t 25.3.0-rc1 -w products # Only add the -p flag after testing locally first + +# merge the PR branches, once the necessary changes have been made (e.g. cherry-picked from main) +./release/merge-release-candidate.sh -t 25.3.0-rc1 -w products # Only add the -p flag after testing locally first + +# tag the merge commit +./release/tag-release-candidate.sh -t 25.3.0-rc1 -w products # Only add the -p flag after testing locally first # monitor the GH action that builds ~80 images for success. # build failures alerts will appear in the #notifications-container-images channel. +# repeat the above with e.g. the tag 25.3.0 once a release candidate is accepted. # continue with the operators ... # create and push the release branch -./release/create-release-branch.sh -b 24.7 -w operators # Only add the -p flag after testing locally first +./release/create-release-branch.sh -b 25.3 -w operators # Only add the -p flag after testing locally first + +# create a new PR dedicated to the current release tag +./release/create-release-candidate-branch.sh -t 25.3.0-rc1 -w operators # Only add the -p flag after testing locally first -# create and push the release tag -./release/create-release-tag.sh -t 24.7.0 -w operators # Only add the -p flag after testing locally first +# merge the PR branches, once the necessary changes have been made (e.g. cherry-picked from main) +./release/merge-release-candidate.sh -t 25.3.0-rc1 -w operators # Only add the -p flag after testing locally first + +# tag the merge commit +./release/tag-release-candidate.sh -t 25.3.0-rc1 -w operators # Only add the -p flag after testing locally first # monitor the GH actions that build the operator images for success # build failures are not yet sent to the #notifications-container-images channel yet. +# repeat the above with e.g. the tag 25.3.0 once a release candidate is accepted. # continue with the demos ... # create and push the release branch -./release/create-release-branch.sh -b 24.7 -w demos # Only add the -p flag after testing locally first +./release/create-release-branch.sh -b 25.3 -w demos # Only add the -p flag after testing locally first -# finally patch the changelog file in the main branch +# finally - i.e. when a release candidate has been accepted and the actual release has been tagged - patch the changelog file in the main branch # create PRs for all operators -./release/post-release.sh -t 24.7.0 # Only add the -p flag after testing locally first +./release/post-release.sh -t 25.3.0 # Only add the -p flag after testing locally first # and that is it! # (now the tedious post release steps start ...) ``` -## Release scripts +## Flow Overview + +![](./images/rc-flow.png) + +### Flow for a patch release to an existing release-branch + +```mermaid +gitGraph: + commit + branch release-24.11 + branch pr-24.11.1-rc1 + commit id:"Update Cargo.toml to 24.11.1-rc1" + checkout main + commit id:"change rust" + checkout pr-24.11.1-rc1 + cherry-pick id:"change rust" + checkout release-24.11 + merge pr-24.11.1-rc1 tag:"24.11.1-rc1" + branch docs/fix-typo-for-rc1 + + checkout main + commit id:"docs fix" + checkout docs/fix-typo-for-rc1 + cherry-pick id:"docs fix" + + checkout release-24.11 + merge docs/fix-typo-for-rc1 + branch pr-24.11.1 + commit id:"Update Cargo.toml to 24.11.1" + checkout release-24.11 + merge pr-24.11.1 tag:"24.11.1" + + checkout main + commit +``` + +> [!NOTE] +> Once a release candidate has been merged, the subsequent Antora build will reference the most recent commit. This means that some references may be to an `-rc` release e.g. `25.3.0-rc1`. This can be avoided by +> - conducting all testing on the PR-specific images that are created as part of the release candidate branches, instead of waiting until they have been merged and the commits tagged +> - once tests are successful, create a *non* `-rc` branch (e.g. `25.3.0`, `25.3.1` etc), cherry-picking over any changes that were made in the course of testing in the previous step, test, merge and tag +> - this will require the `release.yaml` file for each operator to be changed to specify PR-specific versions of the operators, and for `test-definition.yaml`to be edited to use custom images (as product iamge selection will not identify PR-specific images automatically). + +## Release scripts: Summary A set of scripts that automates some release steps. The release process has multiple steps: @@ -43,28 +100,30 @@ A set of scripts that automates some release steps. The release process has mult - create a temporary folder - clone operator and image repositories - create a new release branch for each repository -2. Test and fix things in the release branches - - changes should be done by making changes in the main branch and then cherry-picking these changes back into the release branch -3. Call `create-release-tag.sh`- This will: - - checks that the appropriate release branch exists - - switch to the previously-created release branch in each repository +2. Call `create-release-candidate-branch.sh` - This will: - conduct code refactoring - - commit and tag these changes - - push the resulting commits and tags, triggering github actions to build the product images and operators -4. Call `post-release.sh`- This will: + - create a tag-specific branch and PR based on the release branch +3. Call `merge-release-candidate.sh` - This will: + - approve and merge the PR into the release branch +4. Call `tag-release-candidate.sh` - This will: + - tag merge commit from above, triggering github actions to build the product images and operators +5. Call `post-release.sh`- This will: - update the operator CHANGELOG.md in `main` with changes from the release tag - create PRs for all operators -![](./images/rb-utils.png) +> [!NOTE] + +> - Steps 2-4 will check out the release branch (or clone it if does exist locally) and so can be run independently of each other. +> - Any changes should be done manually between steps 2 and 3 i.e. by making changes in the PR branch and/or cherry-picking commits from main. -### Install requirements +## Install requirements > [!NOTE] > Nix users will not need to install anything, just enter the `nix-shell` in this repository (if not done automatically via `direnv`). > The dependencies will install automatically. > A nix-shell will be entered for each operator during certain commands, so operator dependencies will be covered too. -#### cargo-edit plugin +### cargo-edit plugin The `cargo-edit` plugin is used to update operator versions in `cargo` workspaces. @@ -74,29 +133,38 @@ Install it like this: cargo install cargo-edit --version 0.12.3 ``` -#### yq (yaml parser) +### yq (yaml parser) This script requires (not to be confused with ). -#### gh (github client) +### gh (github client) This script requires to be installed. You have to be logged in when running the `post-release.sh` script. The easiest way is to have a local env variable `GH_TOKEN` set to a classic token created via with all `repo` and all `admin:org` scopes or follow the login instructions here . -### Usage +### jinja2 (templating tool) -#### Release branches +This script requires jinja2 as a templating tool. It can be installed like this: + +```shell +pipx install jinja2-cli +pipx inject jinja2-cli pyyaml +``` + +## Usage + +### 1.) Create release branches To create release branches use the `create-release-branch.sh` script, called from the repository root folder. The syntax is given below: -``` +```shell ./release/create-release-branch.sh -b [-p] [-c] [-w products|operators|demos|all] ``` -- `-b `: the release number (mandatory). This must be a semver-compatible value (i.e. without leading zeros) such as `23.1`, `23.10` etc. and will be used to create a branch with the name `release-` e.g. `release-23.1` +- `-b `: the release number (mandatory). This must be a semver-compatible value (i.e. without leading zeros) such as `23.1`, `23.10` etc. and will be used to create a branch with the name `release-` e.g. `release-23.1`. - `-p`: push flag (optional, default is "false"). If provided, the created branches plus any changes made as part of this process will be pushed to the origin. - `-c`: cleanup flag (optional, default is "false"). If provided, the repository folders will be torn down on completion. -- `-w`: where to create the branch. It can be "products", "operators", "demos", "all". +- `-w`: where to create the branch. It can be "products", "operators", "demos" or "all". N.B. the flags cannot be combined (e.g. `-p -c` but not `-pc) @@ -106,177 +174,161 @@ e.g. ./release/create-release-branch.sh -b 23.1 -p -c -w all ``` -##### What this script does +#### What this script does - checks that the release argument is valid (e.g. semver-compatible, just major/minor levels) -- strips this argument of any leading or trailing quote marks -- for docker images - - creates or updates a temporary folder with clones of the images repository (given in `config.yaml`) - - creates the new branch according to the release version - - pushes the new branch (if requested with "-p") - - deletes the temporary folder (if requested with "-c") -- for operators: - - iterates over a list of operator repository names (listed in `config.yaml`), and for each one: - - clones or updates operator and product images repositories - - creates the new branch according to the release version - - pushes the new branch (if requested with "-p") - - deletes the temporary folder (if requested with "-c") - -#### Release tags - -To create release tags use the `create-release-tag.sh` script, called from the repository root folder. The syntax is given below: +- creates or updates a temporary folder with clones of the images repository +- creates the new branch according to the release version +- optional: pushes the new branch (if requested with "-p") +- optional: deletes the temporary folder (if requested with "-c") -``` -./release/create-release-tag.sh -t [-p] [-c] [-w products|operators|all] +### 2.) Create PR branches for release candidates + +To create release tags use the `create-release-candidate-branch.sh` script, called from the repository root folder. The syntax is given below: + +```shell +./release/create-release-candidate-branch.sh -t [-p] [-c] [-w products|operators|all] ``` -- `-t `: the release tag (mandatory). This must be a semver-compatible value (i.e. major/minor/path, without leading zeros) such as `23.1.0`, `23.10.3` etc. and will be used to create a tag with the name -- `-p`: push flag (optional, default is "false"). If provided, the created commits and tags made as part of this process will be pushed to the origin. +- `-t `: the release tag (mandatory). This must be a semver-compatible value (i.e. major/minor/path, without leading zeros) such as `23.1.0`, `23.10.3-rc1` etc. and will be used to create a tag with the name. +- `-p`: push flag (optional, default is "false"). If provided, the changes and PRs made as part of this process will be pushed to the origin. - `-c`: cleanup flag (optional, default is "false"). If provided, the repository folders will be torn down on completion. -- `-w`: where to create the tag and update versions in code. It can be "products", "operators", "all". +- `-w`: where to create the tag and update versions in code. It can be "products", "operators" or "all". N.B. the flags cannot be combined (e.g. `-p -c` but not `-pc) e.g. ```shell -./release/create-release-tag.sh -t 23.1.0 -p -c -w all +./release/create-release-candidate-branch.sh -t 23.1.0-rc1 -p -c -w all ``` -##### What this script does +#### What this script does -- checks that the release argument is valid (e.g. semver-compatible, major/minor/patch levels) -- for docker images: - - tags the branch and pushes it if the push argument is provided -- for operators: - - checks that the release branch exists and the tag doesn't +- checks that the release argument is valid (e.g. semver-compatible, just major/minor levels) +- creates a temporary folder with clones of the images repository +- checks that the release branch exists and that the tag does not +- creates the new branch according to the release version +- performs code updates e.g. - adapts the versions in all cargo.toml to `release-tag` argument - - update all "operatorVersion" fields in the tests/release.yaml files - update the antora.yaml - - update the `release-tag` in helm charts - - updates the cargo workspace + - update the `release-tag` in helm charts - rebuilds the helm charts - bumps the changelog - - creates a tagged commit in the branch (i.e. the changes are valid for the branch lifetime) - - pushes the commit and tag (if requested with "-p") - - deletes the temporary folder (if requested with "-c") +- optional: pushes the new branch (if requested with "-p") +- optional: deletes the temporary folder (if requested with "-c") -#### Post-release steps +The result of running this script will be a set of PRs specific to a given release (25.3.0, 25.7-rc1 etc.). +These PRs should eventually contain *all* changes relevant to the release (for a particular repository). +These changes can be pushed manually in the PR itself or cherry-picked from the `main` branch. +Product and operator images will be built when these PRs are created or updated, which means that integration tests can be run against these PRs (the image will be tagged e.g. airflow-operator:24.11.1-rc1). -Some post release steps are performed with `release/post-release.sh` script, called from the repository root folder. The syntax is given below: +### 3.) Approve/Merge PR branches for release candidates + +To merge PRs use the `merge-release-candidate.sh` script, called from the repository root folder. The syntax is given below: + +```shell +./release/merge-release-candidate.sh -t [-p] [-w products|operators|all] +``` + +- `-t `: the release tag (mandatory). This must be a semver-compatible value (i.e. major/minor/path, without leading zeros) such as `23.1.0`, `23.10.3-rc1` etc. and will be used to identify the PR (which was created using this tag). +- `-p`: push flag (optional, default is "false"). If provided, the PRs will be approved and merged. +- `-w`: where to create the tag and update versions in code. It can be "products", "operators" or "all". + +e.g. + +```shell +./release/merge-release-candidate.sh -t 23.1.0-rc1 -p -w all +``` + +#### What this script does + +- checks that the release argument is valid (e.g. semver-compatible, just major/minor levels) +- checks that the PR status is `OPEN` +- if so, it approves and merges the PR + - N.B. this approval step cannot be carried out by the same user that created the PR in the previous section +- optional: approves and merges the PRs (if requested with "-p") + +### 4.) Tag release/release candidate +The final step is to tag the merge commit from above: this is done using the `tag-release-candidate.sh` script, called from the repository root folder. The syntax is given below: + +```shell +./release/tag-release-candidate.sh -t [-p] [-c] [-w products|operators|all] ``` + +- `-t `: the release tag (mandatory). This must be a semver-compatible value (i.e. major/minor/path, without leading zeros) such as `23.1.0`, `23.10.3-rc1` etc. and will be used to create a tag with the name. +- `-p`: push flag (optional, default is "false"). If provided, the created commits and tags made as part of this process will be pushed to the origin. +- `-c`: cleanup flag (optional, default is "false"). If provided, the repository folders will be torn down on completion. +- `-w`: where to create the tag and update versions in code. It can be "products", "operators" or "all". + +#### What this script does + +- checks that the release argument is valid (e.g. semver-compatible, just major/minor levels) +- creates a temporary folder with clones of the images repository +- checks that the release branch exists and that the tag does not +- creates a tag for the release +- optional: pushes the new tag (if requested with "-p") +- optional: deletes the temporary folder (if requested with "-c") + +### 5.) Post-release steps + +Some post release steps are performed with `release/post-release.sh` script, called from the repository root folder. The syntax is given below: + +```shell ./release/post-release.sh -t [-p] [-w products|operators|all] ``` -- `-t `: the release tag (mandatory). This must be a semver-compatible value (i.e. major/minor/path, without leading zeros) such as `23.1.0`, `23.10.3` etc. and will be used to create a tag with the name +- `-t `: the release tag (mandatory). This must be a semver-compatible value (i.e. major/minor/path, without leading zeros) such as `23.1.0`, `23.10.3` etc. and will be used to create a tag with the name. - `-p`: push flag (optional, default is "false"). If provided, the created commits and tags made as part of this process will be pushed to the origin. - `-w`: which repositories to update the changelogs for. It can be "products", "operators", "all" (defaults to "all"). -##### What this script does +#### What this script does - checks that the release tag exists and that all operator repositories have a clean working copy - checks that the release tag exists and that the docker-images repository has a clean working copy - merges the CHANGELOG.md from the release tag into main - creates PRs for all operators -##### Build actions +## Build actions When a tag is pushed, the images for products and operators are built via github actions. The following points should be noted: -###### Product images +### Product images -The build action script `release.yml` builds all product images that defined in the `release.yaml` matrix section: +Product images are built when any tag is pushed. There exists a specific workflow for each product e.g. build_airflow.yaml, build_java-base.yaml etc. ```yaml -name: Release product images +... on: push: - tags: - - '[0-9][0-9].[0-9]+.[0-9]+' - -jobs: - ... - strategy: - fail-fast: false - # If we want more parallelism we can schedule a dedicated task for every tuple (product, product version) - matrix: - product: - # N.B. exclude base images! - - airflow - - zookeeper - ... + tags: ['*'] +... ``` -Base images should be excluded from the build action as they need to be referenced by their manifest hashes in the product Dockerfiles and therefore should be built independently of the product images. - -Also note that the tag pattern above is not using a regex (this functionality is not available for tag filtering) but uses glob-operators. The check is not totally watertight - we cannot for example enforce the "minor" version of the release to be limited to a digit between 1 and 12 - but this check is covered by the calling script `create-release-tag.sh`. +### Operator images -###### Operator images - -Operator images are built by iterating over and pushing tags for the operator-repositories listed in the `operators` section of `config.yaml`: +Operator images are built when a tag matching the tag pattern is pushed: ```yaml -images-repo: docker-images - operators: - - airflow - - secret - - commons - - ... +... +on: + push: + tags: + - '[0-9][0-9].[0-9]+.[0-9]+' + - '[0-9][0-9].[0-9]+.[0-9]+-rc[0-9]+' +... ``` -#### Post-release steps +## Post-release steps Once the release is complete and all steps above have been verified, the documentation needs to be updated and built. This is done in a separate suite of scripts found https://github.com/stackabletech/documentation/tree/main/scripts[here]. Follow the steps given in the two scripts (there are prompts provided which allow for early-exit if things are not as they should be!). -#### Bugfix/patch tags - -To create release tags for bugfix/patch releases use the `create-bugfix-tag.sh` script, called from the repository root folder. The syntax is given below: - -``` -./release/create-bugfix-tag.sh -t [-p] [-c] [-w products|operators|all] [-i] -``` - -- `-t `: the release tag (mandatory). This must be a semver-compatible value (i.e. major/minor/path, without leading zeros) such as `23.1.0`, `23.10.3` etc. and will be used to create a tag with the name -- `-p`: push flag (optional, default is "false"). If provided, the created commits and tags made as part of this process will be pushed to the origin. -- `-c`: cleanup flag (optional, default is "false"). If provided, the repository folders will be torn down on completion. -- `-w`: where to create the tag and update versions in code. It can be "products", "operators", "all". -- `-i`: product image versioning flag (optional, default is "false"). If provided, updates test definitions with product image versions from this release version (i.e. assumes products have been released/tagged, too). - -N.B. the flags cannot be combined (e.g. `-p -c` but not `-pc) - -e.g. - -```shell -./release/create-bugfix-tag.sh -t 23.1.0 -p -c -w all -i -``` - -##### What this script does - -- checks that the release argument is valid (e.g. semver-compatible, major/minor/patch levels) -- strips this argument of any leading or trailing quote marks -- for docker images - - creates a temporary folder with clones of the images repository (given in `config.yaml`) - - clones the docker images repository - - checks that the release branch exists and the tag doesn't - - switches to the release branch - - tags the branch and pushes it if the push argument is provided - - deletes the temporary folder (if requested with "-c") -- for operators: - - iterates over a list of operator repository names (listed in `config.yaml`), and for each one: - - clones the operator repositories - - checks that the release branch exists and the tag doesn't - - switches to the release branch - - updates crate versions and the workspace - - updates test definitions to use product image versions that match the release tag (if requested with "-i") - - tags the branch and pushes it if the push argument is provided - - deletes the temporary folder (if requested with "-c") - ## Troubleshooting This section collects problems and errors that happened on different platforms. -### create-release-tag.sh +### create-release-candidate-branch.sh #### yq stat file not found diff --git a/release/create-bugfix-tag.sh b/release/create-bugfix-tag.sh deleted file mode 100755 index a12e99f..0000000 --- a/release/create-bugfix-tag.sh +++ /dev/null @@ -1,244 +0,0 @@ -#!/usr/bin/env bash -# -# See README.adoc -# -set -euo pipefail -set -x -#----------------------------------------------------------- -# tags should be semver-compatible e.g. 23.1.1 not 23.01.1 -# this is needed for cargo commands to work properly -#----------------------------------------------------------- -TAG_REGEX="^[0-9][0-9]\.([1-9]|[1][0-2])\.[0-9]+$" -REPOSITORY="origin" - -tag_products() { - cd "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" - git switch "$RELEASE_BRANCH" - git tag -sm "release $RELEASE_TAG" "$RELEASE_TAG" - push_branch -} - -tag_operators() { - while IFS="" read -r operator || [ -n "$operator" ] - do - cd "${TEMP_RELEASE_FOLDER}/${operator}" - git switch "$RELEASE_BRANCH" - - # Update git submodules if needed - if [ -f .gitmodules ]; then - git submodule update --recursive --init - fi - - # set tag version where relevant - cargo set-version --offline --workspace "$RELEASE_TAG" - - cargo update --workspace - # Run via nix-shell for the correct dependencies. Makefile already calls - # nix stuff, so it shouldn't be a problem for non-nix users. - nix-shell --run 'make regenerate-charts' - nix-shell --run 'make regenerate-nix' - - update_code "$TEMP_RELEASE_FOLDER/${operator}" - #----------------------------------------------------------- - # ensure .j2 changes are resolved - #----------------------------------------------------------- - "$TEMP_RELEASE_FOLDER/${operator}"/scripts/docs_templating.sh - - git commit -sam "release $RELEASE_TAG" - git tag -sm "release $RELEASE_TAG" "$RELEASE_TAG" - push_branch - done < <(yq '... comments="" | .operators[] ' "$INITIAL_DIR"/release/config.yaml) -} - -tag_repos() { - if [ "products" == "$WHAT" ] || [ "all" == "$WHAT" ]; then - tag_products - fi - if [ "operators" == "$WHAT" ] || [ "all" == "$WHAT" ]; then - tag_operators - fi -} - -check_products() { - #------------------------------------------------------------- - # $TEMP_RELEASE_FOLDER has been created in the calling routine - #------------------------------------------------------------- - git clone "git@github.com:stackabletech/${DOCKER_IMAGES_REPO}.git" "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" - cd "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" - #--------------------------------------- - # switch to the release branch - # N.B. look for exact match - #--------------------------------------- - BRANCH_EXISTS=$(git branch -r | grep -E "$RELEASE_BRANCH$") - - if [ -z "${BRANCH_EXISTS}" ]; then - echo "Expected release branch is missing: $RELEASE_BRANCH" - exit 1 - fi - - git switch "${RELEASE_BRANCH}" - git fetch --tags - #--------------------------------------- - # check tags: N.B. look for exact match - #--------------------------------------- - TAG_EXISTS=$(git tag -l | grep -E "$RELEASE_TAG$") - if [ -n "$TAG_EXISTS" ]; then - echo "Tag $RELEASE_TAG already exists in $DOCKER_IMAGES_REPO" - exit 1 - fi -} - -check_operators() { - #------------------------------------------------------------- - # $TEMP_RELEASE_FOLDER has been created in the calling routine - #------------------------------------------------------------- - while IFS="" read -r operator || [ -n "$operator" ] - do - echo "Operator: $operator" - git clone "git@github.com:stackabletech/${operator}.git" "$TEMP_RELEASE_FOLDER/${operator}" - cd "$TEMP_RELEASE_FOLDER/${operator}" - - BRANCH_EXISTS=$(git branch -r | grep -E "$RELEASE_BRANCH$") - - if [ -z "${BRANCH_EXISTS}" ]; then - echo "Expected release branch is missing: ${operator}/$RELEASE_BRANCH" - exit 1 - fi - git switch "${RELEASE_BRANCH}" - - git fetch --tags - TAG_EXISTS=$(git tag -l | grep -E "$RELEASE_TAG$") - if [ -n "${TAG_EXISTS}" ]; then - echo "Tag $RELEASE_TAG already exists in ${operator}" - exit 1 - fi - done < <(yq '... comments="" | .operators[] ' "$INITIAL_DIR"/release/config.yaml) -} - -checks() { - if [ "products" == "$WHAT" ] || [ "all" == "$WHAT" ]; then - check_products - fi - if [ "operators" == "$WHAT" ] || [ "all" == "$WHAT" ]; then - check_operators - fi -} - - -update_code() { - if $PRODUCT_IMAGE_TAGS; then - echo "Updating release tag in code..." - if [ -f "$1/tests/test-definition.yaml" ]; then - # e.g. 2.2.4-stackable23.1 -> 2.2.4-stackable23.1.1, since the release tag will use major.minor only - sed -i "s/-stackable.*/-stackable${RELEASE_TAG}/" "$1/tests/test-definition.yaml" - fi - else - echo "Skip updating release tag in test-definition.yaml..." - fi - - if [ -f "$1/docs/templating_vars.yaml" ]; then - echo "Updating templating_vars.yaml..." - #----------------------------------------------------------------------------- - # this should always be done as the templating vars are used for both product - # versions (can be just major.minor) and helm charts (major.minor.patch). We - # assume that the tag (e.g. 23.7.1) is applied to an earlier tag in the same - # release (e.g. 23.7.0) so search+replace on the major.minor tag will suffice. - # TODO: this may pick up versions of external components as well. - #----------------------------------------------------------------------------- - yq -i "(.versions.[] | select(. == \"${RELEASE}*\")) |= \"${RELEASE_TAG}\"" "$1/docs/templating_vars.yaml" - fi -} - - -push_branch() { - if $PUSH; then - echo "Pushing changes..." - git push "${REPOSITORY}" "${RELEASE_BRANCH}" - git push "${REPOSITORY}" "${RELEASE_TAG}" - git switch main - else - echo "(Dry-run: not pushing...)" - git push --dry-run "${REPOSITORY}" "${RELEASE_BRANCH}" - git push --dry-run "${REPOSITORY}" "${RELEASE_TAG}" - fi -} - -cleanup() { - if $CLEANUP; then - echo "Cleaning up..." - rm -rf "$TEMP_RELEASE_FOLDER" - fi -} - -parse_inputs() { - RELEASE_TAG="" - PUSH=false - CLEANUP=false - WHAT="" - PRODUCT_IMAGE_TAGS=false - - while [[ "$#" -gt 0 ]]; do - case $1 in - -t|--tag) RELEASE_TAG="$2"; shift ;; - -w|--what) WHAT="$2"; shift ;; - -p|--push) PUSH=true ;; - -c|--cleanup) CLEANUP=true ;; - -i|--images) PRODUCT_IMAGE_TAGS=true ;; - *) echo "Unknown parameter passed: $1"; exit 1 ;; - esac - shift - done - #----------------------------------------------------------- - # remove leading and trailing quotes - #----------------------------------------------------------- - RELEASE_TAG="${RELEASE_TAG%\"}" - RELEASE_TAG="${RELEASE_TAG#\"}" - #---------------------------------------------------------------------------------------------------- - # for a tag of e.g. 23.1.1, the release branch (already created) will be 23.1 - #---------------------------------------------------------------------------------------------------- - RELEASE="$(cut -d'.' -f1,2 <<< "$RELEASE_TAG")" - RELEASE_BRANCH="release-$RELEASE" - - INITIAL_DIR="$PWD" - DOCKER_IMAGES_REPO=$(yq '... comments="" | .images-repo ' "$INITIAL_DIR"/release/config.yaml) - TEMP_RELEASE_FOLDER="/tmp/stackable-$RELEASE_BRANCH" - - echo "Settings: ${RELEASE_BRANCH}: Push: $PUSH: Cleanup: $CLEANUP" -} - -main() { - parse_inputs "$@" - #----------------------------------------------------------- - # check if tag argument provided - #----------------------------------------------------------- - if [ -z "${RELEASE_TAG}" ]; then - echo "Usage: create-bugfix-tag.sh -t " - exit 1 - fi - #----------------------------------------------------------- - # check if argument matches our tag regex - #----------------------------------------------------------- - if [[ ! $RELEASE_TAG =~ $TAG_REGEX ]]; then - echo "Provided tag [$RELEASE_TAG] does not match the required tag regex pattern [$TAG_REGEX]" - exit 1 - fi - - if [ -d "$TEMP_RELEASE_FOLDER" ]; then - echo "Folder already exists, please delete it!: $TEMP_RELEASE_FOLDER" - exit 1 - fi - - echo "Creating folder for cloning docker images and operators: [$TEMP_RELEASE_FOLDER]" - mkdir -p "$TEMP_RELEASE_FOLDER" - - # sanity checks before we start: folder, branches etc. - # deactivate -e so that piped commands can be used - set +e - checks - set -e - - tag_repos - cleanup -} - -main "$@" diff --git a/release/create-release-candidate-branch.sh b/release/create-release-candidate-branch.sh new file mode 100755 index 0000000..b45eec5 --- /dev/null +++ b/release/create-release-candidate-branch.sh @@ -0,0 +1,345 @@ +#!/usr/bin/env bash +# +# See README.adoc +# +set -euo pipefail +set -x + +# tags should be semver-compatible e.g. 23.1.1 not 23.01.1 +# this is needed for cargo commands to work properly +# optional release-candidate suffixes are in the form: +# - rc-1, e.g. 23.1.1-rc1, 23.12.1-rc12 etc. +TAG_REGEX="^[0-9][0-9]\.([1-9]|[1][0-2])\.[0-9]+(-rc[0-9]+)?$" +REPOSITORY="origin" +PR_MSG="> [!CAUTION] +> ## DO NOT MERGE MANUALLY! +> This branch will be merged (and the commit tagged) by stackable-utils once any necessary commits have been cherry-picked to here from the main branch." + +rc_branch_products() { + # assume that the branch exists and has either been pushed or has been created locally + cd "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" + + # the PR branch should already exist + git switch "$PR_BRANCH" + update_product_images_changelogs + + git commit -sam "chore: Release $RELEASE_TAG" + push_branch +} + +rc_branch_operators() { + while IFS="" read -r operator || [ -n "$operator" ]; do + cd "${TEMP_RELEASE_FOLDER}/${operator}" + git switch "$PR_BRANCH" + + # Update git submodules if needed + if [ -f .gitmodules ]; then + git submodule update --recursive --init + fi + + # set tag version where relevant + cargo set-version --offline --workspace "$RELEASE_TAG" + cargo update --workspace + # Run via nix-shell for the correct dependencies. Makefile already calls + # nix stuff, so it shouldn't be a problem for non-nix users. + nix-shell --run 'make regenerate-charts' + nix-shell --run 'make regenerate-nix' + + update_code "$TEMP_RELEASE_FOLDER/${operator}" + + # ensure .j2 changes are resolved + "$TEMP_RELEASE_FOLDER/${operator}"/scripts/docs_templating.sh + + # inserts a single line with tag and date + update_changelog "$TEMP_RELEASE_FOLDER/${operator}" + + git commit -sam "chore: Release $RELEASE_TAG" + push_branch + done < <(yq '... comments="" | .operators[] ' "$INITIAL_DIR"/release/config.yaml) +} + +rc_branch_repos() { + if [ "products" == "$WHAT" ] || [ "all" == "$WHAT" ]; then + rc_branch_products + fi + if [ "operators" == "$WHAT" ] || [ "all" == "$WHAT" ]; then + rc_branch_operators + fi +} + +check_tag_is_valid() { + git fetch --tags + + # check tags: N.B. look for exact match + TAG_EXISTS=$(git tag --list | grep -E "$RELEASE_TAG$") + if [ -n "$TAG_EXISTS" ]; then + >&2 echo "Tag $RELEASE_TAG already exists!" + exit 1 + fi + + # Do we want proper semver version checking? + # We should switch this script to python if so. + #EXISTING_TAGS=$(git tag --list | grep -E "$RELEASE" | sort -V) + #for EXISTING_TAG in $EXISTING_TAGS; do + # if [[ "$RELEASE_TAG" < "$EXISTING_TAG" ]]; then + # >&2 echo "Error: Proposed tag $RELEASE_TAG is earlier than existing tag $EXISTING_TAG." + # exit 1 + # fi + #done +} + +check_products() { + if [ ! -d "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" ]; then + echo "Cloning folder: $TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" + # $TEMP_RELEASE_FOLDER has already been created in main() + git clone "git@github.com:stackabletech/${DOCKER_IMAGES_REPO}.git" "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" + fi + cd "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" + + # switch to the release branch, which should exist as tagging + # is subsequent to creating the branch. + BRANCH_EXISTS=$(git branch -a | grep -E "$RELEASE_BRANCH$") + + if [ -z "${BRANCH_EXISTS}" ]; then + >&2 echo "Expected release branch is missing: $RELEASE_BRANCH" + exit 1 + fi + + # the new PR should not exist, otherwise a duplicate commit + # will be prepared + BRANCH_EXISTS=$(git branch -a | grep -E "$PR_BRANCH$") + if [ -n "${BRANCH_EXISTS}" ]; then + >&2 echo "PR branch already exists: ${REPOSITORY}/$PR_BRANCH" + exit 1 + fi + + # create a new branch for the PR off of this + git switch -c "${PR_BRANCH}" "${REPOSITORY}/${RELEASE_BRANCH}" + + check_tag_is_valid +} + +check_operators() { + while IFS="" read -r operator || [ -n "$operator" ]; do + echo "Operator: $operator" + if [ ! -d "$TEMP_RELEASE_FOLDER/${operator}" ]; then + echo "Cloning folder: $TEMP_RELEASE_FOLDER/${operator}" + # $TEMP_RELEASE_FOLDER has already been created in main() + git clone "git@github.com:stackabletech/${operator}.git" "$TEMP_RELEASE_FOLDER/${operator}" + + fi + cd "$TEMP_RELEASE_FOLDER/${operator}" + BRANCH_EXISTS=$(git branch -a | grep -E "$RELEASE_BRANCH$") + if [ -z "${BRANCH_EXISTS}" ]; then + >&2 echo "Expected release branch is missing: ${operator}/$RELEASE_BRANCH" + exit 1 + fi + + # the new PR should not exist, otherwise a duplicate commit + # will be prepared + BRANCH_EXISTS=$(git branch -a | grep -E "$PR_BRANCH$") + if [ -n "${BRANCH_EXISTS}" ]; then + >&2 echo "PR branch already exists: ${operator}/$PR_BRANCH" + exit 1 + fi + + # create a new branch for the PR off of this + git switch -c "${PR_BRANCH}" "${REPOSITORY}/${RELEASE_BRANCH}" + + check_tag_is_valid + done < <(yq '... comments="" | .operators[] ' "$INITIAL_DIR"/release/config.yaml) +} + +checks() { + if [ "products" == "$WHAT" ] || [ "all" == "$WHAT" ]; then + check_products + fi + if [ "operators" == "$WHAT" ] || [ "all" == "$WHAT" ]; then + check_operators + fi +} + +update_code() { + if [ -d "$1/docs" ]; then + echo "Updating antora docs for $1" + + # antora version should be major.minor, not patch level + yq -i ".version = \"${RELEASE}\"" "$1/docs/antora.yml" + yq -i '.prerelease = false' "$1/docs/antora.yml" + + # Not all operators have a getting started guide + # that's why we verify if templating_vars.yaml exists. + if [ -f "$1/docs/templating_vars.yaml" ]; then + + # for an initial tag for a given release... + yq -i "(.versions.[] | select(. == \"*dev\")) |= \"${RELEASE_TAG}\"" "$1/docs/templating_vars.yaml" + + # ...consider for patch releases/release candidates too + # We assume that the tag (e.g. 23.7.1) is applied to an earlier tag in the same + # release (e.g. 23.7.0) so search+replace on the major.minor tag will suffice. + # TODO: this may pick up versions of external components as well. + yq -i "(.versions.[] | select(. == \"${RELEASE}*\")) |= \"${RELEASE_TAG}\"" "$1/docs/templating_vars.yaml" + + yq -i ".helm.repo_name |= sub(\"stackable-dev\", \"stackable-stable\")" "$1/docs/templating_vars.yaml" + yq -i ".helm.repo_url |= sub(\"helm-dev\", \"helm-stable\")" "$1/docs/templating_vars.yaml" + fi + + # Replace "nightly" link so the documentation refers to the current version + for file in $(find "$1/docs" -name "*.adoc"); do + sed -i "s/nightly@home/home/g" "$file" + done + else + echo "No docs found under $1." + fi + + # Update operator version for the integration tests + # (used when installing the operators). + yq -i ".releases.tests.products[].operatorVersion |= sub(\"0.0.0-dev\", \"${RELEASE_TAG}\")" "$1/tests/release.yaml" + + # do this for patch releases/release candidates too. + # i.e. replace 24.11.0-rc1 with 24.11.0, 24.7.0 with 24.7.1 etc. + yq -i "(.releases.tests.products[].operatorVersion | select(. == \"${RELEASE}*\")) |= \"${RELEASE_TAG}\"" "$1/tests/release.yaml" + + # Some tests perform **label** inspection and for (only) these cases specific labels should be updated. + # N.B. don't do this for all test files as not all images will necessarily exist for the given release tag. + find "$1/tests/templates/kuttl" -type f -print0 | xargs -0 sed -E -i "s#(app\.kubernetes\.io/version: \".*-stackable)[^\"]*#\1$RELEASE_TAG#" +} + +push_branch() { + if $PUSH; then + echo "Pushing changes..." + # the branch must be updated before the PR can be created + git push "${REPOSITORY}" "${PR_BRANCH}" + gh pr create --reviewer stackabletech/developers --base "${RELEASE_BRANCH}" --head "${PR_BRANCH}" --title "chore: Release ${RELEASE_TAG}" --body "${PR_MSG}" + else + echo "(Dry-run: not pushing...)" + git push --dry-run "${REPOSITORY}" "${PR_BRANCH}" + gh pr create --reviewer stackabletech/developers --dry-run --base "${RELEASE_BRANCH}" --head "${PR_BRANCH}" --title "chore: Release ${RELEASE_TAG}" --body "${PR_MSG}" + fi +} + +cleanup() { + if $CLEANUP; then + echo "Cleaning up..." + rm -rf "$TEMP_RELEASE_FOLDER" + fi +} + +update_changelog() { + TODAY=$(date +'%Y-%m-%d') + sed -i "s/^.*unreleased.*/## [Unreleased]\n\n## [$RELEASE_TAG] - $TODAY/I" "$1"/CHANGELOG.md +} + +update_product_images_changelogs() { + TODAY=$(date +'%Y-%m-%d') + sed -i "s/^.*unreleased.*/## [Unreleased]\n\n## [$RELEASE_TAG] - $TODAY/I" ./CHANGELOG.md +} + +parse_inputs() { + RELEASE_TAG="" + PUSH=false + CLEANUP=false + WHAT="" + + while [[ "$#" -gt 0 ]]; do + case $1 in + -t | --tag) + RELEASE_TAG="$2" + shift + ;; + -w | --what) + WHAT="$2" + shift + ;; + -p | --push) PUSH=true ;; + -c | --cleanup) CLEANUP=true ;; + *) + >&2 echo "Unknown parameter passed: $1" + exit 1 + ;; + esac + shift + done + + # remove leading and trailing quotes + RELEASE_TAG="${RELEASE_TAG%\"}" + RELEASE_TAG="${RELEASE_TAG#\"}" + + # for a tag of e.g. 23.1.1, the release branch (already created) will be 23.1 + RELEASE="$(cut -d'.' -f1,2 <<< "$RELEASE_TAG")" + RELEASE_BRANCH="release-$RELEASE" + # N.B. this has to match what is used in other scripts + PR_BRANCH="pr-$RELEASE_TAG" + + INITIAL_DIR="$PWD" + DOCKER_IMAGES_REPO=$(yq '... comments="" | .images-repo ' "$INITIAL_DIR"/release/config.yaml) + TEMP_RELEASE_FOLDER="/tmp/stackable-$RELEASE_BRANCH" + + echo "Settings: ${RELEASE_BRANCH}: Push: $PUSH: Cleanup: $CLEANUP" +} + +check_dependencies() { + # check for a globally configured git user + git_user=$(git config --global --get user.name) + git_email=$(git config --global --get user.email) + echo "global git user: $git_user <$git_email>" + + if [ -z "$git_user" ] || [ -z "$git_email" ]; then + >&2 echo "Error: global git user name/email is not set." + exit 1 + else + echo "Is this correct? (y/n)" + read -r response + if [[ "$response" == "y" || "$response" == "Y" ]]; then + echo "Proceeding with $git_user <$git_email>" + else + >&2 echo "User not accepted. Exiting." + exit 1 + fi + fi + + # check gh authentication: if this fails you will need to e.g. gh auth login + gh auth status + yq --version + python --version + cargo --version + cargo set-version --version + # check for jinja2-cli including pyyaml package + jinja2 --version + python -m pip show pyyaml +} + +main() { + parse_inputs "$@" + + # check if tag argument provided + if [ -z "${RELEASE_TAG}" ]; then + >&2 echo "Usage: create-release-candidate-branch.sh -t [-p] [-c] [-w products|operators|all]" + exit 1 + fi + + # check if argument matches our tag regex + if [[ ! $RELEASE_TAG =~ $TAG_REGEX ]]; then + >&2 echo "Provided tag [$RELEASE_TAG] does not match the required tag regex pattern [$TAG_REGEX]" + exit 1 + fi + + if [ ! -d "$TEMP_RELEASE_FOLDER" ]; then + echo "Creating folder for cloning docker images and operators: [$TEMP_RELEASE_FOLDER]" + mkdir -p "$TEMP_RELEASE_FOLDER" + fi + + check_dependencies + + # sanity checks before we start: folder, branches etc. + # deactivate -e so that piped commands can be used + set +e + checks + set -e + + echo "Cloning docker images and operators to [$TEMP_RELEASE_FOLDER]" + rc_branch_repos + cleanup +} + +main "$@" diff --git a/release/create-release-tag.sh b/release/create-release-tag.sh deleted file mode 100755 index 5c90b6c..0000000 --- a/release/create-release-tag.sh +++ /dev/null @@ -1,260 +0,0 @@ -#!/usr/bin/env bash -# -# See README.adoc -# -set -euo pipefail -set -x -#----------------------------------------------------------- -# tags should be semver-compatible e.g. 23.1.1 not 23.01.1 -# this is needed for cargo commands to work properly -#----------------------------------------------------------- -TAG_REGEX="^[0-9][0-9]\.([1-9]|[1][0-2])\.[0-9]+$" -REPOSITORY="origin" - -tag_products() { - # assume that the branch exists and has either been pushed or has been created locally - cd "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" - #----------------------------------------------------------- - # the release branch should already exist - #----------------------------------------------------------- - git switch "$RELEASE_BRANCH" - update_product_images_changelogs - - git commit -sam "release $RELEASE_TAG" - git tag -sm "release $RELEASE_TAG" "$RELEASE_TAG" - push_branch -} - -tag_operators() { - while IFS="" read -r operator || [ -n "$operator" ]; do - cd "${TEMP_RELEASE_FOLDER}/${operator}" - git switch "$RELEASE_BRANCH" - - # Update git submodules if needed - if [ -f .gitmodules ]; then - git submodule update --recursive --init - fi - - cargo set-version --offline --workspace "$RELEASE_TAG" - cargo update --workspace - # Run via nix-shell for the correct dependencies. Makefile already calls - # nix stuff, so it shouldn't be a problem for non-nix users. - nix-shell --run 'make regenerate-charts' - nix-shell --run 'make regenerate-nix' - - update_code "$TEMP_RELEASE_FOLDER/${operator}" - #----------------------------------------------------------- - # ensure .j2 changes are resolved - #----------------------------------------------------------- - "$TEMP_RELEASE_FOLDER/${operator}"/scripts/docs_templating.sh - #----------------------------------------------------------- - # inserts a single line with tag and date - #----------------------------------------------------------- - update_changelog "$TEMP_RELEASE_FOLDER/${operator}" - - git commit -sam "release $RELEASE_TAG" - git tag -sm "release $RELEASE_TAG" "$RELEASE_TAG" - push_branch - done < <(yq '... comments="" | .operators[] ' "$INITIAL_DIR"/release/config.yaml) -} - -tag_repos() { - if [ "products" == "$WHAT" ] || [ "all" == "$WHAT" ]; then - tag_products - fi - if [ "operators" == "$WHAT" ] || [ "all" == "$WHAT" ]; then - tag_operators - fi -} - -check_products() { - if [ ! -d "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" ]; then - echo "Expected folder is missing: $TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" - exit 1 - fi - cd "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" - #----------------------------------------------------------- - # the up-to-date release branch has already been pulled - # N.B. look for exact match (no -rcXXX) - #----------------------------------------------------------- - BRANCH_EXISTS=$(git branch -a | grep -E "$RELEASE_BRANCH$") - - if [ -z "${BRANCH_EXISTS}" ]; then - echo "Expected release branch is missing: $RELEASE_BRANCH" - exit 1 - fi - - git fetch --tags - - TAG_EXISTS=$(git tag -l | grep -E "$RELEASE_TAG$") - if [ -n "$TAG_EXISTS" ]; then - echo "Tag $RELEASE_TAG already exists in $DOCKER_IMAGES_REPO" - exit 1 - fi -} - -check_operators() { - while IFS="" read -r operator || [ -n "$operator" ]; do - echo "Operator: $operator" - if [ ! -d "$TEMP_RELEASE_FOLDER/${operator}" ]; then - echo "Expected folder is missing: $TEMP_RELEASE_FOLDER/${operator}" - exit 1 - fi - cd "$TEMP_RELEASE_FOLDER/${operator}" - BRANCH_EXISTS=$(git branch -a | grep -E "$RELEASE_BRANCH$") - if [ -z "${BRANCH_EXISTS}" ]; then - echo "Expected release branch is missing: ${operator}/$RELEASE_BRANCH" - exit 1 - fi - git fetch --tags - TAG_EXISTS=$(git tag -l | grep -E "$RELEASE_TAG$") - if [ -n "${TAG_EXISTS}" ]; then - echo "Tag $RELEASE_TAG already exists in ${operator}" - exit 1 - fi - done < <(yq '... comments="" | .operators[] ' "$INITIAL_DIR"/release/config.yaml) -} - -checks() { - if [ "products" == "$WHAT" ] || [ "all" == "$WHAT" ]; then - check_products - fi - if [ "operators" == "$WHAT" ] || [ "all" == "$WHAT" ]; then - check_operators - fi -} - -update_code() { - if [ -d "$1/docs" ]; then - echo "Updating antora docs for $1" - # antora version should be major.minor, not patch level - yq -i ".version = \"${RELEASE}\"" "$1/docs/antora.yml" - yq -i '.prerelease = false' "$1/docs/antora.yml" - - # Not all operators have a getting started guide - # that's why we verify if templating_vars.yaml exists. - if [ -f "$1/docs/templating_vars.yaml" ]; then - yq -i "(.versions.[] | select(. == \"*dev\")) |= \"${RELEASE_TAG}\"" "$1/docs/templating_vars.yaml" - yq -i ".helm.repo_name |= sub(\"stackable-dev\", \"stackable-stable\")" "$1/docs/templating_vars.yaml" - yq -i ".helm.repo_url |= sub(\"helm-dev\", \"helm-stable\")" "$1/docs/templating_vars.yaml" - fi - - #-------------------------------------------------------------------------- - # Replace "nightly" link so the documentation refers to the current version - #-------------------------------------------------------------------------- - for file in $(find "$1/docs" -name "*.adoc"); do - sed -i "s/nightly@home/home/g" "$file" - done - else - echo "No docs found under $1." - fi - - # Update operator version for the integration tests - # this is used when installing the operators. - yq -i ".releases.tests.products[].operatorVersion |= sub(\"0.0.0-dev\", \"${RELEASE_TAG}\")" "$1/tests/release.yaml" - - # Some tests perform label inspection and for these cases only specific labels should be updated. - # N.B. don't do this for all test files as not all images will necessarily exist for the given release tag. - find "$1/tests/templates/kuttl" -type f -print0 | xargs -0 sed -i "/app.kubernetes.io\/version/{ s/stackable0.0.0-dev/stackable$RELEASE_TAG/ }" -} - -push_branch() { - if $PUSH; then - echo "Pushing changes..." - git push "${REPOSITORY}" "${RELEASE_BRANCH}" - git push "${REPOSITORY}" "${RELEASE_TAG}" - git switch main - else - echo "(Dry-run: not pushing...)" - fi -} - -cleanup() { - if $CLEANUP; then - echo "Cleaning up..." - rm -rf "$TEMP_RELEASE_FOLDER" - fi -} - -update_changelog() { - TODAY=$(date +'%Y-%m-%d') - sed -i "s/^.*unreleased.*/## [Unreleased]\n\n## [$RELEASE_TAG] - $TODAY/I" "$1"/CHANGELOG.md -} - -update_product_images_changelogs() { - TODAY=$(date +'%Y-%m-%d') - sed -i "s/^.*unreleased.*/## [Unreleased]\n\n## [$RELEASE_TAG] - $TODAY/I" ./CHANGELOG.md -} - -parse_inputs() { - RELEASE_TAG="" - PUSH=false - CLEANUP=false - WHAT="" - - while [[ "$#" -gt 0 ]]; do - case $1 in - -t | --tag) - RELEASE_TAG="$2" - shift - ;; - -w | --what) - WHAT="$2" - shift - ;; - -p | --push) PUSH=true ;; - -c | --cleanup) CLEANUP=true ;; - *) - echo "Unknown parameter passed: $1" - exit 1 - ;; - esac - shift - done - #----------------------------------------------------------- - # remove leading and trailing quotes - #----------------------------------------------------------- - RELEASE_TAG="${RELEASE_TAG%\"}" - RELEASE_TAG="${RELEASE_TAG#\"}" - #---------------------------------------------------------------------------------------------------- - # for a tag of e.g. 23.1.1, the release branch (already created) will be 23.1 - #---------------------------------------------------------------------------------------------------- - RELEASE="$(cut -d'.' -f1,2 <<<"$RELEASE_TAG")" - RELEASE_BRANCH="release-$RELEASE" - - INITIAL_DIR="$PWD" - DOCKER_IMAGES_REPO=$(yq '... comments="" | .images-repo ' "$INITIAL_DIR"/release/config.yaml) - TEMP_RELEASE_FOLDER="/tmp/stackable-$RELEASE_BRANCH" - - echo "Settings: ${RELEASE_BRANCH}: Push: $PUSH: Cleanup: $CLEANUP" -} - -main() { - parse_inputs "$@" - #----------------------------------------------------------- - # check if tag argument provided - #----------------------------------------------------------- - if [ -z "${RELEASE_TAG}" ]; then - echo "Usage: create-release-tag.sh -t [-p] [-c] [-w products|operators|all]" - exit 1 - fi - #----------------------------------------------------------- - # check if argument matches our tag regex - #----------------------------------------------------------- - if [[ ! $RELEASE_TAG =~ $TAG_REGEX ]]; then - echo "Provided tag [$RELEASE_TAG] does not match the required tag regex pattern [$TAG_REGEX]" - exit 1 - fi - - # sanity checks before we start: folder, branches etc. - # deactivate -e so that piped commands can be used - set +e - checks - set -e - - echo "Cloning docker images and operators to [$TEMP_RELEASE_FOLDER]" - tag_repos - cleanup -} - -main "$@" diff --git a/release/images/rb-flow.excalidraw b/release/images/rb-flow.excalidraw deleted file mode 100644 index 178b5a6..0000000 --- a/release/images/rb-flow.excalidraw +++ /dev/null @@ -1,1536 +0,0 @@ -{ - "type": "excalidraw", - "version": 2, - "source": "https://excalidraw.com", - "elements": [ - { - "type": "rectangle", - "version": 430, - "versionNonce": 539738456, - "isDeleted": false, - "id": "JYPk5thyqpg-fd57u6KK-", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 593.25, - "y": -121.375, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 1105, - "height": 719, - "seed": 883938501, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1670403303657, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 939, - "versionNonce": 205972264, - "isDeleted": false, - "id": "JJCS7i8cPQyVtE1BuZOMq", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 672.5, - "y": 107.75, - "strokeColor": "#000000", - "backgroundColor": "#15aabf", - "width": 140, - "height": 60, - "seed": 1604797665, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "mFWehj5hYQDV1SsUvjdzT" - }, - { - "id": "DEawNknZ5rHzroZ_ZX9Pl", - "type": "arrow" - } - ], - "updated": 1670403293146, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 1009, - "versionNonce": 1785348952, - "isDeleted": false, - "id": "mFWehj5hYQDV1SsUvjdzT", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 682.5, - "y": 125.25, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 120, - "height": 25, - "seed": 1157936559, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1670403293146, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "release-23.1", - "baseline": 18, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "JJCS7i8cPQyVtE1BuZOMq", - "originalText": "release-23.1" - }, - { - "type": "rectangle", - "version": 658, - "versionNonce": 2060467752, - "isDeleted": false, - "id": "sTt0oJPCuSBgLjFPVjae6", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 681.5, - "y": -29.75, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 164, - "height": 60, - "seed": 551088129, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "BblAEzuw8CD9lAHHl2S2S" - }, - { - "id": "RvMKjGD5TcBAYRnIWl7X-", - "type": "arrow" - }, - { - "id": "DEawNknZ5rHzroZ_ZX9Pl", - "type": "arrow" - } - ], - "updated": 1670403293146, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 663, - "versionNonce": 133699672, - "isDeleted": false, - "id": "BblAEzuw8CD9lAHHl2S2S", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 702.5, - "y": -24.75, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 122, - "height": 50, - "seed": 695127183, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1670403293146, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "main: \n0.0.0-nightly", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "sTt0oJPCuSBgLjFPVjae6", - "originalText": "main: 0.0.0-nightly" - }, - { - "type": "rectangle", - "version": 559, - "versionNonce": 1977429080, - "isDeleted": false, - "id": "LjbgwSH4OfjrUDa6i5fbb", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 836.75, - "y": -13.875, - "strokeColor": "#000000", - "backgroundColor": "#ced4da", - "width": 254, - "height": 68, - "seed": 2142897835, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "c56MnIn6qmV2QxyUTM_5X" - } - ], - "updated": 1670403293147, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 374, - "versionNonce": 1125934376, - "isDeleted": false, - "id": "c56MnIn6qmV2QxyUTM_5X", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 0, - "x": 868.75, - "y": -4.875, - "strokeColor": "#000000", - "backgroundColor": "#ced4da", - "width": 190, - "height": 50, - "seed": 312261707, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1670403293147, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "version has to be \nsemver (for cargo)!", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "LjbgwSH4OfjrUDa6i5fbb", - "originalText": "version has to be semver (for cargo)!" - }, - { - "type": "rectangle", - "version": 872, - "versionNonce": 1032951336, - "isDeleted": false, - "id": "8AGcjcdoixcywjWMmTeH1", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 870.75, - "y": 265.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 75, - "height": 60, - "seed": 1287875557, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "iahLU3Y-gISn1eXKpcrvV" - }, - { - "id": "aJYenVhmVNjjTtVVA9Zma", - "type": "arrow" - } - ], - "updated": 1670403293147, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 884, - "versionNonce": 1318600792, - "isDeleted": false, - "id": "iahLU3Y-gISn1eXKpcrvV", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 877.75, - "y": 270.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 61, - "height": 50, - "seed": 1684369643, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1670403293147, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "gh \naction", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "8AGcjcdoixcywjWMmTeH1", - "originalText": "gh action" - }, - { - "type": "text", - "version": 195, - "versionNonce": 126146600, - "isDeleted": false, - "id": "9mW4VLdLPdhUHgxd4DCGV", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1027.75, - "y": -99.375, - "strokeColor": "#0b7285", - "backgroundColor": "transparent", - "width": 230, - "height": 25, - "seed": 1724444069, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1670403293148, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "Flow: Release Branches", - "baseline": 18, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "Flow: Release Branches" - }, - { - "type": "rectangle", - "version": 728, - "versionNonce": 625363288, - "isDeleted": false, - "id": "-hnlWHG_ssJSrLIwMmIN9", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1398.25, - "y": 285.625, - "strokeColor": "#000000", - "backgroundColor": "#fab005", - "width": 254, - "height": 270, - "seed": 1280081131, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "gm60kY1uYD0iPdoJ-mm0w" - } - ], - "updated": 1670403297144, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 999, - "versionNonce": 1881118760, - "isDeleted": false, - "id": "gm60kY1uYD0iPdoJ-mm0w", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 0, - "x": 1421.25, - "y": 290.625, - "strokeColor": "#000000", - "backgroundColor": "#ced4da", - "width": 208, - "height": 260, - "seed": 1249270597, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [], - "updated": 1670403297144, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "DOCKER_IMAGES \n- conf.py (dicts)\n- build_product_images.py\n- release.yaml\n\nSTACKABLE-UTILS\n- create-release-branch.sh\n- create-release-tag.sh\n- operator-list.txt\n\nOPERATORS\n- versions -> 0.0.0-nightly\n- build.yaml?", - "baseline": 254, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "-hnlWHG_ssJSrLIwMmIN9", - "originalText": "DOCKER_IMAGES \n- conf.py (dicts)\n- build_product_images.py\n- release.yaml\n\nSTACKABLE-UTILS\n- create-release-branch.sh\n- create-release-tag.sh\n- operator-list.txt\n\nOPERATORS\n- versions -> 0.0.0-nightly\n- build.yaml?" - }, - { - "id": "RvMKjGD5TcBAYRnIWl7X-", - "type": "arrow", - "x": 675.75, - "y": -42.375, - "width": 974, - "height": 0, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 1922733096, - "version": 68, - "versionNonce": 2009895768, - "isDeleted": false, - "boundElements": null, - "updated": 1670403293148, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 974, - 0 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "sTt0oJPCuSBgLjFPVjae6", - "focus": -1.4208333333333334, - "gap": 12.625 - }, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "type": "arrow", - "version": 347, - "versionNonce": 662367784, - "isDeleted": false, - "id": "TuUFKDpI0yyBTapKVaPr_", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 669.375, - "y": 84.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 984.875, - "height": 4.5, - "seed": 956859224, - "groupIds": [], - "strokeSharpness": "round", - "boundElements": null, - "updated": 1670403293148, - "link": null, - "locked": false, - "startBinding": null, - "endBinding": null, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 984.875, - -4.5 - ] - ] - }, - { - "id": "DEawNknZ5rHzroZ_ZX9Pl", - "type": "arrow", - "x": 673.75, - "y": 5.125, - "width": 67.5, - "height": 140.95635909565783, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 972073048, - "version": 247, - "versionNonce": 1418750040, - "isDeleted": false, - "boundElements": null, - "updated": 1670403293148, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -67.5, - 63 - ], - [ - -3, - 140.95635909565783 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "sTt0oJPCuSBgLjFPVjae6", - "focus": 0.7405350438047559, - "gap": 7.75 - }, - "endBinding": { - "elementId": "JJCS7i8cPQyVtE1BuZOMq", - "gap": 1.75, - "focus": -0.8293813486721331 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "type": "rectangle", - "version": 903, - "versionNonce": 1229646120, - "isDeleted": false, - "id": "MBsW7yzA59-6hNuyphfJ3", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 880.75, - "y": 110.125, - "strokeColor": "#000000", - "backgroundColor": "#be4bdb", - "width": 71, - "height": 60, - "seed": 548499544, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "THK2885rWMgh9pMF9Srdb" - }, - { - "id": "aJYenVhmVNjjTtVVA9Zma", - "type": "arrow" - } - ], - "updated": 1670403293148, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 970, - "versionNonce": 1947311448, - "isDeleted": false, - "id": "THK2885rWMgh9pMF9Srdb", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 886.25, - "y": 127.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 60, - "height": 25, - "seed": 295592232, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403293148, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "23.1.0", - "baseline": 18, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "MBsW7yzA59-6hNuyphfJ3", - "originalText": "23.1.0" - }, - { - "type": "rectangle", - "version": 1112, - "versionNonce": 804196392, - "isDeleted": false, - "id": "n5EvbNqQJPAsb4UNy7zQd", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 610.75, - "y": 555.625, - "strokeColor": "#000000", - "backgroundColor": "#15aabf", - "width": 61, - "height": 30, - "seed": 2051671336, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "29jifLY6TDJpzv_J_m25w" - } - ], - "updated": 1670403309285, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 1189, - "versionNonce": 1449616984, - "isDeleted": false, - "id": "29jifLY6TDJpzv_J_m25w", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 615.75, - "y": 560.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 51, - "height": 20, - "seed": 723665240, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403309285, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "branch", - "baseline": 14, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "n5EvbNqQJPAsb4UNy7zQd", - "originalText": "branch" - }, - { - "type": "rectangle", - "version": 1144, - "versionNonce": 854248232, - "isDeleted": false, - "id": "-LdSDzqeP0-a_HSJlmd0G", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 682.75, - "y": 557.125, - "strokeColor": "#000000", - "backgroundColor": "#be4bdb", - "width": 61, - "height": 30, - "seed": 432287576, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "zRF3XhsfwJ7GbiIZsZ_GC" - } - ], - "updated": 1670403309285, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 1222, - "versionNonce": 1582881624, - "isDeleted": false, - "id": "zRF3XhsfwJ7GbiIZsZ_GC", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 698.25, - "y": 562.125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 30, - "height": 20, - "seed": 2002457128, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403309285, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "tag", - "baseline": 14, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "-LdSDzqeP0-a_HSJlmd0G", - "originalText": "tag" - }, - { - "id": "aJYenVhmVNjjTtVVA9Zma", - "type": "arrow", - "x": 911.2142884161497, - "y": 178.625, - "width": 1.0595935477290368, - "height": 73, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "#be4bdb", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 840124456, - "version": 236, - "versionNonce": 162285144, - "isDeleted": false, - "boundElements": null, - "updated": 1670403293148, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -1.0595935477290368, - 73 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "MBsW7yzA59-6hNuyphfJ3", - "gap": 8.5, - "focus": 0.1134081512108683 - }, - "endBinding": { - "elementId": "8AGcjcdoixcywjWMmTeH1", - "gap": 14, - "focus": 0.03337342152736019 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "type": "rectangle", - "version": 937, - "versionNonce": 1793321768, - "isDeleted": false, - "id": "hU24SL9HFxjFkZ0EDNfGx", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 993.25, - "y": 109.625, - "strokeColor": "#000000", - "backgroundColor": "#be4bdb", - "width": 71, - "height": 60, - "seed": 1014923816, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "0X9VLGp9tofa6xYx22V1E" - }, - { - "id": "DDL7CCjoWVlXSiELkALDS", - "type": "arrow" - } - ], - "updated": 1670403293148, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 1004, - "versionNonce": 369212248, - "isDeleted": false, - "id": "0X9VLGp9tofa6xYx22V1E", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1002.75, - "y": 127.125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 52, - "height": 25, - "seed": 843060312, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403293148, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "23.1.1", - "baseline": 18, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "hU24SL9HFxjFkZ0EDNfGx", - "originalText": "23.1.1" - }, - { - "type": "rectangle", - "version": 903, - "versionNonce": 277628456, - "isDeleted": false, - "id": "zsIjvdtA3Z-RxfdIZDBFa", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 991.75, - "y": 267.125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 75, - "height": 60, - "seed": 2071615784, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "ZlLCEYGZWZClidiptefAu" - }, - { - "id": "DDL7CCjoWVlXSiELkALDS", - "type": "arrow" - } - ], - "updated": 1670403293148, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 913, - "versionNonce": 1105236056, - "isDeleted": false, - "id": "ZlLCEYGZWZClidiptefAu", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 998.75, - "y": 272.125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 61, - "height": 50, - "seed": 1389440344, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403293148, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "gh \naction", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "zsIjvdtA3Z-RxfdIZDBFa", - "originalText": "gh action" - }, - { - "id": "DDL7CCjoWVlXSiELkALDS", - "type": "arrow", - "x": 1024.25, - "y": 179.625, - "width": 0, - "height": 72.5, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "#be4bdb", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 1414381096, - "version": 29, - "versionNonce": 913391912, - "isDeleted": false, - "boundElements": null, - "updated": 1670403293148, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 0, - 72.5 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "hU24SL9HFxjFkZ0EDNfGx", - "focus": 0.1267605633802817, - "gap": 10 - }, - "endBinding": { - "elementId": "zsIjvdtA3Z-RxfdIZDBFa", - "focus": -0.13333333333333333, - "gap": 15 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "type": "rectangle", - "version": 1104, - "versionNonce": 354207064, - "isDeleted": false, - "id": "Z7uPysvzUtvbW3LY7tE93", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1161.75, - "y": -33.375, - "strokeColor": "#c92a2a", - "backgroundColor": "transparent", - "width": 75, - "height": 35, - "seed": 725029720, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "k3oG7u0FaHUkBRZ5pE-Jk" - }, - { - "id": "eizpv_dou6o0IIER_30UQ", - "type": "arrow" - } - ], - "updated": 1670403293148, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 1095, - "versionNonce": 1811864616, - "isDeleted": false, - "id": "k3oG7u0FaHUkBRZ5pE-Jk", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1169.75, - "y": -28.375, - "strokeColor": "#c92a2a", - "backgroundColor": "transparent", - "width": 59, - "height": 25, - "seed": 368602664, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403293149, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "bugfix", - "baseline": 18, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "Z7uPysvzUtvbW3LY7tE93", - "originalText": "bugfix" - }, - { - "type": "rectangle", - "version": 1150, - "versionNonce": 2097830488, - "isDeleted": false, - "id": "WVPvOh-dJjAbUkUBtdyAL", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1163.75, - "y": 93.125, - "strokeColor": "#c92a2a", - "backgroundColor": "transparent", - "width": 75, - "height": 35, - "seed": 444198952, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "4aCjJnzJN_jS1YpwE11SF" - }, - { - "id": "eizpv_dou6o0IIER_30UQ", - "type": "arrow" - } - ], - "updated": 1670403293149, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 1140, - "versionNonce": 1931548456, - "isDeleted": false, - "id": "4aCjJnzJN_jS1YpwE11SF", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1171.75, - "y": 98.125, - "strokeColor": "#c92a2a", - "backgroundColor": "transparent", - "width": 59, - "height": 25, - "seed": 1450870360, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403293149, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "bugfix", - "baseline": 18, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "WVPvOh-dJjAbUkUBtdyAL", - "originalText": "bugfix" - }, - { - "id": "khAsq37yIJaf_nyXTK-ZC", - "type": "line", - "x": 1123.25, - "y": -61.875, - "width": 2, - "height": 468.5, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "#be4bdb", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "dotted", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 1226137944, - "version": 69, - "versionNonce": 477974360, - "isDeleted": false, - "boundElements": null, - "updated": 1670403293149, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - -2, - 468.5 - ] - ], - "lastCommittedPoint": null, - "startBinding": null, - "endBinding": null, - "startArrowhead": null, - "endArrowhead": null - }, - { - "id": "eizpv_dou6o0IIER_30UQ", - "type": "arrow", - "x": 1250.75, - "y": -11.875, - "width": 40, - "height": 99.5, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "#be4bdb", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 210250584, - "version": 336, - "versionNonce": 1883501096, - "isDeleted": false, - "boundElements": null, - "updated": 1670403293149, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 32.5, - 49.5 - ], - [ - -7.5, - 99.5 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "Z7uPysvzUtvbW3LY7tE93", - "focus": -0.9976288659793812, - "gap": 14 - }, - "endBinding": { - "elementId": "WVPvOh-dJjAbUkUBtdyAL", - "focus": 0.45825242718446607, - "gap": 5.5 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "type": "rectangle", - "version": 1129, - "versionNonce": 466199640, - "isDeleted": false, - "id": "CQwW_cBGYtChZXEP4ySil", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1289.25, - "y": -13.875, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 115, - "height": 35, - "seed": 269044312, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "MpMz9oX05w31yEmlyLqOO" - } - ], - "updated": 1670403293149, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 1156, - "versionNonce": 441675048, - "isDeleted": false, - "id": "MpMz9oX05w31yEmlyLqOO", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1295.75, - "y": -8.875, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 102, - "height": 25, - "seed": 1204365096, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403293149, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "cherry-pick", - "baseline": 18, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "CQwW_cBGYtChZXEP4ySil", - "originalText": "cherry-pick" - }, - { - "type": "rectangle", - "version": 988, - "versionNonce": 2026068312, - "isDeleted": false, - "id": "NHSXlX1FcqQgw6ylYJpas", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1296.25, - "y": 102.125, - "strokeColor": "#000000", - "backgroundColor": "#be4bdb", - "width": 71, - "height": 60, - "seed": 1066054488, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "T9p9LPipxVYCRSFpmSOQZ" - }, - { - "id": "Wrr-EfHar-rPJoq-kZgXS", - "type": "arrow" - } - ], - "updated": 1670403293149, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 1055, - "versionNonce": 1790674984, - "isDeleted": false, - "id": "T9p9LPipxVYCRSFpmSOQZ", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1301.75, - "y": 119.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 60, - "height": 25, - "seed": 1513016872, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403293149, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "23.1.2", - "baseline": 18, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "NHSXlX1FcqQgw6ylYJpas", - "originalText": "23.1.2" - }, - { - "type": "rectangle", - "version": 958, - "versionNonce": 1455320664, - "isDeleted": false, - "id": "aAJg6AA0iy1VnXAM9USRE", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1295.75, - "y": 262.125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 75, - "height": 60, - "seed": 1994735960, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "9nYcjOMBoL6ZiRHyhRwHZ" - }, - { - "id": "Wrr-EfHar-rPJoq-kZgXS", - "type": "arrow" - } - ], - "updated": 1670403293149, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 966, - "versionNonce": 1298678568, - "isDeleted": false, - "id": "9nYcjOMBoL6ZiRHyhRwHZ", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1302.75, - "y": 267.125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 61, - "height": 50, - "seed": 1175199784, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403293149, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "gh \naction", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "aAJg6AA0iy1VnXAM9USRE", - "originalText": "gh action" - }, - { - "id": "Wrr-EfHar-rPJoq-kZgXS", - "type": "arrow", - "x": 1327.25, - "y": 176.625, - "width": 1, - "height": 72, - "angle": 0, - "strokeColor": "#000000", - "backgroundColor": "#be4bdb", - "fillStyle": "hachure", - "strokeWidth": 2, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "groupIds": [], - "strokeSharpness": "round", - "seed": 1203086424, - "version": 40, - "versionNonce": 1317987160, - "isDeleted": false, - "boundElements": null, - "updated": 1670403293149, - "link": null, - "locked": false, - "points": [ - [ - 0, - 0 - ], - [ - 1, - 72 - ] - ], - "lastCommittedPoint": null, - "startBinding": { - "elementId": "NHSXlX1FcqQgw6ylYJpas", - "focus": 0.14249806651198763, - "gap": 14.5 - }, - "endBinding": { - "elementId": "aAJg6AA0iy1VnXAM9USRE", - "focus": -0.11593406593406594, - "gap": 13.5 - }, - "startArrowhead": null, - "endArrowhead": "arrow" - }, - { - "type": "rectangle", - "version": 965, - "versionNonce": 377296984, - "isDeleted": false, - "id": "gRCSsUK1zZ8-AsLVYh751", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 823.75, - "y": 380.625, - "strokeColor": "#000000", - "backgroundColor": "#fab005", - "width": 254, - "height": 88, - "seed": 176556328, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": [ - { - "type": "text", - "id": "5EGF8cD18xK_ou8mCqtH5" - } - ], - "updated": 1670403315662, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 1295, - "versionNonce": 1841379624, - "isDeleted": false, - "id": "5EGF8cD18xK_ou8mCqtH5", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 0, - "x": 857.25, - "y": 394.625, - "strokeColor": "#000000", - "backgroundColor": "#ced4da", - "width": 187, - "height": 60, - "seed": 1335393624, - "groupIds": [], - "strokeSharpness": "sharp", - "boundElements": null, - "updated": 1670403315662, - "link": null, - "locked": false, - "fontSize": 16, - "fontFamily": 1, - "text": "N.B.\n- semver versions (23.1)\n- no RCs", - "baseline": 54, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "gRCSsUK1zZ8-AsLVYh751", - "originalText": "N.B.\n- semver versions (23.1)\n- no RCs" - } - ], - "appState": { - "gridSize": null, - "viewBackgroundColor": "#ffffff" - }, - "files": {} -} \ No newline at end of file diff --git a/release/images/rb-flow.png b/release/images/rb-flow.png deleted file mode 100644 index 5e7e68b..0000000 Binary files a/release/images/rb-flow.png and /dev/null differ diff --git a/release/images/rb-utils.excalidraw b/release/images/rb-utils.excalidraw deleted file mode 100644 index de97f25..0000000 --- a/release/images/rb-utils.excalidraw +++ /dev/null @@ -1,1035 +0,0 @@ -{ - "type": "excalidraw", - "version": 2, - "source": "https://excalidraw.com", - "elements": [ - { - "type": "rectangle", - "version": 152, - "versionNonce": 1666603751, - "isDeleted": false, - "id": "JYPk5thyqpg-fd57u6KK-", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 554.75, - "y": -121.375, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 1200, - "height": 706, - "seed": 883938501, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1674058117101, - "link": null, - "locked": false - }, - { - "type": "rectangle", - "version": 589, - "versionNonce": 1824186025, - "isDeleted": false, - "id": "JJCS7i8cPQyVtE1BuZOMq", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 666, - "y": 9.25, - "strokeColor": "#000000", - "backgroundColor": "#15aabf", - "width": 281, - "height": 98, - "seed": 1604797665, - "groupIds": [], - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "mFWehj5hYQDV1SsUvjdzT" - }, - { - "id": "4xd3jOTmx8NQRjG4Cevfn", - "type": "arrow" - }, - { - "id": "Y3s5ALSdCGuMwr2-n058n", - "type": "arrow" - }, - { - "id": "qVgZfGlK6-PxszlqaoZki", - "type": "arrow" - } - ], - "updated": 1674058004606, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 622, - "versionNonce": 510734376, - "isDeleted": false, - "id": "mFWehj5hYQDV1SsUvjdzT", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 686, - "y": 33.25, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 241, - "height": 50, - "seed": 1157936559, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1670401132485, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "create-release-branch.sh\n-b \"23.1\" -p -c", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "JJCS7i8cPQyVtE1BuZOMq", - "originalText": "create-release-branch.sh\n-b \"23.1\" -p -c" - }, - { - "type": "rectangle", - "version": 507, - "versionNonce": 546784856, - "isDeleted": false, - "id": "sTt0oJPCuSBgLjFPVjae6", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 798.5, - "y": 136.75, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 180, - "height": 121, - "seed": 551088129, - "groupIds": [], - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "BblAEzuw8CD9lAHHl2S2S" - }, - { - "id": "Y3s5ALSdCGuMwr2-n058n", - "type": "arrow" - } - ], - "updated": 1670401132485, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 533, - "versionNonce": 1277750056, - "isDeleted": false, - "id": "BblAEzuw8CD9lAHHl2S2S", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 804.5, - "y": 147.25, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 168, - "height": 100, - "seed": 695127183, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1670401132485, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "create temp \nfolder, clone \nimages/operator \nrepos", - "baseline": 93, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "sTt0oJPCuSBgLjFPVjae6", - "originalText": "create temp folder, clone images/operator repos" - }, - { - "type": "rectangle", - "version": 632, - "versionNonce": 1585123529, - "isDeleted": false, - "id": "X-UZtDWuz4MNDCXZc_Cx2", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 804, - "y": 390.75, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 181, - "height": 88, - "seed": 1444528129, - "groupIds": [], - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "sixI8hkdmdBFHoVW7kveW" - }, - { - "id": "4xd3jOTmx8NQRjG4Cevfn", - "type": "arrow" - } - ], - "updated": 1674058007057, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 702, - "versionNonce": 655490119, - "isDeleted": false, - "id": "sixI8hkdmdBFHoVW7kveW", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 819, - "y": 409.75, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 151, - "height": 50, - "seed": 23264399, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1674058007058, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "(push branches)\n(cleanup)", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "X-UZtDWuz4MNDCXZc_Cx2", - "originalText": "(push branches)\n(cleanup)" - }, - { - "type": "arrow", - "version": 434, - "versionNonce": 1877460312, - "isDeleted": false, - "id": "Y3s5ALSdCGuMwr2-n058n", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 699.5196318963672, - "y": 111.75, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 97.18777551104029, - "height": 94.68788097041664, - "seed": 760179151, - "groupIds": [], - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1670401132485, - "link": null, - "locked": false, - "startBinding": { - "elementId": "JJCS7i8cPQyVtE1BuZOMq", - "focus": 0.7818006275645664, - "gap": 4.5 - }, - "endBinding": { - "elementId": "sTt0oJPCuSBgLjFPVjae6", - "focus": -0.33900501127540705, - "gap": 1.7925925925925412 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 14.980368103632827, - 79.5 - ], - [ - 97.18777551104029, - 94.68788097041664 - ] - ] - }, - { - "type": "arrow", - "version": 540, - "versionNonce": 139464617, - "isDeleted": false, - "id": "4xd3jOTmx8NQRjG4Cevfn", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 701.3667140968017, - "y": 111.75, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 101.03328590319836, - "height": 340.90861265518856, - "seed": 88861473, - "groupIds": [], - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1674058007058, - "link": null, - "locked": false, - "startBinding": { - "elementId": "JJCS7i8cPQyVtE1BuZOMq", - "focus": 0.754394391078724, - "gap": 4.5 - }, - "endBinding": { - "elementId": "X-UZtDWuz4MNDCXZc_Cx2", - "gap": 1.6000000000000003, - "focus": -0.666053414282648 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 16.13328590319827, - 310.5 - ], - [ - 101.03328590319836, - 340.90861265518856 - ] - ] - }, - { - "type": "rectangle", - "version": 410, - "versionNonce": 166074152, - "isDeleted": false, - "id": "LjbgwSH4OfjrUDa6i5fbb", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 831.25, - "y": -43.875, - "strokeColor": "#000000", - "backgroundColor": "#ced4da", - "width": 254, - "height": 68, - "seed": 2142897835, - "groupIds": [], - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "c56MnIn6qmV2QxyUTM_5X" - } - ], - "updated": 1670401132485, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 225, - "versionNonce": 8933208, - "isDeleted": false, - "id": "c56MnIn6qmV2QxyUTM_5X", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 2, - "opacity": 100, - "angle": 0, - "x": 863.25, - "y": -34.875, - "strokeColor": "#000000", - "backgroundColor": "#ced4da", - "width": 190, - "height": 50, - "seed": 312261707, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1670401132485, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "version has to be \nsemver (for cargo)!", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "LjbgwSH4OfjrUDa6i5fbb", - "originalText": "version has to be semver (for cargo)!" - }, - { - "type": "rectangle", - "version": 742, - "versionNonce": 1847600297, - "isDeleted": false, - "id": "Yg86MWwaRqhHfdBFC2_tW", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1204.25, - "y": 8.625, - "strokeColor": "#000000", - "backgroundColor": "#15aabf", - "width": 281, - "height": 98, - "seed": 1908069963, - "groupIds": [], - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "sDU789KPy-scwW6Ljagm_" - }, - { - "id": "cNz6jhfxmcfpwIBd6pHZP", - "type": "arrow" - }, - { - "id": "3P4N3Me5FAlWrx-VC24zQ", - "type": "arrow" - }, - { - "id": "yGMeoGKVjXYnj6QbteXta", - "type": "arrow" - } - ], - "updated": 1674058026382, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 784, - "versionNonce": 1182049368, - "isDeleted": false, - "id": "sDU789KPy-scwW6Ljagm_", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1237.75, - "y": 32.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 214, - "height": 50, - "seed": 1019004901, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1670401132485, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "create-release-tag.sh\n-t \"23.1.0\" -p -c", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "Yg86MWwaRqhHfdBFC2_tW", - "originalText": "create-release-tag.sh\n-t \"23.1.0\" -p -c" - }, - { - "type": "rectangle", - "version": 687, - "versionNonce": 313093720, - "isDeleted": false, - "id": "8AGcjcdoixcywjWMmTeH1", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 800.25, - "y": 290.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 180, - "height": 60, - "seed": 1287875557, - "groupIds": [], - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "iahLU3Y-gISn1eXKpcrvV" - }, - { - "id": "qVgZfGlK6-PxszlqaoZki", - "type": "arrow" - } - ], - "updated": 1670401132485, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 681, - "versionNonce": 1504527144, - "isDeleted": false, - "id": "iahLU3Y-gISn1eXKpcrvV", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 830.75, - "y": 295.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 119, - "height": 50, - "seed": 1684369643, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1670401132485, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "create new \nbranches", - "baseline": 43, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "8AGcjcdoixcywjWMmTeH1", - "originalText": "create new branches" - }, - { - "type": "arrow", - "version": 385, - "versionNonce": 1427759960, - "isDeleted": false, - "id": "qVgZfGlK6-PxszlqaoZki", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 698.75, - "y": 111.625, - "strokeColor": "#000000", - "backgroundColor": "#ced4da", - "width": 98, - "height": 213.6991235141124, - "seed": 201052939, - "groupIds": [], - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1670401132485, - "link": null, - "locked": false, - "startBinding": { - "elementId": "JJCS7i8cPQyVtE1BuZOMq", - "focus": 0.7797751872667847, - "gap": 4.375 - }, - "endBinding": { - "elementId": "8AGcjcdoixcywjWMmTeH1", - "focus": -0.6290344450336798, - "gap": 3.5 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 22, - 184.5 - ], - [ - 98, - 213.6991235141124 - ] - ] - }, - { - "type": "rectangle", - "version": 773, - "versionNonce": 1160580199, - "isDeleted": false, - "id": "URB7bbh6SUE8RcUtknzNl", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1347.25, - "y": 133.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 180, - "height": 85, - "seed": 971727403, - "groupIds": [], - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "vlAC5PlwMSilztRKwE-xT" - }, - { - "id": "cNz6jhfxmcfpwIBd6pHZP", - "type": "arrow" - } - ], - "updated": 1674058028362, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 821, - "versionNonce": 960860553, - "isDeleted": false, - "id": "vlAC5PlwMSilztRKwE-xT", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1354.75, - "y": 138.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 165, - "height": 75, - "seed": 915630597, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1674058028362, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "check that \nrelease branches\nexist", - "baseline": 68, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "URB7bbh6SUE8RcUtknzNl", - "originalText": "check that release branches exist" - }, - { - "type": "arrow", - "version": 419, - "versionNonce": 819654953, - "isDeleted": false, - "id": "cNz6jhfxmcfpwIBd6pHZP", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1255.759567956762, - "y": 110.625, - "strokeColor": "#000000", - "backgroundColor": "#ced4da", - "width": 89.47953708921273, - "height": 66.55815610690104, - "seed": 1886816811, - "groupIds": [], - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1674058042767, - "link": null, - "locked": false, - "startBinding": { - "elementId": "Yg86MWwaRqhHfdBFC2_tW", - "focus": 0.6783953534561207, - "gap": 4 - }, - "endBinding": { - "elementId": "URB7bbh6SUE8RcUtknzNl", - "focus": -0.18900095479844434, - "gap": 2.0108949540251615 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 19.211762114864314, - 60.02390020946717 - ], - [ - 89.47953708921273, - 66.55815610690104 - ] - ] - }, - { - "type": "rectangle", - "version": 668, - "versionNonce": 1494732297, - "isDeleted": false, - "id": "WLJqjd-AQy0ypnOE2xlgt", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1352.25, - "y": 246.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 181, - "height": 147, - "seed": 1673034597, - "groupIds": [], - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "Ppy6axBNWEP2hQnZclpyQ" - }, - { - "id": "3P4N3Me5FAlWrx-VC24zQ", - "type": "arrow" - } - ], - "updated": 1674058044619, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 824, - "versionNonce": 1314618281, - "isDeleted": false, - "id": "Ppy6axBNWEP2hQnZclpyQ", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1376.25, - "y": 270.125, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 133, - "height": 100, - "seed": 782965099, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1674058133641, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "change code: \ncargo.toml\nchangelog\netc.", - "baseline": 93, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "WLJqjd-AQy0ypnOE2xlgt", - "originalText": "change code: cargo.toml\nchangelog\netc." - }, - { - "type": "arrow", - "version": 338, - "versionNonce": 422976521, - "isDeleted": false, - "id": "3P4N3Me5FAlWrx-VC24zQ", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1258.25, - "y": 112.125, - "strokeColor": "#000000", - "backgroundColor": "#ced4da", - "width": 89.82571955961703, - "height": 283.18088750516995, - "seed": 2139159243, - "groupIds": [], - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1674058048728, - "link": null, - "locked": false, - "startBinding": { - "elementId": "Yg86MWwaRqhHfdBFC2_tW", - "focus": 0.6230757506477671, - "gap": 5.5 - }, - "endBinding": { - "elementId": "WLJqjd-AQy0ypnOE2xlgt", - "focus": -1.0320045177197148, - "gap": 4.174280440382972 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 10.5, - 241.5 - ], - [ - 89.82571955961703, - 283.18088750516995 - ] - ] - }, - { - "type": "rectangle", - "version": 729, - "versionNonce": 2029765417, - "isDeleted": false, - "id": "_DU15Pz79s3gCl4eG8HZl", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1352.75, - "y": 438.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 182, - "height": 85, - "seed": 345184581, - "groupIds": [], - "roundness": null, - "boundElements": [ - { - "type": "text", - "id": "tHZlVBR3YKMuTsnXNe2mJ" - }, - { - "id": "yGMeoGKVjXYnj6QbteXta", - "type": "arrow" - } - ], - "updated": 1674058063383, - "link": null, - "locked": false - }, - { - "type": "text", - "version": 836, - "versionNonce": 2012487655, - "isDeleted": false, - "id": "tHZlVBR3YKMuTsnXNe2mJ", - "fillStyle": "hachure", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1373.25, - "y": 443.625, - "strokeColor": "#000000", - "backgroundColor": "transparent", - "width": 141, - "height": 75, - "seed": 79284619, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1674058063383, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "(push commits)\n(push tags)\n(cleanup)", - "baseline": 68, - "textAlign": "center", - "verticalAlign": "middle", - "containerId": "_DU15Pz79s3gCl4eG8HZl", - "originalText": "(push commits)\n(push tags)\n(cleanup)" - }, - { - "type": "arrow", - "version": 478, - "versionNonce": 1221293577, - "isDeleted": false, - "id": "yGMeoGKVjXYnj6QbteXta", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 1258.25, - "y": 114.125, - "strokeColor": "#000000", - "backgroundColor": "#ced4da", - "width": 93.10589456033449, - "height": 368.13334741049476, - "seed": 1420808389, - "groupIds": [], - "roundness": { - "type": 2 - }, - "boundElements": [], - "updated": 1674058063384, - "link": null, - "locked": false, - "startBinding": { - "elementId": "Yg86MWwaRqhHfdBFC2_tW", - "focus": 0.6270559380023909, - "gap": 7.5 - }, - "endBinding": { - "elementId": "_DU15Pz79s3gCl4eG8HZl", - "focus": -0.49354998911607356, - "gap": 1.394105439665509 - }, - "lastCommittedPoint": null, - "startArrowhead": null, - "endArrowhead": "arrow", - "points": [ - [ - 0, - 0 - ], - [ - 21, - 338 - ], - [ - 93.10589456033449, - 368.13334741049476 - ] - ] - }, - { - "type": "text", - "version": 137, - "versionNonce": 14679592, - "isDeleted": false, - "id": "9mW4VLdLPdhUHgxd4DCGV", - "fillStyle": "solid", - "strokeWidth": 1, - "strokeStyle": "solid", - "roughness": 1, - "opacity": 100, - "angle": 0, - "x": 888.25, - "y": -108.375, - "strokeColor": "#0b7285", - "backgroundColor": "transparent", - "width": 556, - "height": 25, - "seed": 1724444069, - "groupIds": [], - "roundness": null, - "boundElements": [], - "updated": 1670401156354, - "link": null, - "locked": false, - "fontSize": 20, - "fontFamily": 1, - "text": "stackable-utils: release process using Release Branches", - "baseline": 18, - "textAlign": "left", - "verticalAlign": "top", - "containerId": null, - "originalText": "stackable-utils: release process using Release Branches" - } - ], - "appState": { - "gridSize": null, - "viewBackgroundColor": "#ffffff" - }, - "files": {} -} \ No newline at end of file diff --git a/release/images/rb-utils.png b/release/images/rb-utils.png deleted file mode 100644 index 042f89f..0000000 Binary files a/release/images/rb-utils.png and /dev/null differ diff --git a/release/images/rc-flow.excalidraw b/release/images/rc-flow.excalidraw new file mode 100644 index 0000000..d06e725 --- /dev/null +++ b/release/images/rc-flow.excalidraw @@ -0,0 +1,1369 @@ +{ + "type": "excalidraw", + "version": 2, + "source": "https://excalidraw.com", + "elements": [ + { + "id": "ueRAsSgcxBD2U9E4njw4J", + "type": "rectangle", + "x": 412, + "y": 293, + "width": 181, + "height": 69, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a0", + "roundness": { + "type": 3 + }, + "seed": 697473726, + "version": 46, + "versionNonce": 1328660514, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "HjdinlBfTBYPfHZdMVP3C" + }, + { + "id": "0OSV1hwzz_t2d_H-TG4Vm", + "type": "arrow" + }, + { + "id": "9HCwMj7uuoVtHPNvvSt-y", + "type": "arrow" + }, + { + "id": "fGVH4rPDreWHBQ9yibKFr", + "type": "arrow" + } + ], + "updated": 1733388530996, + "link": null, + "locked": false + }, + { + "id": "HjdinlBfTBYPfHZdMVP3C", + "type": "text", + "x": 482.1700134277344, + "y": 315, + "width": 40.65997314453125, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a1", + "roundness": null, + "seed": 918945918, + "version": 6, + "versionNonce": 605489662, + "isDeleted": false, + "boundElements": [], + "updated": 1733388385740, + "link": null, + "locked": false, + "text": "main", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "ueRAsSgcxBD2U9E4njw4J", + "originalText": "main", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "i-kpxRU8QMRhzVKS3iMIT", + "type": "rectangle", + "x": 672.5, + "y": 292.5, + "width": 181, + "height": 69, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a2", + "roundness": { + "type": 3 + }, + "seed": 1192958718, + "version": 89, + "versionNonce": 1035641598, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "iXK-TTeraAuN0fkChofRw" + }, + { + "id": "0OSV1hwzz_t2d_H-TG4Vm", + "type": "arrow" + }, + { + "id": "9HCwMj7uuoVtHPNvvSt-y", + "type": "arrow" + }, + { + "id": "GJFgcLyca-hK4JpfhVQti", + "type": "arrow" + } + ], + "updated": 1733388512101, + "link": null, + "locked": false + }, + { + "id": "iXK-TTeraAuN0fkChofRw", + "type": "text", + "x": 701.2900619506836, + "y": 314.5, + "width": 123.41987609863281, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a3", + "roundness": null, + "seed": 1966803774, + "version": 62, + "versionNonce": 1987611518, + "isDeleted": false, + "boundElements": [], + "updated": 1733388396171, + "link": null, + "locked": false, + "text": "release-24.11", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "i-kpxRU8QMRhzVKS3iMIT", + "originalText": "release-24.11", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "vXPph5Mv7WTvlIB3dLfO-", + "type": "diamond", + "x": 628, + "y": 348, + "width": 134, + "height": 60, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a4", + "roundness": { + "type": 2 + }, + "seed": 1418609662, + "version": 312, + "versionNonce": 516855010, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "dKwtLzhW0vl_tVS26dDJy" + } + ], + "updated": 1733388434402, + "link": null, + "locked": false + }, + { + "id": "dKwtLzhW0vl_tVS26dDJy", + "type": "text", + "x": 668.1919479370117, + "y": 368, + "width": 53.61610412597656, + "height": 20, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a5", + "roundness": null, + "seed": 1437861566, + "version": 166, + "versionNonce": 195930274, + "isDeleted": false, + "boundElements": [], + "updated": 1733388434402, + "link": null, + "locked": false, + "text": "24.11.0", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "vXPph5Mv7WTvlIB3dLfO-", + "originalText": "24.11.0", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0OSV1hwzz_t2d_H-TG4Vm", + "type": "arrow", + "x": 597, + "y": 329, + "width": 73, + "height": 2, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a6", + "roundness": { + "type": 2 + }, + "seed": 1181837346, + "version": 47, + "versionNonce": 358808930, + "isDeleted": false, + "boundElements": [], + "updated": 1733388445770, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 73, + -2 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "ueRAsSgcxBD2U9E4njw4J", + "focus": 0.1105760325986294, + "gap": 4, + "fixedPoint": null + }, + "endBinding": { + "elementId": "i-kpxRU8QMRhzVKS3iMIT", + "focus": 0.0689016484534173, + "gap": 2.5, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "FT092lrkUUcL6fLKGgqPY", + "type": "rectangle", + "x": 896.5, + "y": 417.5, + "width": 181, + "height": 69, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a7", + "roundness": { + "type": 3 + }, + "seed": 331915426, + "version": 248, + "versionNonce": 2015232510, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "ODGsQkVhn-MDb5GFdNbgJ" + }, + { + "id": "GJFgcLyca-hK4JpfhVQti", + "type": "arrow" + }, + { + "id": "fGVH4rPDreWHBQ9yibKFr", + "type": "arrow" + }, + { + "id": "aWjnC2x81_r2lHWOUaHRi", + "type": "arrow" + } + ], + "updated": 1733388574405, + "link": null, + "locked": false + }, + { + "id": "ODGsQkVhn-MDb5GFdNbgJ", + "type": "text", + "x": 924.7200698852539, + "y": 439.5, + "width": 124.55986022949219, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a8", + "roundness": null, + "seed": 888159330, + "version": 235, + "versionNonce": 1609925118, + "isDeleted": false, + "boundElements": [], + "updated": 1733388500775, + "link": null, + "locked": false, + "text": "pr-24.11.1-rc1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "FT092lrkUUcL6fLKGgqPY", + "originalText": "pr-24.11.1-rc1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "9HCwMj7uuoVtHPNvvSt-y", + "type": "arrow", + "x": 517, + "y": 291, + "width": 246, + "height": 124, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "a9", + "roundness": { + "type": 2 + }, + "seed": 512675774, + "version": 105, + "versionNonce": 938451902, + "isDeleted": false, + "boundElements": [], + "updated": 1733388494526, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 122, + -124 + ], + [ + 246, + -2 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "ueRAsSgcxBD2U9E4njw4J", + "focus": -0.17205625040502884, + "gap": 2, + "fixedPoint": null + }, + "endBinding": { + "elementId": "i-kpxRU8QMRhzVKS3iMIT", + "focus": 0.3075918793654938, + "gap": 3.5, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "GJFgcLyca-hK4JpfhVQti", + "type": "arrow", + "x": 805.9478176213802, + "y": 289.4582571846131, + "width": 195, + "height": 242, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aA", + "roundness": { + "type": 2 + }, + "seed": 270259298, + "version": 294, + "versionNonce": 904055422, + "isDeleted": false, + "boundElements": [], + "updated": 1733388519389, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 103, + -118 + ], + [ + 195, + 124 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "i-kpxRU8QMRhzVKS3iMIT", + "focus": 0.08438735073514919, + "gap": 3.041742815386897, + "fixedPoint": null + }, + "endBinding": { + "elementId": "FT092lrkUUcL6fLKGgqPY", + "focus": 0.2760204268550189, + "gap": 4.041742815386897, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "fGVH4rPDreWHBQ9yibKFr", + "type": "arrow", + "x": 504, + "y": 368, + "width": 390, + "height": 86, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aB", + "roundness": { + "type": 2 + }, + "seed": 2142552830, + "version": 130, + "versionNonce": 1148947042, + "isDeleted": false, + "boundElements": [], + "updated": 1733388536381, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 76, + 78 + ], + [ + 390, + 86 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "ueRAsSgcxBD2U9E4njw4J", + "focus": 0.3058568329718004, + "gap": 6, + "fixedPoint": null + }, + "endBinding": { + "elementId": "FT092lrkUUcL6fLKGgqPY", + "focus": -0.11871592973955174, + "gap": 2.5, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "Aiq5uTb1TuSEEhuE-7WxH", + "type": "rectangle", + "x": 894.5, + "y": 535.5, + "width": 181, + "height": 69, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aC", + "roundness": { + "type": 3 + }, + "seed": 1060130210, + "version": 300, + "versionNonce": 1074869858, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "0LQ8LpT9TtR_sb6-hiRL6" + }, + { + "id": "aWjnC2x81_r2lHWOUaHRi", + "type": "arrow" + }, + { + "id": "ZVS0gV5ls8-jHRQRRr2eK", + "type": "arrow" + } + ], + "updated": 1733388604318, + "link": null, + "locked": false + }, + { + "id": "0LQ8LpT9TtR_sb6-hiRL6", + "type": "text", + "x": 922.7200698852539, + "y": 557.5, + "width": 124.55986022949219, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aD", + "roundness": null, + "seed": 1356482914, + "version": 286, + "versionNonce": 175816930, + "isDeleted": false, + "boundElements": [], + "updated": 1733388548100, + "link": null, + "locked": false, + "text": "pr-24.11.1-rc1", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "Aiq5uTb1TuSEEhuE-7WxH", + "originalText": "pr-24.11.1-rc1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "aWjnC2x81_r2lHWOUaHRi", + "type": "arrow", + "x": 985, + "y": 488, + "width": 1, + "height": 49, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aF", + "roundness": { + "type": 2 + }, + "seed": 649731490, + "version": 36, + "versionNonce": 1934168638, + "isDeleted": false, + "boundElements": [], + "updated": 1733388574405, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 1, + 49 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "FT092lrkUUcL6fLKGgqPY", + "focus": 0.029984336540613114, + "gap": 1.5, + "fixedPoint": null + }, + "endBinding": { + "elementId": "Aiq5uTb1TuSEEhuE-7WxH", + "focus": 0.01834862385321101, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "R22N1T0qSyvX6McqR-e2I", + "type": "rectangle", + "x": 670.5, + "y": 534.5, + "width": 181, + "height": 69, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aG", + "roundness": { + "type": 3 + }, + "seed": 1785485218, + "version": 144, + "versionNonce": 169641442, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "d3_6ejB0l9hwCgFEF-cXi" + }, + { + "id": "ZVS0gV5ls8-jHRQRRr2eK", + "type": "arrow" + } + ], + "updated": 1733388604318, + "link": null, + "locked": false + }, + { + "id": "d3_6ejB0l9hwCgFEF-cXi", + "type": "text", + "x": 699.2900619506836, + "y": 556.5, + "width": 123.41987609863281, + "height": 25, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aH", + "roundness": null, + "seed": 201659234, + "version": 116, + "versionNonce": 889846114, + "isDeleted": false, + "boundElements": [], + "updated": 1733388596923, + "link": null, + "locked": false, + "text": "release-24.11", + "fontSize": 20, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "R22N1T0qSyvX6McqR-e2I", + "originalText": "release-24.11", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ZVS0gV5ls8-jHRQRRr2eK", + "type": "arrow", + "x": 890, + "y": 566, + "width": 42, + "height": 1, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aI", + "roundness": { + "type": 2 + }, + "seed": 1946192098, + "version": 20, + "versionNonce": 1464985982, + "isDeleted": false, + "boundElements": [], + "updated": 1733388605447, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + -42, + 1 + ] + ], + "lastCommittedPoint": null, + "startBinding": { + "elementId": "Aiq5uTb1TuSEEhuE-7WxH", + "focus": 0.1708346865865541, + "gap": 4.5, + "fixedPoint": null + }, + "endBinding": { + "elementId": "R22N1T0qSyvX6McqR-e2I", + "focus": 0.001948684637869438, + "gap": 1, + "fixedPoint": null + }, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "cBE6J75m32z06NweP2RBN", + "type": "diamond", + "x": 564.9999999999999, + "y": 583, + "width": 182.00000000000009, + "height": 60, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aJ", + "roundness": { + "type": 2 + }, + "seed": 1130535074, + "version": 693, + "versionNonce": 1350184994, + "isDeleted": false, + "boundElements": [ + { + "type": "text", + "id": "dstqYMYHEx-q5k_fpzTgg" + } + ], + "updated": 1733399562292, + "link": null, + "locked": false + }, + { + "id": "dstqYMYHEx-q5k_fpzTgg", + "type": "text", + "x": 617.055923461914, + "y": 603, + "width": 77.88815307617188, + "height": 20, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aK", + "roundness": null, + "seed": 1317745762, + "version": 377, + "versionNonce": 331602914, + "isDeleted": false, + "boundElements": [], + "updated": 1733399562292, + "link": null, + "locked": false, + "text": "24.11.1-rc1", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "center", + "verticalAlign": "middle", + "containerId": "cBE6J75m32z06NweP2RBN", + "originalText": "24.11.1-rc1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "ZRUnMK4hQLe11j4uInxPB", + "type": "text", + "x": 538, + "y": 136, + "width": 188.03233337402344, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aL", + "roundness": null, + "seed": 684968510, + "version": 49, + "versionNonce": 764157630, + "isDeleted": false, + "boundElements": [], + "updated": 1733388637843, + "link": null, + "locked": false, + "text": "create-release-branch.sh", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "create-release-branch.sh", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "0FDyfhBK0GJUk9_RY1mHl", + "type": "text", + "x": 796.9838333129883, + "y": 139, + "width": 270.2244873046875, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aM", + "roundness": null, + "seed": 583061346, + "version": 138, + "versionNonce": 72459902, + "isDeleted": false, + "boundElements": [], + "updated": 1733399520428, + "link": null, + "locked": false, + "text": "create-release-candidate-branch.sh", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "create-release-candidate-branch.sh", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "02coYgnhJ0N8NGlIcNh1w", + "type": "text", + "x": 824.2958297729492, + "y": 619, + "width": 263.24847412109375, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aN", + "roundness": null, + "seed": 1218559330, + "version": 221, + "versionNonce": 1720677467, + "isDeleted": false, + "boundElements": [], + "updated": 1733503628081, + "link": null, + "locked": false, + "text": "merge-release-candidate.sh", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "merge-release-candidate.sh", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "chPoJByD4MvRKQAhl9r4e", + "type": "arrow", + "x": 331, + "y": 502, + "width": 75, + "height": 1, + "angle": 0, + "strokeColor": "#2f9e44", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aO", + "roundness": { + "type": 2 + }, + "seed": 1794964030, + "version": 32, + "versionNonce": 1054676258, + "isDeleted": false, + "boundElements": [], + "updated": 1733388836748, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 75, + -1 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "-NJAPvAgTNf4aGcZyDy9u", + "type": "arrow", + "x": 332.3261479593814, + "y": 535.2871276202148, + "width": 75, + "height": 1, + "angle": 0, + "strokeColor": "#e03131", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aQ", + "roundness": { + "type": 2 + }, + "seed": 1440200674, + "version": 91, + "versionNonce": 1523996222, + "isDeleted": false, + "boundElements": [], + "updated": 1733388838931, + "link": null, + "locked": false, + "points": [ + [ + 0, + 0 + ], + [ + 75, + -1 + ] + ], + "lastCommittedPoint": null, + "startBinding": null, + "endBinding": null, + "startArrowhead": null, + "endArrowhead": "arrow", + "elbowed": false + }, + { + "id": "1Bc4ksfLy4B-DOnLJX-YB", + "type": "text", + "x": 425, + "y": 491, + "width": 114.32821655273438, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aR", + "roundness": null, + "seed": 1013767806, + "version": 25, + "versionNonce": 1007753698, + "isDeleted": false, + "boundElements": [], + "updated": 1733388854995, + "link": null, + "locked": false, + "text": "stackable-utils", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "stackable-utils", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Lr_8TKdHSC_Hv4LbVUfHi", + "type": "text", + "x": 422.8358917236328, + "y": 527, + "width": 49.8240966796875, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aS", + "roundness": null, + "seed": 857311586, + "version": 67, + "versionNonce": 1912653886, + "isDeleted": false, + "boundElements": [], + "updated": 1733388863335, + "link": null, + "locked": false, + "text": "manual", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "manual", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "BwdT5nn6qqEgXupPxSqpD", + "type": "text", + "x": 1097, + "y": 429, + "width": 271.728515625, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aT", + "roundness": null, + "seed": 1164941858, + "version": 93, + "versionNonce": 2144549429, + "isDeleted": false, + "boundElements": [], + "updated": 1733503625228, + "link": null, + "locked": false, + "text": "operators images: 24.11.1-rc1-pr456\n(docker images: 24.11.1-rc1prXXX?)", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "operators images: 24.11.1-rc1-pr456\n(docker images: 24.11.1-rc1prXXX?)", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "Ow0_n_DuF5g3juyPXU4jO", + "type": "text", + "x": 607.9637832641602, + "y": 658, + "width": 220.4804229736328, + "height": 40, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aU", + "roundness": null, + "seed": 2111108322, + "version": 172, + "versionNonce": 443635579, + "isDeleted": false, + "boundElements": [], + "updated": 1733503644696, + "link": null, + "locked": false, + "text": "operators images: 24.11.1-rc1\ndocker images: 24.11.1-rc1", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "operators images: 24.11.1-rc1\ndocker images: 24.11.1-rc1", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "KXJ5THcogc5dRLS_gCAnL", + "type": "text", + "x": 351.32466791644697, + "y": 628, + "width": 247.56846618652344, + "height": 20, + "angle": 0, + "strokeColor": "#1971c2", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aV", + "roundness": null, + "seed": 2023512475, + "version": 288, + "versionNonce": 1684741237, + "isDeleted": false, + "boundElements": [], + "updated": 1733503642511, + "link": null, + "locked": false, + "text": "tag-release-candidate.sh", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "tag-release-candidate.sh", + "autoResize": true, + "lineHeight": 1.25 + }, + { + "id": "gnQU4dFtqgcesv8IlFWZq", + "type": "diamond", + "x": 330.94890497699373, + "y": 553, + "width": 51.0000000000001, + "height": 31.000000000000018, + "angle": 0, + "strokeColor": "#f08c00", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "solid", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aW", + "roundness": { + "type": 2 + }, + "seed": 680276437, + "version": 809, + "versionNonce": 1206969147, + "isDeleted": false, + "boundElements": [], + "updated": 1733503679475, + "link": null, + "locked": false + }, + { + "id": "kRq8pLfhwKexssXpC2mh2", + "type": "text", + "x": 425.0368566371501, + "y": 560, + "width": 27.064041137695312, + "height": 20, + "angle": 0, + "strokeColor": "#1e1e1e", + "backgroundColor": "transparent", + "fillStyle": "solid", + "strokeWidth": 2, + "strokeStyle": "dashed", + "roughness": 1, + "opacity": 100, + "groupIds": [], + "frameId": null, + "index": "aY", + "roundness": null, + "seed": 1092995355, + "version": 87, + "versionNonce": 760393109, + "isDeleted": false, + "boundElements": [], + "updated": 1733503688126, + "link": null, + "locked": false, + "text": "tag", + "fontSize": 16, + "fontFamily": 5, + "textAlign": "left", + "verticalAlign": "top", + "containerId": null, + "originalText": "tag", + "autoResize": true, + "lineHeight": 1.25 + } + ], + "appState": { + "gridSize": 20, + "gridStep": 5, + "gridModeEnabled": false, + "viewBackgroundColor": "#ffffff" + }, + "files": {} +} \ No newline at end of file diff --git a/release/images/rc-flow.png b/release/images/rc-flow.png new file mode 100644 index 0000000..295ac39 Binary files /dev/null and b/release/images/rc-flow.png differ diff --git a/release/merge-release-candidate.sh b/release/merge-release-candidate.sh new file mode 100755 index 0000000..ca34342 --- /dev/null +++ b/release/merge-release-candidate.sh @@ -0,0 +1,126 @@ +#!/usr/bin/env bash +# +# See README.md +# +set -euo pipefail +set -x + +parse_inputs() { + RELEASE_TAG="" + PUSH=false + PR_BRANCH="" + WHAT="" + + while [[ "$#" -gt 0 ]]; do + case $1 in + -t | --tag) + RELEASE_TAG="$2" + shift + ;; + -w | --what) + WHAT="$2" + shift + ;; + -p | --push) PUSH=true ;; + *) + >&2 echo "Unknown parameter passed: $1" + exit 1 + ;; + esac + shift + done + + # remove leading and trailing quotes + RELEASE_TAG="${RELEASE_TAG%\"}" + RELEASE_TAG="${RELEASE_TAG#\"}" + # N.B. this has to match what is used in other scripts + PR_BRANCH="pr-$RELEASE_TAG" + + INITIAL_DIR="$PWD" + DOCKER_IMAGES_REPO=$(yq '... comments="" | .images-repo ' "$INITIAL_DIR"/release/config.yaml) + + echo "Settings: ${PR_BRANCH}: Push: $PUSH:" +} + +merge_operators() { + while IFS="" read -r operator || [ -n "$operator" ]; do + echo "Operator: $operator" + STATE=$(gh pr view "${PR_BRANCH}" -R stackabletech/"${operator}" --jq '.state' --json state) + if [[ "$STATE" == "OPEN" ]]; then + echo "Processing ${operator} in branch ${PR_BRANCH} with state ${STATE}" + if $PUSH; then + echo "Reviewing and merging..." + gh pr review "${PR_BRANCH}" --approve -R stackabletech/"${operator}" + gh pr merge "${PR_BRANCH}" --delete-branch --squash -R stackabletech/"${operator}" + else + echo "(Dry-run: not reviewing/merging...)" + fi + else + echo "Skipping ${operator}, PR already closed" + fi + done < <(yq '... comments="" | .operators[] ' "$INITIAL_DIR"/release/config.yaml) +} + +merge_products() { + echo "Products: $DOCKER_IMAGES_REPO" + STATE=$(gh pr view "${PR_BRANCH}" -R stackabletech/"${DOCKER_IMAGES_REPO}" --jq '.state' --json state) + if [[ "$STATE" == "OPEN" ]]; then + echo "Processing ${DOCKER_IMAGES_REPO} in branch ${PR_BRANCH} with state ${STATE}" + if $PUSH; then + echo "Reviewing and merging..." + gh pr review "${PR_BRANCH}" --approve -R stackabletech/"${DOCKER_IMAGES_REPO}" + gh pr merge "${PR_BRANCH}" --delete-branch --squash -R stackabletech/"${DOCKER_IMAGES_REPO}" + else + echo "(Dry-run: not reviewing/merging...)" + fi + else + echo "Skipping ${DOCKER_IMAGES_REPO}, PR already closed" + fi +} + +merge() { + if [ "products" == "$WHAT" ] || [ "all" == "$WHAT" ]; then + merge_products + fi + if [ "operators" == "$WHAT" ] || [ "all" == "$WHAT" ]; then + merge_operators + fi +} + +check_dependencies() { + # check for a globally configured git user + git_user=$(git config --global --get user.name) + git_email=$(git config --global --get user.email) + echo "global git user: $git_user <$git_email>" + + if [ -z "$git_user" ] || [ -z "$git_email" ]; then + >&2 echo "Error: global git user name/email is not set." + exit 1 + else + echo "Is this correct? (y/n)" + read -r response + if [[ "$response" == "y" || "$response" == "Y" ]]; then + echo "Proceeding with $git_user <$git_email>" + else + >&2 echo "User not accepted. Exiting." + exit 1 + fi + fi + # check gh authentication: if this fails you will need to e.g. gh auth login + gh auth status +} + +main() { + parse_inputs "$@" + + # check if tag argument provided + if [ -z "${RELEASE_TAG}" ]; then + >&2 echo "Usage: create-release-merge-and-tag.sh -t [-w products|operators|all]" + exit 1 + fi + + check_dependencies + merge +} + +main "$@" diff --git a/release/post-release.sh b/release/post-release.sh index c4f5153..695d0a0 100755 --- a/release/post-release.sh +++ b/release/post-release.sh @@ -100,7 +100,7 @@ update_operators() { # Maybe push and create pull request if "$PUSH"; then git push -u "$REMOTE" "$CHANGELOG_BRANCH" - gh pr create --fill --reviewer stackable/developers --head "$CHANGELOG_BRANCH" --base main + gh pr create --fill --reviewer stackabletech/developers --head "$CHANGELOG_BRANCH" --base main fi done < <(yq '... comments="" | .operators[] ' "$INITIAL_DIR"/release/config.yaml) } @@ -157,7 +157,7 @@ update_docker_images() { # Maybe push and create pull request if "$PUSH"; then git push -u "$REMOTE" "$CHANGELOG_BRANCH" - gh pr create --fill --reviewer stackable/developers --head "$CHANGELOG_BRANCH" --base main + gh pr create --fill --reviewer stackabletech/developers --head "$CHANGELOG_BRANCH" --base main fi } diff --git a/release/tag-release-candidate.sh b/release/tag-release-candidate.sh new file mode 100755 index 0000000..948eb91 --- /dev/null +++ b/release/tag-release-candidate.sh @@ -0,0 +1,222 @@ +#!/usr/bin/env bash +# +# See README.adoc +# +set -euo pipefail +set -x + +# tags should be semver-compatible e.g. 23.1.1 not 23.01.1 +# this is needed for cargo commands to work properly +# optional release-candidate suffixes are in the form: +# - rc-1, e.g. 23.1.1-rc1, 23.12.1-rc12 etc. +TAG_REGEX="^[0-9][0-9]\.([1-9]|[1][0-2])\.[0-9]+(-rc[0-9]+)?$" +REPOSITORY="origin" + +tag_products() { + # assume that the branch exists and has either been pushed or has been created locally + cd "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" + + # the PR branch should already exist + git switch "$RELEASE_BRANCH" + git tag -sm "release $RELEASE_TAG" "$RELEASE_TAG" + push_branch +} + +tag_operators() { + while IFS="" read -r operator || [ -n "$operator" ]; do + cd "${TEMP_RELEASE_FOLDER}/${operator}" + git switch "$RELEASE_BRANCH" + git tag -sm "release $RELEASE_TAG" "$RELEASE_TAG" + push_branch + done < <(yq '... comments="" | .operators[] ' "$INITIAL_DIR"/release/config.yaml) +} + +tag_repos() { + if [ "products" == "$WHAT" ] || [ "all" == "$WHAT" ]; then + tag_products + fi + if [ "operators" == "$WHAT" ] || [ "all" == "$WHAT" ]; then + tag_operators + fi +} + +check_tag_is_valid() { + git fetch --tags + + # check tags: N.B. look for exact match + TAG_EXISTS=$(git tag --list | grep -E "$RELEASE_TAG$") + if [ -n "$TAG_EXISTS" ]; then + >&2 echo "Tag $RELEASE_TAG already exists!" + exit 1 + fi +} + +check_products() { + if [ ! -d "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" ]; then + echo "Cloning folder: $TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" + # $TEMP_RELEASE_FOLDER has already been created in main() + git clone "git@github.com:stackabletech/${DOCKER_IMAGES_REPO}.git" "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" + fi + cd "$TEMP_RELEASE_FOLDER/$DOCKER_IMAGES_REPO" + + # switch to the release branch, which should exist as tagging + # is subsequent to creating the branch. + BRANCH_EXISTS=$(git branch -a | grep -E "$RELEASE_BRANCH$") + + if [ -z "${BRANCH_EXISTS}" ]; then + >&2 echo "Expected release branch is missing: $RELEASE_BRANCH" + exit 1 + fi + + check_tag_is_valid +} + +check_operators() { + while IFS="" read -r operator || [ -n "$operator" ]; do + echo "Operator: $operator" + if [ ! -d "$TEMP_RELEASE_FOLDER/${operator}" ]; then + echo "Cloning folder: $TEMP_RELEASE_FOLDER/${operator}" + # $TEMP_RELEASE_FOLDER has already been created in main() + git clone "git@github.com:stackabletech/${operator}.git" "$TEMP_RELEASE_FOLDER/${operator}" + + fi + cd "$TEMP_RELEASE_FOLDER/${operator}" + BRANCH_EXISTS=$(git branch -a | grep -E "$RELEASE_BRANCH$") + if [ -z "${BRANCH_EXISTS}" ]; then + >&2 echo "Expected release branch is missing: ${operator}/$RELEASE_BRANCH" + exit 1 + fi + check_tag_is_valid + done < <(yq '... comments="" | .operators[] ' "$INITIAL_DIR"/release/config.yaml) +} + +checks() { + if [ "products" == "$WHAT" ] || [ "all" == "$WHAT" ]; then + check_products + fi + if [ "operators" == "$WHAT" ] || [ "all" == "$WHAT" ]; then + check_operators + fi +} + +push_branch() { + if $PUSH; then + echo "Pushing changes..." + git push "${REPOSITORY}" "${RELEASE_TAG}" + else + echo "(Dry-run: not pushing...)" + git push --dry-run "${REPOSITORY}" "${RELEASE_TAG}" + fi +} + +cleanup() { + if $CLEANUP; then + echo "Cleaning up..." + rm -rf "$TEMP_RELEASE_FOLDER" + fi +} + +parse_inputs() { + RELEASE_TAG="" + PUSH=false + CLEANUP=false + WHAT="" + + while [[ "$#" -gt 0 ]]; do + case $1 in + -t | --tag) + RELEASE_TAG="$2" + shift + ;; + -w | --what) + WHAT="$2" + shift + ;; + -p | --push) PUSH=true ;; + -c | --cleanup) CLEANUP=true ;; + *) + >&2 echo "Unknown parameter passed: $1" + exit 1 + ;; + esac + shift + done + + # remove leading and trailing quotes + RELEASE_TAG="${RELEASE_TAG%\"}" + RELEASE_TAG="${RELEASE_TAG#\"}" + + # for a tag of e.g. 23.1.1, the release branch (already created) will be 23.1 + RELEASE="$(cut -d'.' -f1,2 <<< "$RELEASE_TAG")" + RELEASE_BRANCH="release-$RELEASE" + INITIAL_DIR="$PWD" + DOCKER_IMAGES_REPO=$(yq '... comments="" | .images-repo ' "$INITIAL_DIR"/release/config.yaml) + TEMP_RELEASE_FOLDER="/tmp/stackable-$RELEASE_BRANCH" + + echo "Settings: ${RELEASE_BRANCH}: Push: $PUSH: Cleanup: $CLEANUP" +} + +check_dependencies() { + # check for a globally configured git user + git_user=$(git config --global --get user.name) + git_email=$(git config --global --get user.email) + echo "global git user: $git_user <$git_email>" + + if [ -z "$git_user" ] || [ -z "$git_email" ]; then + >&2 echo "Error: global git user name/email is not set." + exit 1 + else + echo "Is this correct? (y/n)" + read -r response + if [[ "$response" == "y" || "$response" == "Y" ]]; then + echo "Proceeding with $git_user <$git_email>" + else + >&2 echo "User not accepted. Exiting." + exit 1 + fi + fi + + # check gh authentication: if this fails you will need to e.g. gh auth login + gh auth status + yq --version + python --version + cargo --version + cargo set-version --version + # check for jinja2-cli including pyyaml package + jinja2 --version + python -m pip show pyyaml +} + +main() { + parse_inputs "$@" + + # check if tag argument provided + if [ -z "${RELEASE_TAG}" ]; then + >&2 echo "Usage: create-release-candidate-branch.sh -t [-p] [-c] [-w products|operators|all]" + exit 1 + fi + + # check if argument matches our tag regex + if [[ ! $RELEASE_TAG =~ $TAG_REGEX ]]; then + >&2 echo "Provided tag [$RELEASE_TAG] does not match the required tag regex pattern [$TAG_REGEX]" + exit 1 + fi + + if [ ! -d "$TEMP_RELEASE_FOLDER" ]; then + echo "Creating folder for cloning docker images and operators: [$TEMP_RELEASE_FOLDER]" + mkdir -p "$TEMP_RELEASE_FOLDER" + fi + + check_dependencies + + # sanity checks before we start: folder, branches etc. + # deactivate -e so that piped commands can be used + set +e + checks + set -e + + tag_repos + cleanup +} + +main "$@"