From e2f2db071c3eab9ee604b9ee4c2215f8a09cccd7 Mon Sep 17 00:00:00 2001
From: Maksim Kokryashkin <max.kokryashkin@gmail.com>
Date: Mon, 11 Dec 2023 14:39:36 +0300
Subject: [PATCH] ci: add optional submodule bump step

Currently, if there is a need to test submodule integration with
Tarantool and its integration, it is required to create a PR.
That is inconvenient, so this patch introduces the option to run
the same jobs that are triggered by the `full-ci` label as
reusable workflows with the desired submodule revision. This
allows for integration testing of submodules within their
designated repositories.

NO_DOC=CI
NO_TEST=CI
NO_CHANGELOG=CI
---
 .github/actions/bump-submodule/action.yml     | 36 +++++++++++++++++++
 .github/workflows/codeql.yml                  | 17 +++++++++
 .github/workflows/coverage.yml                | 17 +++++++++
 .github/workflows/debug.yml                   | 17 +++++++++
 .github/workflows/debug_aarch64.yml           | 16 +++++++++
 .github/workflows/debug_asan_clang.yml        | 16 +++++++++
 .github/workflows/default_gcc_centos_7.yml    | 16 +++++++++
 .github/workflows/freebsd-12.yml              | 16 +++++++++
 .github/workflows/freebsd-13.yml              | 16 +++++++++
 .github/workflows/integration.yml             | 12 +++++++
 .github/workflows/lint.yml                    | 16 +++++++++
 .github/workflows/luajit-integration.yml      | 23 +++---------
 .../memtx_allocator_based_on_malloc.yml       | 16 +++++++++
 .github/workflows/osx_debug.yml               | 16 +++++++++
 .github/workflows/osx_release.yml             | 16 +++++++++
 .github/workflows/osx_release_lto.yml         | 16 +++++++++
 .github/workflows/osx_static_cmake.yml        | 16 +++++++++
 .github/workflows/out_of_source.yml           | 16 +++++++++
 .github/workflows/perf_micro.yml              | 16 +++++++++
 .github/workflows/release.yml                 | 16 +++++++++
 .github/workflows/release_asan_clang.yml      | 16 +++++++++
 .github/workflows/release_clang.yml           | 16 +++++++++
 .github/workflows/release_lto.yml             | 16 +++++++++
 .github/workflows/release_lto_clang.yml       | 16 +++++++++
 .github/workflows/reusable_build.yml          | 14 ++++++++
 .github/workflows/static_build.yml            | 16 +++++++++
 .../workflows/static_build_cmake_linux.yml    | 16 +++++++++
 27 files changed, 437 insertions(+), 19 deletions(-)
 create mode 100644 .github/actions/bump-submodule/action.yml

diff --git a/.github/actions/bump-submodule/action.yml b/.github/actions/bump-submodule/action.yml
new file mode 100644
index 0000000000..a0d7b88285
--- /dev/null
+++ b/.github/actions/bump-submodule/action.yml
@@ -0,0 +1,36 @@
+name: 'Bump submodule'
+description: 'Bump specified submodule from third_party'
+
+inputs:
+  submodule:
+    description: Name of submodule to bump.
+    required: true
+    type: string
+  revision:
+    description: Git revision from submodule repository
+    required: true
+    type: string
+
+runs:
+  using: 'composite'
+  # XXX: Environment variables to suppress git config warning.
+  # The commit is required to avoid resetting dirty
+  # changes in submodule.
+  env:
+    GIT_COMMITTER_NAME: "integration testing workflow"
+    GIT_COMMITTER_EMAIL: "noreply@tarantool.org"
+    GIT_AUTHOR_NAME: "integration testing workflow"
+    GIT_AUTHOR_EMAIL: "noreply@tarantool.org"
+  steps:
+    run: |
+      pushd third_party/${{ inputs.submodule }}
+      git fetch origin
+      git checkout ${{ inputs.revision }}
+      popd
+      # XXX: --allow-empty is required to rerun flaky tests
+      # for HEAD when it is already bumped
+      # in tarantool/tarantool repo to the same revision.
+      # Otherwise the command below fails with "nothing to
+      # commit" reason.
+      git commit --allow-empty -m ${{ inputs.submodule }}": integration testing bump" \
+        third_party/${{ inputs.submodule }}
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index a1a47b8776..96d1b36d3f 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -5,6 +5,16 @@ on:
     branches: [ "master" ]
   workflow_dispatch:
     branches: [ "master" ]
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 jobs:
   analyze:
