You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@flink.apache.org by ch...@apache.org on 2022/11/10 12:22:59 UTC

[flink-connector-shared-utils] branch release_utils updated: [FLINK-29472] Add first version of release scripts

This is an automated email from the ASF dual-hosted git repository.

chesnay pushed a commit to branch release_utils
in repository https://gitbox.apache.org/repos/asf/flink-connector-shared-utils.git


The following commit(s) were added to refs/heads/release_utils by this push:
     new 606d8b8  [FLINK-29472] Add first version of release scripts
606d8b8 is described below

commit 606d8b8c56c3aa77e2262b25107c5f911d0ce2ac
Author: Chesnay Schepler <ch...@apache.org>
AuthorDate: Thu Nov 10 13:22:54 2022 +0100

    [FLINK-29472] Add first version of release scripts
---
 README.md                       | 92 +++++++++++++++++++++++++++++++++++++-
 _init.sh                        | 48 ++++++++++++++++++++
 _utils.sh                       | 68 +++++++++++++++++++++++++++++
 check_environment.sh            | 67 ++++++++++++++++++++++++++++
 release_git_tag.sh              | 50 +++++++++++++++++++++
 release_snapshot_branch.sh      | 36 +++++++++++++++
 release_source_release.sh       | 35 +++++++++++++++
 stage_jars.sh                   | 57 ++++++++++++++++++++++++
 stage_source_release.sh         | 85 ++++++++++++++++++++++++++++++++++++
 update_branch_version.sh        | 41 +++++++++++++++++
 update_japicmp_configuration.sh | 97 +++++++++++++++++++++++++++++++++++++++++
 11 files changed, 675 insertions(+), 1 deletion(-)

