diff --git a/.github/workflows/freebsd-12.yml b/.github/workflows/freebsd-12.yml
deleted file mode 100644
index 0f9a70f63a0d5d1de41412851851ba53040f160e..0000000000000000000000000000000000000000
--- a/.github/workflows/freebsd-12.yml
+++ /dev/null
@@ -1,92 +0,0 @@
-name: freebsd-12
-
-on:
-  push:
-    branches:
-      - 'master'
-      - 'release/**'
-    tags:
-      - '**'
-  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
-  # run for this branch. However, the 'master' branch, release branch, and
-  # tag workflow runs are never canceled.
-  #
-  # We use a trick here: define the concurrency group as 'workflow run ID' +
-  # 'workflow run attempt' because it is a unique combination for any run.
-  # So it effectively discards grouping.
-  #
-  # Important: we cannot use `github.sha` as a unique identifier because
-  # pushing a tag may cancel a run that works on a branch push event.
-  group: ${{ (
-    github.ref == 'refs/heads/master' ||
-    startsWith(github.ref, 'refs/heads/release/') ||
-    startsWith(github.ref, 'refs/tags/')) &&
-    format('{0}-{1}', github.run_id, github.run_attempt) ||
-    format('{0}-{1}', github.workflow, github.ref) }}
-  cancel-in-progress: true
-
-jobs:
-  freebsd-12:
-    # Run on push to the 'master' and release branches of tarantool/tarantool
-    # or on pull request if the 'full-ci' label is set.
-    if: github.repository == 'tarantool/tarantool' &&
-        ( github.event_name != 'pull_request' ||
-          contains(github.event.pull_request.labels.*.name, 'full-ci') )
-
-    runs-on: freebsd-12-mcs
-
-    steps:
-      - name: Prepare checkout
-        uses: tarantool/actions/prepare-checkout@master
-      - uses: actions/checkout@v3.1.0
-        with:
-          fetch-depth: 0
-          submodules: recursive
-      - 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
-        if: failure()
-        uses: ./.github/actions/report-job-status
-        with:
-          bot-token: ${{ secrets.VKTEAMS_BOT_TOKEN }}
-      - name: artifacts
-        uses: actions/upload-artifact@v3
-        if: failure()
-        with:
-          name: freebsd-12
-          retention-days: 21
-          path: ${{ env.VARDIR }}/artifacts
-      - name: Upload artifacts to S3
-        uses: ./.github/actions/s3-upload-artifact
-        if: ( success() || failure() ) && ( github.ref == 'refs/heads/master' ||
-          startsWith(github.ref, 'refs/heads/release/') ||
-          startsWith(github.ref, 'refs/tags/') )
-        with:
-          job-name: ${{ github.job }}
-          access-key-id: ${{ secrets.MULTIVAC_S3_ACCESS_KEY_ID }}
-          secret-access-key: ${{ secrets.MULTIVAC_S3_SECRET_ACCESS_KEY }}
-          source: ${{ env.VARDIR }}/artifacts
diff --git a/.github/workflows/freebsd-13.yml b/.github/workflows/freebsd-13.yml
deleted file mode 100644
index 1c710dcdc96325a523146085598c31c2bd3c1996..0000000000000000000000000000000000000000
--- a/.github/workflows/freebsd-13.yml
+++ /dev/null
@@ -1,92 +0,0 @@
-name: freebsd-13
-
-on:
-  push:
-    branches:
-      - 'master'
-      - 'release/**'
-    tags:
-      - '**'
-  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
-  # run for this branch. However, the 'master' branch, release branch, and
-  # tag workflow runs are never canceled.
-  #
-  # We use a trick here: define the concurrency group as 'workflow run ID' +
-  # 'workflow run attempt' because it is a unique combination for any run.
-  # So it effectively discards grouping.
-  #
-  # Important: we cannot use `github.sha` as a unique identifier because
-  # pushing a tag may cancel a run that works on a branch push event.
-  group: ${{ (
-    github.ref == 'refs/heads/master' ||
-    startsWith(github.ref, 'refs/heads/release/') ||
-    startsWith(github.ref, 'refs/tags/')) &&
-    format('{0}-{1}', github.run_id, github.run_attempt) ||
-    format('{0}-{1}', github.workflow, github.ref) }}
-  cancel-in-progress: true
-
-jobs:
-  freebsd-13:
-    # Run on push to the 'master' and release branches of tarantool/tarantool
-    # or on pull request if the 'full-ci' label is set.
-    if: github.repository == 'tarantool/tarantool' &&
-        ( github.event_name != 'pull_request' ||
-          contains(github.event.pull_request.labels.*.name, 'full-ci') )
-
-    runs-on: freebsd-13-mcs
-
-    steps:
-      - name: Prepare checkout
-        uses: tarantool/actions/prepare-checkout@master
-      - uses: actions/checkout@v3.1.0
-        with:
-          fetch-depth: 0
-          submodules: recursive
-      - 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
-        if: failure()
-        uses: ./.github/actions/report-job-status
-        with:
-          bot-token: ${{ secrets.VKTEAMS_BOT_TOKEN }}
-      - name: artifacts
-        uses: actions/upload-artifact@v3
-        if: failure()
-        with:
-          name: freebsd-13
-          retention-days: 21
-          path: ${{ env.VARDIR }}/artifacts
-      - name: Upload artifacts to S3
-        uses: ./.github/actions/s3-upload-artifact
-        if: ( success() || failure() ) && ( github.ref == 'refs/heads/master' ||
-          startsWith(github.ref, 'refs/heads/release/') ||
-          startsWith(github.ref, 'refs/tags/') )
-        with:
-          job-name: ${{ github.job }}
-          access-key-id: ${{ secrets.MULTIVAC_S3_ACCESS_KEY_ID }}
-          secret-access-key: ${{ secrets.MULTIVAC_S3_SECRET_ACCESS_KEY }}
-          source: ${{ env.VARDIR }}/artifacts
diff --git a/.github/workflows/freebsd.yml b/.github/workflows/freebsd.yml
new file mode 100644
index 0000000000000000000000000000000000000000..64ff845a4906bf541b12fcbf7f04c5eafc43ee1b
--- /dev/null
+++ b/.github/workflows/freebsd.yml
@@ -0,0 +1,67 @@
+name: freebsd
+
+on:
+  schedule:
+    - cron: '0 1 * * *'
+  workflow_dispatch:
+
+jobs:
+  freebsd:
+    # Run for tarantool/tarantool repository only.
+    if: github.repository == 'tarantool/tarantool'
+
+    runs-on: freebsd-${{ matrix.freebsd-version }}-mcs
+
+    strategy:
+      fail-fast: false
+      matrix:
+        freebsd-version: [ 12, 13 ]
+        tarantool-branch:
+          - 'master'
+          - 'release/3.0'
+          - 'release/2.11'
+          - 'release/2.10'
+
+    steps:
+      - name: Prepare checkout
+        uses: tarantool/actions/prepare-checkout@master
+
+      - name: Sources checkout
+        uses: actions/checkout@v3.1.0
+        with:
+          ref: ${{ matrix.tarantool-branch }}
+          fetch-depth: 0
+          submodules: recursive
+
+      - uses: ./.github/actions/environment
+
+      - name: Install deps
+        uses: ./.github/actions/install-deps-freebsd
+
+      - name: Run testing
+        run: gmake -f .test.mk test-freebsd-release
+
+      - name: Send VK Teams message on failure
+        if: failure()
+        uses: ./.github/actions/report-job-status
+        with:
+          bot-token: ${{ secrets.VKTEAMS_BOT_TOKEN }}
+
+      - name: Upload artifacts
+        uses: actions/upload-artifact@v3
+        if: failure()
+        with:
+          name: freebsd-${{ matrix.freebsd-version }}-${{ matrix.tarantool-branch }}
+          retention-days: 21
+          path: ${{ env.VARDIR }}/artifacts
+
+      - name: Upload artifacts to S3
+        uses: ./.github/actions/s3-upload-artifact
+        if: ( success() || failure() ) && ( github.ref == 'refs/heads/master' ||
+          startsWith(github.ref, 'refs/heads/release/') ||
+          startsWith(github.ref, 'refs/tags/') )
+        with:
+          job-name: ${{ github.job }}
+          access-key-id: ${{ secrets.MULTIVAC_S3_ACCESS_KEY_ID }}
+          secret-access-key: ${{ secrets.MULTIVAC_S3_SECRET_ACCESS_KEY }}
+          source: ${{ env.VARDIR }}/artifacts