@@ -58,6 +68,13 @@ jobs:
     - name: Install deps
       uses: ./.github/actions/install-deps-debian
 
+    - name: Optional submodule bump
+      if: ${{ inputs.submodule }}
+      uses: ./.github/actions/bump-submodule
+      with:
+        submodule: ${{ inputs.submodule }}
+        revision: ${{ inputs.revision }}
+
     - name: Build
       run: make -f .test.mk build
 
diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml
index 78f214d24b..88b285ca98 100644
--- a/.github/workflows/coverage.yml
+++ b/.github/workflows/coverage.yml
@@ -9,6 +9,16 @@ on:
       - '**'
   pull_request:
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -68,6 +78,13 @@ jobs:
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
 
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
+
       - name: Run testing with coverage enabled
         run: make -f .test.mk test-coverage
 
diff --git a/.github/workflows/debug.yml b/.github/workflows/debug.yml
index a72763d791..348adf7694 100644
--- a/.github/workflows/debug.yml
+++ b/.github/workflows/debug.yml
@@ -9,6 +9,16 @@ on:
       - '**'
   pull_request:
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -68,6 +78,13 @@ jobs:
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
 
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
+
       - name: Run testing
         run: make -f .test.mk test-debug
 
diff --git a/.github/workflows/debug_aarch64.yml b/.github/workflows/debug_aarch64.yml
index f8d1c9d341..0bc537d6d2 100644
--- a/.github/workflows/debug_aarch64.yml
+++ b/.github/workflows/debug_aarch64.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -63,6 +73,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: make -f .test.mk test-debug
       - name: Send VK Teams message on failure
diff --git a/.github/workflows/debug_asan_clang.yml b/.github/workflows/debug_asan_clang.yml
index 57a14c3b32..4598030030 100644
--- a/.github/workflows/debug_asan_clang.yml
+++ b/.github/workflows/debug_asan_clang.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -64,6 +74,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         env:
           CC: clang-16
diff --git a/.github/workflows/default_gcc_centos_7.yml b/.github/workflows/default_gcc_centos_7.yml
index 838e5bbecc..1db3fde46c 100644
--- a/.github/workflows/default_gcc_centos_7.yml
+++ b/.github/workflows/default_gcc_centos_7.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -51,6 +61,12 @@ jobs:
           fetch-depth: 0
           submodules: recursive
       - uses: ./.github/actions/environment
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         env:
           # Our testing expects that the init process (PID 1) will
diff --git a/.github/workflows/freebsd-12.yml b/.github/workflows/freebsd-12.yml
index 69ef9418f0..0f9a70f63a 100644
--- a/.github/workflows/freebsd-12.yml
+++ b/.github/workflows/freebsd-12.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -50,6 +60,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-freebsd
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: gmake -f .test.mk test-freebsd-release
       - name: Send VK Teams message on failure
diff --git a/.github/workflows/freebsd-13.yml b/.github/workflows/freebsd-13.yml
index 308dff6ba9..1c710dcdc9 100644
--- a/.github/workflows/freebsd-13.yml
+++ b/.github/workflows/freebsd-13.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -50,6 +60,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-freebsd
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: gmake -f .test.mk test-freebsd-release
       - name: Send VK Teams message on failure
diff --git a/.github/workflows/integration.yml b/.github/workflows/integration.yml
index 935c27f079..c122ac23a9 100644
--- a/.github/workflows/integration.yml
+++ b/.github/workflows/integration.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [ opened, reopened, synchronize, labeled ]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -44,6 +54,8 @@ jobs:
       ref: ${{ github.sha }}
       os: ubuntu
       dist: focal
+      submodule: ${{ inputs.submodule }}
+      revision: ${{ inputs.revision }}
 
   vshard:
     needs: tarantool
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index 9bbf9a58c2..f1431d59fb 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -9,6 +9,16 @@ on:
       - '**'
   pull_request:
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -52,6 +62,12 @@ jobs:
           submodules: recursive
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: make -f .test.mk luacheck
       - name: Send VK Teams message on failure