diff --git a/README.md b/README.md
index 3b65ae7..e4571d7 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,91 @@
-This repository contains utilities for [Apache Flink](https://flink.apache.org/) connectors.
\ No newline at end of file
+This is a collection of release utils for [Apache Flink](https://flink.apache.org/) connectors.
+
+# Integration
+
+The scripts assume that they are integrated into a connector repo as a submodule into the connector repo
+under `tools/releasing/shared`.
+
+# Usage
+
+Some scripts rely on environment variables to be set.  
+These are checked at the start of each script.  
+Any instance of `${some_variable}` in this document refers to an environment variable that is used by the respective
+script.
+
+## check_environment.sh
+
+Runs some pre-release checks for the current environment, for example that all required programs are available.  
+This should be run once at the start of the release process.
+
+## publish_snapshot_branch.sh
+
+Creates (and pushes!) a new snapshot branch for the current commit.  
+The branch name is automatically determined from the version in the pom.  
+This script should be called when work on a new major/minor version of the connector has started.
+
+## update_branch_version.sh
+
+Updates the version in the poms of the current branch to `${NEW_VERSION}`.
+
+## stage_source_release.sh
+
+Creates a source release from the current branch and pushes it via `svn`
+to [dist.apache.org](https://dist.apache.org/repos/dist/dev/flink).  
+The version is automatically determined from the version in the pom.  
+The created `svn` directory will contain a `-rc${RC_NUM}` suffix.
+
+## stage_jars.sh
+
+Creates the jars from the current branch and deploys them to [repository.apache.org](https://repository.apache.org).  
+The version will be suffixed with `-${FLINK_MINOR_VERSION}` to indicate the supported Flink version.  
+If a particular version of a connector supports multiple Flink versions then this script should be called multiple
+times.
+
+## release_source_release.sh
+
+Copies the source release from the [SVN release directory](https://dist.apache.org/repops/dist/dev/flink) to the
+[SVN release directory](https://dist.apache.org/repops/dist/release/flink) on [dist.apache.org](https://dist.apache.org).
+
+For safety purposes this script does not automatically determine the project and version from the current directory/branch/tag.
+
+```
+PROJECT=flink-connector-elasticsearch VERSION=3.0.0 RC_NUM=2 ./release_source_release.sh
+```
+
+## publish_git_tag.sh
+
+Creates a release tag for the current branch and pushes it to GitHub.
+The tag will be suffixed with `-rc${RC_NUM}`, if `${RC_NUM}` was set.  
+This script should only be used _after_ the `-SNAPSHOT` version suffix was removd via `update_branch_version.sh`.
+
+## update_japicmp_configuration.sh
+
+Sets the japicmp reference version in the pom of the current branch to `${NEW_VERSION}`, enables compatibility checks
+for `@PublicEvolving` when used on snapshot branches an clears the list of exclusions.  
+This should be called after a release on the associated snapshot branch. If it was a minor release it should
+additionally be called on the `main` branch.
+
+# Common workflow
+
+1. run `release_snapshot_branch.sh`
+2. do some development work on the created snapshot branch
+3. checkout a specific commit to create a release from
+4. run `check_environment.sh`
+5. run `update_branch_version.sh`
+6. run `stage_source_release.sh`
+7. run `stage_jars.sh` (once for each supported Flink version)
+8. run `release_git_tag.sh` (with `RC_NUM`)
+9. vote on release
+10. finalize release or cancel and go back to step 2
+11. run `release_source_release.sh`
+12. run `release_git_tag.sh` (without `RC_NUM`)
+13. run `update_japicmp_configuration.sh` (on snapshot branch, and maybe `main`)
+
+# Script naming conventions
+
+| Prefix  | Meaning                                                                |
+|---------|------------------------------------------------------------------------|
+| check   | Verifies conditions without making any changes.                        |
+| update  | Applies modifications locally to the current branch.                   |
+| stage   | Publishes an artifact to an intermediate location for voting purposes. |
+| release | Publishes an artifact to a user-facing location.                       |
\ No newline at end of file
diff --git a/_init.sh b/_init.sh
new file mode 100644
index 0000000..35b3111
--- /dev/null
+++ b/_init.sh
@@ -0,0 +1,48 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# all scripts should contain this line + source ${SCRIPT_DIR}/_init.sh
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+
+set -o errexit
+set -o nounset
+set -o pipefail
+
+export SHELLOPTS
+
+###########################
+
+MVN=${MVN:-mvn}
+
+if [ "$(uname)" == "Darwin" ]; then
+    SHASUM="shasum -a 512"
+else
+    SHASUM="sha512sum"
+fi
+
+REMOTE=${REMOTE:-upstream}
+
+##########################
+
+SOURCE_DIR=$( cd -- "$( dirname -- "${SCRIPT_DIR}/../../../.." )" &> /dev/null && pwd )
+RELEASE_DIR=${SOURCE_DIR}/tools/releasing/release
+ARTIFACTS_DIR=${SOURCE_DIR}/tools/releasing/release/artifacts
+
+SVN_DEV_DIR="https://dist.apache.org/repos/dist/dev/flink"
+SVN_RELEASE_DIR="https://dist.apache.org/repos/dist/release/flink"
\ No newline at end of file
diff --git a/_utils.sh b/_utils.sh
new file mode 100644
index 0000000..b63379a
--- /dev/null
+++ b/_utils.sh
@@ -0,0 +1,68 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+function check_variables_set {
+  any_missing=false
+
+  for variable in "$@"
+  do
+    if [ -z "${!variable:-}" ]; then
+      echo "${variable} was not set."
+      any_missing=true
+    fi
+  done
+
+  if [ ${any_missing} == true ]; then
+    exit 1
+  fi
+}
+
+function create_pristine_source {
+  source_dir=$1
+  release_dir=$2
+
+  clone_dir="${release_dir}/tmp-clone"
+  clean_dir="${release_dir}/tmp-clean-clone"
+  rm -rf ${clone_dir}
+  rm -rf ${clean_dir}
+  # create a temporary git clone to ensure that we have a pristine source release
+  git clone "${source_dir}" "${clone_dir}"
+
+  rsync -a \
+    --exclude ".git" --exclude ".gitignore" --exclude ".gitattributes" --exclude ".gitmodules" --exclude ".github" \
+    --exclude ".idea" --exclude "*.iml" \
+    --exclude ".DS_Store" \
+    --exclude ".asf.yaml" \
+    --exclude "target" --exclude "tools/releasing/shared" \
+    "${clone_dir}/" "${clean_dir}"
+
+  rm -rf "${clone_dir}"
+
+  echo "${clean_dir}"
+}
+
+function get_pom_version {
+  echo $(${MVN} help:evaluate -Dexpression="project.version" -q -DforceStdout)
+}
+
+function set_pom_version {
+  new_version=$1
+
+  ${MVN} org.codehaus.mojo:versions-maven-plugin:2.8.1:set -DnewVersion=${new_version} -DgenerateBackupPoms=false --quiet
+}
\ No newline at end of file
diff --git a/check_environment.sh b/check_environment.sh
new file mode 100755
index 0000000..b2ad38c
--- /dev/null
+++ b/check_environment.sh
@@ -0,0 +1,67 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
+
+source "${SCRIPT_DIR}/_init.sh"
+
+EXIT_CODE=0
+
+function check_program_available {
+  if program=$(command -v ${1}); then
+    printf "\t%-10s%s\n" "${1}" "using ${program}"
+  else
+    printf "\t%-10s%s\n" "${1}" "is not available."
+    EXIT_CODE=1
+  fi
+}
+
+echo "Checking program availability:"
+check_program_available git
+check_program_available tar
+check_program_available rsync
+check_program_available gpg
+check_program_available perl
+check_program_available sed
+check_program_available svn
+check_program_available ${MVN}
+check_program_available ${SHASUM}
+
+function check_git_connectivity {
+  cd "${SOURCE_DIR}"
+  if git ls-remote --exit-code ${REMOTE} &> /dev/null; then
+    printf "\tUsing git remote '${REMOTE}'.\n"
+  else
+    printf "\tGit remote '${REMOTE}' is not available.\n"
+    printf "\tRun 'git remote add upstream https://github.com/apache/<repo>' or set a custom remote with the 'REMOTE' env variable.\n"
+    exit 1
+  fi
+}
+
+echo "Checking git remote availability:"
+if ! (check_git_connectivity); then
+  EXIT_CODE=1
+fi
+
+if [ ${EXIT_CODE} == 0 ]; then
+  echo "All set! :)"
+else
+  echo "At least one problem was found!"
+fi
+exit ${EXIT_CODE}
diff --git a/release_git_tag.sh b/release_git_tag.sh
new file mode 100755
index 0000000..6418282
--- /dev/null
+++ b/release_git_tag.sh
@@ -0,0 +1,50 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
+
+source ${SCRIPT_DIR}/_init.sh
+source ${SCRIPT_DIR}/_utils.sh
+
+###########################
+
+RC_NUM=${RC_NUM:-none}
+
+###########################
+
+function create_release_tag {
+  cd "${SOURCE_DIR}"
+
+  version=$(get_pom_version)
+  if [[ ${version} =~ -SNAPSHOT$ ]]; then
+    echo "Tags should not be created for SNAPSHOT versions. Use 'update_branch_version.sh' first."
+    exit 1
+  fi
+
+  tag=v${version}
+  if [ "$RC_NUM" != "none" ]; then
+    tag=${tag}-rc${RC_NUM}
+  fi
+
+  git tag -s -m "v${tag}" ${tag}
+
+  git push ${REMOTE} ${tag}
+}
+
+(create_release_tag)
diff --git a/release_snapshot_branch.sh b/release_snapshot_branch.sh
new file mode 100755
index 0000000..5a4d274
--- /dev/null
+++ b/release_snapshot_branch.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
+
+source "${SCRIPT_DIR}/_init.sh"
+
+###########################
+
+function create_snapshot_branch {
+  cd "${SOURCE_DIR}"
+
+  version=$(mvn help:evaluate -Dexpression="project.version" -q -DforceStdout | sed "s/-SNAPSHOT//")
+  branch="v${version}"
+
+  git checkout -b ${branch}
+  git push ${REMOTE} ${branch}:${branch}
+}
+
+(create_snapshot_branch)
diff --git a/release_source_release.sh b/release_source_release.sh
new file mode 100755
index 0000000..4ee2342
--- /dev/null
+++ b/release_source_release.sh
@@ -0,0 +1,35 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
+
+source "${SCRIPT_DIR}/_init.sh"
+source "${SCRIPT_DIR}/_utils.sh"
+
+###########################
+
+check_variables_set PROJECT VERSION RC_NUM
+
+###########################
+
+function release_source_release {
+  svn move -m "Release ${PROJECT} ${VERSION}" ${SVN_DEV_DIR}/${PROJECT}-${VERSION}-rc${RC_NUM} ${SVN_RELEASE_DIR}/${PROJECT}-${VERSION}
+}
+
+(release_source_release)
diff --git a/stage_jars.sh b/stage_jars.sh
new file mode 100755
index 0000000..0dd180c
--- /dev/null
+++ b/stage_jars.sh
@@ -0,0 +1,57 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
+
+source "${SCRIPT_DIR}/_init.sh"
+source "${SCRIPT_DIR}/_utils.sh"
+
+###########################
+
+check_variables_set FLINK_VERSION
+
+###########################
+
+function deploy_staging_jars {
+  cd "${SOURCE_DIR}"
+  mkdir -p "${RELEASE_DIR}"
+
+  project_version=$(get_pom_version)
+  if [[ ${project_version} =~ -SNAPSHOT$ ]]; then
+    echo "Jars should not be created for SNAPSHOT versions. Use 'update_branch_version.sh' first."
+    exit 1
+  fi
+  flink_minor_version=$(echo ${FLINK_VERSION} | sed "s/.[0-9]\+$//")
+  version=${project_version}-${flink_minor_version}
+
+  echo "Deploying jars v${version} to repository.apache.org"
+  echo "To revert this step, login to 'https://repository.apache.org' -> 'Staging repositories' -> Select repository -> 'Drop'"
+
+  clone_dir=$(create_pristine_source "${SOURCE_DIR}" "${RELEASE_DIR}")
+  cd "${clone_dir}"
+  set_pom_version "${version}"
+
+  options="-Prelease,docs-and-source -DskipTests -DretryFailedDeploymentCount=10"
+  ${MVN} clean deploy ${options} -Dflink.version=${FLINK_VERSION}
+
+  cd "${RELEASE_DIR}"
+  rm -rf "${clone_dir}"
+}
+
+(deploy_staging_jars)
diff --git a/stage_source_release.sh b/stage_source_release.sh
new file mode 100755
index 0000000..b8e659f
--- /dev/null
+++ b/stage_source_release.sh
@@ -0,0 +1,85 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
+
+source "${SCRIPT_DIR}/_init.sh"
+source "${SCRIPT_DIR}/_utils.sh"
+
+###########################
+
+check_variables_set RC_NUM
+
+###########################
+
+function create_source_release {
+  cd ${SOURCE_DIR}
+  mkdir -p ${RELEASE_DIR}
+  mkdir -p ${ARTIFACTS_DIR}
+
+  project=${PWD##*/}
+  version=$(get_pom_version)
+  if [[ ${version} =~ -SNAPSHOT$ ]]; then
+    echo "Source releases should not be created for SNAPSHOT versions. Use 'update_branch_version.sh' first."
+    exit 1
+  fi
+
+  echo "Creating source release v${version}"
+  echo "To revert this step, run 'rm ${ARTIFACTS_DIR}'"
+
+  clone_dir=$(create_pristine_source "${SOURCE_DIR}" "${RELEASE_DIR}")
+  versioned_dir="${ARTIFACTS_DIR}/${project}-${version}"
+  mv ${clone_dir} ${versioned_dir}
+
+  cd "${ARTIFACTS_DIR}"
+  tar czf ${ARTIFACTS_DIR}/${project}-${version}-src.tgz ${versioned_dir##*/}
+  gpg --armor --detach-sig ${ARTIFACTS_DIR}/${project}-${version}-src.tgz
+  ${SHASUM} ${project}-${version}-src.tgz >${project}-${version}-src.tgz.sha512
+
+  rm -rf ${versioned_dir}
+}
+
+function deploy_source_release {
+  cd ${SOURCE_DIR}
+  project=${PWD##*/}
+  version=$(get_pom_version)-rc${RC_NUM}
+
+  release=${project}-${version}
+
+  echo "Deploying source release v${version}"
+  echo "To revert this step, run 'svn delete ${SVN_DEV_DIR}/${release}'"
+
+  svn_dir=${RELEASE_DIR}/svn
+  rm -rf ${svn_dir}
+  mkdir -p ${svn_dir}
+  cd ${svn_dir}
+
+  svn checkout ${SVN_DEV_DIR} --depth=immediates
+  cd flink
+  mkdir ${release}
+  mv ${ARTIFACTS_DIR}/* ${release}
+  svn add ${release}
+  svn commit -m "Add ${release}"
+
+  cd ${RELEASE_DIR}
+  rm -rf ${svn_dir}
+}
+
+(create_source_release)
+(deploy_source_release)
diff --git a/update_branch_version.sh b/update_branch_version.sh
new file mode 100755
index 0000000..dc793da
--- /dev/null
+++ b/update_branch_version.sh
@@ -0,0 +1,41 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)
+
+source "${SCRIPT_DIR}/_init.sh"
+source "${SCRIPT_DIR}/_utils.sh"
+
+##########################
+
+check_variables_set NEW_VERSION
+
+###########################
+
+function update_branch_version {
+  cd "${SOURCE_DIR}"
+
+  set_pom_version "${NEW_VERSION}"
+
+  git commit -am "Update version to $NEW_VERSION"
+
+  echo "Done. Don't forget to push the change."
+}
+
+(update_branch_version)
diff --git a/update_japicmp_configuration.sh b/update_japicmp_configuration.sh
new file mode 100755
index 0000000..ce3784f
--- /dev/null
+++ b/update_japicmp_configuration.sh
@@ -0,0 +1,97 @@
+#!/usr/bin/env bash
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
+
+source ${SCRIPT_DIR}/_init.sh
+source ${SCRIPT_DIR}/_utils.sh
+
+###########################
+
+check_variables_set NEW_VERSION
+
+###########################
+
+# Idealized use-cases:
+# Scenario A) New major release X.0.0
+#   Premise:
+#     There is a main branch a version X.0-SNAPSHOT, with a japimp reference version of (X-1).Y.Z
+#   Release flow:
+#     - update the main to (X+1).0-SNAPSHOT, but keep the reference version intact since X.0.0 is not released (yet)
+#     - create X.0-SNAPSHOT branch, but keep the reference version intact since X.0.0 is not released (yet)
+#     - release X.0.0
+#     - update the japicmp reference version of both main and X.0-SNAPSHOT to X.0.0
+#     - enable stronger compatibility constraints for X.0-SNAPSHOT to ensure compatibility for PublicEvolving
+# Scenario A) New minor release X.Y.0
+#   Premise:
+#     There is a main branch with a version X.Y-SNAPSHOT, with a japicmp reference version of X.(Y-1).0 .
+#   Release flow:
+#     - update the main branch to X.(Y+1)-SNAPSHOT, but keep the reference version intact since X.Y.0 is not released (yet)
+#     - create X.Y-SNAPSHOT branch, but keep the reference version intact since X.Y.0 is not released (yet)
+#     - release X.Y.0
+#     - update the japicmp reference version of both main and X.Y-SNAPSHOT to X.Y.0
+#     - enable stronger compatibility constraints for X.Y-SNAPSHOT to ensure compatibility for PublicEvolving
+# Scenario C) New patch release X.Y.Z
+#   Premise:
+#     There is a snapshot branch with a version X.Y-SNAPSHOT, with a japicmp reference version of X.Y.(Z-1)
+#   Release flow:
+#     - release X.Y.Z
+#     - update the japicmp reference version of X.Y-SNAPSHOT to X.Y.Z
+
+function enable_public_evolving_compatibility_checks() {
+  perl -pi -e 's#<!--(<include>\@org.apache.flink.annotation.PublicEvolving</include>)-->#${1}#' pom.xml
+  perl -pi -e 's#\t+<exclude>\@org.apache.flink.annotation.PublicEvolving.*\n##' pom.xml
+}
+
+function set_japicmp_reference_version() {
+  local version=$1
+
+  perl -pi -e 's#(<japicmp.referenceVersion>).*(</japicmp.referenceVersion>)#${1}'${version}'${2}#' pom.xml
+}
+
+function clear_exclusions() {
+  exclusion_start=$(($(sed -n '/<!-- MARKER: start exclusions/=' pom.xml) + 1))
+  exclusion_end=$(($(sed -n '/<!-- MARKER: end exclusions/=' pom.xml) - 1))
+
+  if [[ $exclusion_start -lt $exclusion_end ]]; then
+    sed -i "${exclusion_start},${exclusion_end}d" pom.xml
+  fi
+}
+
+function update_japicmp_configuration() {
+  cd "${SOURCE_DIR}"
+
+  current_branch=$(git branch --show-current)
+
+  if [[ ${current_branch} =~ ^main$ ]]; then
+    # main branch
+    set_japicmp_reference_version ${NEW_VERSION}
+    clear_exclusions
+  elif [[ ${current_branch} =~ ^v ]]; then
+    # snapshot branch
+    set_japicmp_reference_version ${NEW_VERSION}
+    enable_public_evolving_compatibility_checks
+    clear_exclusions
+  else
+    echo "Script was called from unexpected branch ${current_branch}; should be snapshot/main branch."
+    exit 1
+  fi
+}
+
+(update_japicmp_configuration)
\ No newline at end of file