diff --git a/.github/workflows/luajit-integration.yml b/.github/workflows/luajit-integration.yml
index fa9aa4db63..3bade68432 100644
--- a/.github/workflows/luajit-integration.yml
+++ b/.github/workflows/luajit-integration.yml
@@ -63,25 +63,10 @@ jobs:
           ref: ${{ inputs.release }}
 
       - name: LuaJIT bump
-        run: |
-          pushd third_party/luajit
-          git fetch origin
-          git checkout ${{ inputs.revision }}
-          popd
-          # XXX: export the following environment variables to
-          # suppress git config warning. The commit is required to
-          # avoid resetting dirty changes in LuaJIT submodule.
-          export GIT_COMMITTER_NAME="LuaJIT integration testing workflow"
-          export GIT_COMMITTER_EMAIL="noreply@tarantool.org"
-          export GIT_AUTHOR_NAME="LuaJIT integration testing workflow"
-          export GIT_AUTHOR_EMAIL="noreply@tarantool.org"
-          # XXX: --allow-empty is required to rerun flaky tests
-          # for tarantool/luajit HEAD when it is already bumped
-          # in tarantool/tarantool repo to the same revision.
-          # Otherwise the command below fails with "nothing to
-          # commit" reason.
-          git commit --allow-empty -m "luajit: integration testing bump" \
-            third_party/luajit
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: luajit
+          revision: ${{ inputs.revision }}
 
       - name: Set environment
         uses: ./.github/actions/environment
diff --git a/.github/workflows/memtx_allocator_based_on_malloc.yml b/.github/workflows/memtx_allocator_based_on_malloc.yml
index 3697c9e5cc..aadad4dab3 100644
--- a/.github/workflows/memtx_allocator_based_on_malloc.yml
+++ b/.github/workflows/memtx_allocator_based_on_malloc.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -63,6 +73,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         env:
           TEST_RUN_EXTRA_PARAMS: --memtx-allocator=system
diff --git a/.github/workflows/osx_debug.yml b/.github/workflows/osx_debug.yml
index f44f1daa20..bdc1dec28c 100644
--- a/.github/workflows/osx_debug.yml
+++ b/.github/workflows/osx_debug.yml
@@ -9,6 +9,16 @@ on:
       - '**'
   pull_request:
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -56,6 +66,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-osx
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: make -f .test.mk test-osx-debug
       - name: Send VK Teams message on failure
diff --git a/.github/workflows/osx_release.yml b/.github/workflows/osx_release.yml
index ae39a697f2..4cb467298b 100644
--- a/.github/workflows/osx_release.yml
+++ b/.github/workflows/osx_release.yml
@@ -9,6 +9,16 @@ on:
       - '**'
   pull_request:
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -59,6 +69,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-osx
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: make -f .test.mk test-osx-release
       - name: Send VK Teams message on failure
diff --git a/.github/workflows/osx_release_lto.yml b/.github/workflows/osx_release_lto.yml
index 17481a7e97..5f5bffb159 100644
--- a/.github/workflows/osx_release_lto.yml
+++ b/.github/workflows/osx_release_lto.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -56,6 +66,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-osx
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         env:
           CMAKE_EXTRA_PARAMS: -DENABLE_LTO=ON
diff --git a/.github/workflows/osx_static_cmake.yml b/.github/workflows/osx_static_cmake.yml
index f3f79b1fc4..621dfa0ac8 100644
--- a/.github/workflows/osx_static_cmake.yml
+++ b/.github/workflows/osx_static_cmake.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -57,6 +67,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-osx
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: make -f .test.mk test-osx-static-cmake
       - name: Send VK Teams message on failure
diff --git a/.github/workflows/out_of_source.yml b/.github/workflows/out_of_source.yml
index fab4ace0ba..c4204739c3 100644
--- a/.github/workflows/out_of_source.yml
+++ b/.github/workflows/out_of_source.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -63,6 +73,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         env:
           BUILD_DIR: build
diff --git a/.github/workflows/perf_micro.yml b/.github/workflows/perf_micro.yml
index 0192193c9b..8faa2f5180 100644
--- a/.github/workflows/perf_micro.yml
+++ b/.github/workflows/perf_micro.yml
@@ -9,6 +9,16 @@ on:
       - '**'
   pull_request:
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -50,6 +60,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: make -f .test.mk test-perf
       - name: Send VK Teams message on failure
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index e0488aba8d..ec18ca4d03 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -9,6 +9,16 @@ on:
       - '**'
   pull_request:
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -63,6 +73,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: make -f .test.mk test-release
       - name: Send VK Teams message on failure
diff --git a/.github/workflows/release_asan_clang.yml b/.github/workflows/release_asan_clang.yml
index 4e0846bf2d..89fd7271bc 100644
--- a/.github/workflows/release_asan_clang.yml
+++ b/.github/workflows/release_asan_clang.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -64,6 +74,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         env:
           CC: clang-16
diff --git a/.github/workflows/release_clang.yml b/.github/workflows/release_clang.yml
index 4e19d663d2..356c3440a8 100644
--- a/.github/workflows/release_clang.yml
+++ b/.github/workflows/release_clang.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -63,6 +73,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         env:
           CC: clang-16
diff --git a/.github/workflows/release_lto.yml b/.github/workflows/release_lto.yml
index 9b3afa4809..9ec89d8b4d 100644
--- a/.github/workflows/release_lto.yml
+++ b/.github/workflows/release_lto.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -63,6 +73,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         env:
           CMAKE_EXTRA_PARAMS: -DENABLE_LTO=ON
diff --git a/.github/workflows/release_lto_clang.yml b/.github/workflows/release_lto_clang.yml
index a9a957ede8..363a01659f 100644
--- a/.github/workflows/release_lto_clang.yml
+++ b/.github/workflows/release_lto_clang.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -63,6 +73,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         env:
           CC: clang-16
diff --git a/.github/workflows/reusable_build.yml b/.github/workflows/reusable_build.yml
index afef32e06b..ff8f805c8b 100644
--- a/.github/workflows/reusable_build.yml
+++ b/.github/workflows/reusable_build.yml
@@ -19,6 +19,14 @@ on:
         default: focal
         required: false
         type: string
+      submodule:
+        description: Name of submodule to bump.
+        required: false
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: false
+        type: string
 
 jobs:
   build:
@@ -40,6 +48,12 @@ jobs:
         id: get_sha
         run: echo "sha=$(git log -1 --format='%H')" >> $GITHUB_OUTPUT
       - uses: ./.github/actions/environment
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: 'Build tarantool packages for ${{ env.OS }}(${{ env.DIST }})'
         id: run_build
         env:
diff --git a/.github/workflows/static_build.yml b/.github/workflows/static_build.yml
index ffe2843932..0f2d964464 100644
--- a/.github/workflows/static_build.yml
+++ b/.github/workflows/static_build.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -64,6 +74,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: make -f .test.mk test-static
       - name: Send VK Teams message on failure
diff --git a/.github/workflows/static_build_cmake_linux.yml b/.github/workflows/static_build_cmake_linux.yml
index d7c923db4f..0f8b1c3a39 100644
--- a/.github/workflows/static_build_cmake_linux.yml
+++ b/.github/workflows/static_build_cmake_linux.yml
@@ -10,6 +10,16 @@ on:
   pull_request:
     types: [opened, reopened, synchronize, labeled]
   workflow_dispatch:
+  workflow_call:
+    inputs:
+      submodule:
+        description: Name of submodule to bump.
+        required: true
+        type: string
+      revision:
+        description: Git revision from submodule repository
+        required: true
+        type: string
 
 concurrency:
   # Update of a developer branch cancels the previously scheduled workflow
@@ -64,6 +74,12 @@ jobs:
       - uses: ./.github/actions/environment
       - name: Install deps
         uses: ./.github/actions/install-deps-debian
+      - name: Optional submodule bump
+        if: ${{ inputs.submodule }}
+        uses: ./.github/actions/bump-submodule
+        with:
+          submodule: ${{ inputs.submodule }}
+          revision: ${{ inputs.revision }}
       - name: test
         run: make -f .test.mk test-static-cmake
       - name: Send VK Teams message on failure
-- 
GitLab