summaryrefslogtreecommitdiffstats
path: root/.github
diff options
context:
space:
mode:
Diffstat (limited to '.github')
-rw-r--r--.github/ISSUE_TEMPLATE/bug_report.md24
-rw-r--r--.github/ISSUE_TEMPLATE/crash_report.md25
-rw-r--r--.github/ISSUE_TEMPLATE/feature_request.md24
-rw-r--r--.github/ISSUE_TEMPLATE/other_stuff.md8
-rw-r--r--.github/ISSUE_TEMPLATE/question.md21
-rw-r--r--.github/dependabot.yml15
-rw-r--r--.github/workflows/ci.yml84
-rw-r--r--.github/workflows/codeql-analysis.yml33
-rw-r--r--.github/workflows/daily.yml1087
-rw-r--r--.github/workflows/external.yml82
-rw-r--r--.github/workflows/reply-schemas-linter.yml22
-rw-r--r--.github/workflows/spell-check.yml32
12 files changed, 1457 insertions, 0 deletions
diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..00f21a8
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,24 @@
+---
+name: Bug report
+about: Help us improve Redis by reporting a bug
+title: '[BUG]'
+labels: ''
+assignees: ''
+
+---
+
+**Describe the bug**
+
+A short description of the bug.
+
+**To reproduce**
+
+Steps to reproduce the behavior and/or a minimal code sample.
+
+**Expected behavior**
+
+A description of what you expected to happen.
+
+**Additional information**
+
+Any additional information that is relevant to the problem.
diff --git a/.github/ISSUE_TEMPLATE/crash_report.md b/.github/ISSUE_TEMPLATE/crash_report.md
new file mode 100644
index 0000000..1118ac1
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/crash_report.md
@@ -0,0 +1,25 @@
+---
+name: Crash report
+about: Submit a crash report
+title: '[CRASH] <short description>'
+labels: ''
+assignees: ''
+
+---
+
+Notice!
+- If a Redis module was involved, please open an issue in the module's repo instead!
+- If you're using docker on Apple M1, please make sure the image you're using was compiled for ARM!
+
+
+**Crash report**
+
+Paste the complete crash log between the quotes below. Please include a few lines from the log preceding the crash report to provide some context.
+
+```
+```
+
+**Additional information**
+
+1. OS distribution and version
+2. Steps to reproduce (if any)
diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..732dc64
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,24 @@
+---
+name: Feature request
+about: Suggest a feature for Redis
+title: '[NEW]'
+labels: ''
+assignees: ''
+
+---
+
+**The problem/use-case that the feature addresses**
+
+A description of the problem that the feature will solve, or the use-case with which the feature will be used.
+
+**Description of the feature**
+
+A description of what you want to happen.
+
+**Alternatives you've considered**
+
+Any alternative solutions or features you've considered, including references to existing open and closed feature requests in this repository.
+
+**Additional information**
+
+Any additional information that is relevant to the feature request.
diff --git a/.github/ISSUE_TEMPLATE/other_stuff.md b/.github/ISSUE_TEMPLATE/other_stuff.md
new file mode 100644
index 0000000..e82cf00
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/other_stuff.md
@@ -0,0 +1,8 @@
+---
+name: Other
+about: Can't find the right issue type? Use this one!
+title: ''
+labels: ''
+assignees: ''
+
+---
diff --git a/.github/ISSUE_TEMPLATE/question.md b/.github/ISSUE_TEMPLATE/question.md
new file mode 100644
index 0000000..338f942
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/question.md
@@ -0,0 +1,21 @@
+---
+name: Question
+about: Ask the Redis developers
+title: '[QUESTION]'
+labels: ''
+assignees: ''
+
+---
+
+Please keep in mind that this issue tracker should be used for reporting bugs or proposing improvements to the Redis server.
+
+Generally, questions about using Redis should be directed to the [community](https://redis.io/community):
+
+* [the mailing list](https://groups.google.com/forum/#!forum/redis-db)
+* [the `redis` tag at StackOverflow](http://stackoverflow.com/questions/tagged/redis)
+* [/r/redis subreddit](http://www.reddit.com/r/redis)
+* [github discussions](https://github.com/redis/redis/discussions)
+
+It is also possible that your question was already asked here, so please do a quick issues search before submitting. Lastly, if your question is about one of Redis' [clients](https://redis.io/clients), you may to contact your client's developers for help.
+
+That said, please feel free to replace all this with your question :)
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 0000000..f00019d
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,15 @@
+# To get started with Dependabot version updates, you'll need to specify which
+# package ecosystems to update and where the package manifests are located.
+# Please see the documentation for all configuration options:
+# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
+
+version: 2
+updates:
+ - package-ecosystem: github-actions
+ directory: /
+ schedule:
+ interval: weekly
+ - package-ecosystem: pip
+ directory: /.codespell
+ schedule:
+ interval: weekly
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..43547a4
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,84 @@
+name: CI
+
+on: [push, pull_request]
+
+jobs:
+
+ test-ubuntu-latest:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: make
+ # Fail build if there are warnings
+ # build with TLS just for compilation coverage
+ run: make REDIS_CFLAGS='-Werror' BUILD_TLS=yes
+ - name: test
+ run: |
+ sudo apt-get install tcl8.6 tclx
+ ./runtest --verbose --tags -slow --dump-logs
+ - name: module api test
+ run: ./runtest-moduleapi --verbose --dump-logs
+ - name: validate commands.def up to date
+ run: |
+ touch src/commands/ping.json
+ make commands.def
+ dirty=$(git diff)
+ if [[ ! -z $dirty ]]; then echo $dirty; exit 1; fi
+
+ test-sanitizer-address:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: make
+ # build with TLS module just for compilation coverage
+ run: make SANITIZER=address REDIS_CFLAGS='-Werror' BUILD_TLS=module
+ - name: testprep
+ run: sudo apt-get install tcl8.6 tclx -y
+ - name: test
+ run: ./runtest --verbose --tags -slow --dump-logs
+ - name: module api test
+ run: ./runtest-moduleapi --verbose --dump-logs
+
+ build-debian-old:
+ runs-on: ubuntu-latest
+ container: debian:buster
+ steps:
+ - uses: actions/checkout@v3
+ - name: make
+ run: |
+ apt-get update && apt-get install -y build-essential
+ make REDIS_CFLAGS='-Werror'
+
+ build-macos-latest:
+ runs-on: macos-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: make
+ run: make REDIS_CFLAGS='-Werror'
+
+ build-32bit:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: make
+ run: |
+ sudo apt-get update && sudo apt-get install libc6-dev-i386
+ make REDIS_CFLAGS='-Werror' 32bit
+
+ build-libc-malloc:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: make
+ run: make REDIS_CFLAGS='-Werror' MALLOC=libc
+
+ build-centos7-jemalloc:
+ runs-on: ubuntu-latest
+ container: centos:7
+ steps:
+ - uses: actions/checkout@v3
+ - name: make
+ run: |
+ yum -y install gcc make
+ make REDIS_CFLAGS='-Werror'
+
diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml
new file mode 100644
index 0000000..dc7413e
--- /dev/null
+++ b/.github/workflows/codeql-analysis.yml
@@ -0,0 +1,33 @@
+name: "CodeQL"
+
+on:
+ pull_request:
+ schedule:
+ # run weekly new vulnerability was added to the database
+ - cron: '0 0 * * 0'
+
+jobs:
+ analyze:
+ name: Analyze
+ runs-on: ubuntu-latest
+ if: github.event_name != 'schedule' || github.repository == 'redis/redis'
+
+ strategy:
+ fail-fast: false
+ matrix:
+ language: [ 'cpp' ]
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: Initialize CodeQL
+ uses: github/codeql-action/init@v2
+ with:
+ languages: ${{ matrix.language }}
+
+ - name: Autobuild
+ uses: github/codeql-action/autobuild@v2
+
+ - name: Perform CodeQL Analysis
+ uses: github/codeql-action/analyze@v2
diff --git a/.github/workflows/daily.yml b/.github/workflows/daily.yml
new file mode 100644
index 0000000..72720e6
--- /dev/null
+++ b/.github/workflows/daily.yml
@@ -0,0 +1,1087 @@
+name: Daily
+
+on:
+ pull_request:
+ branches:
+ # any PR to a release branch.
+ - '[0-9].[0-9]'
+ schedule:
+ - cron: '0 0 * * *'
+ workflow_dispatch:
+ inputs:
+ skipjobs:
+ description: 'jobs to skip (delete the ones you wanna keep, do not leave empty)'
+ default: 'valgrind,sanitizer,tls,freebsd,macos,alpine,32bit,iothreads,ubuntu,centos,malloc,specific,fortify,reply-schema'
+ skiptests:
+ description: 'tests to skip (delete the ones you wanna keep, do not leave empty)'
+ default: 'redis,modules,sentinel,cluster,unittest'
+ test_args:
+ description: 'extra test arguments'
+ default: ''
+ cluster_test_args:
+ description: 'extra cluster / sentinel test arguments'
+ default: ''
+ use_repo:
+ description: 'repo owner and name'
+ default: 'redis/redis'
+ use_git_ref:
+ description: 'git branch or sha to use'
+ default: 'unstable'
+
+
+jobs:
+
+ test-ubuntu-jemalloc:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'ubuntu')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make REDIS_CFLAGS='-Werror -DREDIS_TEST'
+ - name: testprep
+ run: sudo apt-get install tcl8.6 tclx
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+ - name: unittest
+ if: true && !contains(github.event.inputs.skiptests, 'unittest')
+ run: ./src/redis-server test all --accurate
+
+ test-ubuntu-jemalloc-fortify:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'fortify')
+ container: ubuntu:lunar
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ apt-get update && apt-get install -y make gcc-13
+ update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100
+ make CC=gcc REDIS_CFLAGS='-Werror -DREDIS_TEST -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3'
+ - name: testprep
+ run: apt-get install -y tcl8.6 tclx procps
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+ - name: unittest
+ if: true && !contains(github.event.inputs.skiptests, 'unittest')
+ run: ./src/redis-server test all --accurate
+
+ test-ubuntu-libc-malloc:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'malloc')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make MALLOC=libc REDIS_CFLAGS='-Werror'
+ - name: testprep
+ run: sudo apt-get install tcl8.6 tclx
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+
+ test-ubuntu-no-malloc-usable-size:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'malloc')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make MALLOC=libc CFLAGS=-DNO_MALLOC_USABLE_SIZE REDIS_CFLAGS='-Werror'
+ - name: testprep
+ run: sudo apt-get install tcl8.6 tclx
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+
+ test-ubuntu-32bit:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, '32bit')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ sudo apt-get update && sudo apt-get install libc6-dev-i386
+ make 32bit REDIS_CFLAGS='-Werror -DREDIS_TEST'
+ - name: testprep
+ run: sudo apt-get install tcl8.6 tclx
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: |
+ make -C tests/modules 32bit # the script below doesn't have an argument, we must build manually ahead of time
+ ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+ - name: unittest
+ if: true && !contains(github.event.inputs.skiptests, 'unittest')
+ run: ./src/redis-server test all --accurate
+
+ test-ubuntu-tls:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'tls')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ make BUILD_TLS=yes REDIS_CFLAGS='-Werror'
+ - name: testprep
+ run: |
+ sudo apt-get install tcl8.6 tclx tcl-tls
+ ./utils/gen-test-certs.sh
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: |
+ ./runtest --accurate --verbose --dump-logs --tls --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: |
+ ./runtest-moduleapi --verbose --dump-logs --tls --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: |
+ ./runtest-sentinel --tls ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: |
+ ./runtest-cluster --tls ${{github.event.inputs.cluster_test_args}}
+
+ test-ubuntu-tls-no-tls:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'tls')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ make BUILD_TLS=yes REDIS_CFLAGS='-Werror'
+ - name: testprep
+ run: |
+ sudo apt-get install tcl8.6 tclx tcl-tls
+ ./utils/gen-test-certs.sh
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: |
+ ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: |
+ ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: |
+ ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: |
+ ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+
+ test-ubuntu-io-threads:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'iothreads')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ make REDIS_CFLAGS='-Werror'
+ - name: testprep
+ run: sudo apt-get install tcl8.6 tclx
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --config io-threads 4 --config io-threads-do-reads yes --accurate --verbose --tags network --dump-logs ${{github.event.inputs.test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster --config io-threads 4 --config io-threads-do-reads yes ${{github.event.inputs.cluster_test_args}}
+
+ test-ubuntu-reclaim-cache:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'specific')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ make REDIS_CFLAGS='-Werror'
+ - name: testprep
+ run: |
+ sudo apt-get install vmtouch
+ mkdir /tmp/master
+ mkdir /tmp/slave
+ - name: warm up
+ run: |
+ ./src/redis-server --daemonize yes --logfile /dev/null
+ ./src/redis-benchmark -n 1 > /dev/null
+ ./src/redis-cli save | grep OK > /dev/null
+ vmtouch -v ./dump.rdb > /dev/null
+ - name: test
+ run: |
+ echo "test SAVE doesn't increase cache"
+ CACHE0=$(grep -w file /sys/fs/cgroup/memory.stat | awk '{print $2}')
+ echo "$CACHE0"
+ ./src/redis-server --daemonize yes --logfile /dev/null --dir /tmp/master --port 8080 --repl-diskless-sync no --pidfile /tmp/master/redis.pid --rdbcompression no --enable-debug-command yes
+ ./src/redis-cli -p 8080 debug populate 10000 k 102400
+ ./src/redis-server --daemonize yes --logfile /dev/null --dir /tmp/slave --port 8081 --repl-diskless-load disabled --rdbcompression no
+ ./src/redis-cli -p 8080 save > /dev/null
+ VMOUT=$(vmtouch -v /tmp/master/dump.rdb)
+ echo $VMOUT
+ grep -q " 0%" <<< $VMOUT
+ CACHE=$(grep -w file /sys/fs/cgroup/memory.stat | awk '{print $2}')
+ echo "$CACHE"
+ if [ "$(( $CACHE-$CACHE0 ))" -gt "8000000" ]; then exit 1; fi
+
+ echo "test replication doesn't increase cache"
+ ./src/redis-cli -p 8081 REPLICAOF 127.0.0.1 8080 > /dev/null
+ while [ $(./src/redis-cli -p 8081 info replication | grep "master_link_status:down") ]; do sleep 1; done;
+ sleep 1 # wait for the completion of cache reclaim bio
+ VMOUT=$(vmtouch -v /tmp/master/dump.rdb)
+ echo $VMOUT
+ grep -q " 0%" <<< $VMOUT
+ VMOUT=$(vmtouch -v /tmp/slave/dump.rdb)
+ echo $VMOUT
+ grep -q " 0%" <<< $VMOUT
+ CACHE=$(grep -w file /sys/fs/cgroup/memory.stat | awk '{print $2}')
+ echo "$CACHE"
+ if [ "$(( $CACHE-$CACHE0 ))" -gt "8000000" ]; then exit 1; fi
+
+ echo "test reboot doesn't increase cache"
+ PID=$(cat /tmp/master/redis.pid)
+ kill -15 $PID
+ while [ -x /proc/${PID} ]; do sleep 1; done
+ ./src/redis-server --daemonize yes --logfile /dev/null --dir /tmp/master --port 8080
+ while [ $(./src/redis-cli -p 8080 info persistence | grep "loading:1") ]; do sleep 1; done;
+ sleep 1 # wait for the completion of cache reclaim bio
+ VMOUT=$(vmtouch -v /tmp/master/dump.rdb)
+ echo $VMOUT
+ grep -q " 0%" <<< $VMOUT
+ CACHE=$(grep -w file /sys/fs/cgroup/memory.stat | awk '{print $2}')
+ echo "$CACHE"
+ if [ "$(( $CACHE-$CACHE0 ))" -gt "8000000" ]; then exit 1; fi
+
+ test-valgrind-test:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'valgrind') && !contains(github.event.inputs.skiptests, 'redis')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make valgrind REDIS_CFLAGS='-Werror -DREDIS_TEST'
+ - name: testprep
+ run: |
+ sudo apt-get update
+ sudo apt-get install tcl8.6 tclx valgrind -y
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --valgrind --no-latency --verbose --clients 1 --timeout 2400 --dump-logs ${{github.event.inputs.test_args}}
+
+ test-valgrind-misc:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'valgrind') && !(contains(github.event.inputs.skiptests, 'modules') && contains(github.event.inputs.skiptests, 'unittest'))
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make valgrind REDIS_CFLAGS='-Werror -DREDIS_TEST'
+ - name: testprep
+ run: |
+ sudo apt-get update
+ sudo apt-get install tcl8.6 tclx valgrind -y
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --valgrind --no-latency --verbose --clients 1 --timeout 2400 --dump-logs ${{github.event.inputs.test_args}}
+ - name: unittest
+ if: true && !contains(github.event.inputs.skiptests, 'unittest')
+ run: |
+ valgrind --track-origins=yes --suppressions=./src/valgrind.sup --show-reachable=no --show-possibly-lost=no --leak-check=full --log-file=err.txt ./src/redis-server test all --valgrind
+ if grep -q 0x err.txt; then cat err.txt; exit 1; fi
+
+ test-valgrind-no-malloc-usable-size-test:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'valgrind') && !contains(github.event.inputs.skiptests, 'redis')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make valgrind CFLAGS="-DNO_MALLOC_USABLE_SIZE -DREDIS_TEST" REDIS_CFLAGS='-Werror'
+ - name: testprep
+ run: |
+ sudo apt-get update
+ sudo apt-get install tcl8.6 tclx valgrind -y
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --valgrind --no-latency --verbose --clients 1 --timeout 2400 --dump-logs ${{github.event.inputs.test_args}}
+
+ test-valgrind-no-malloc-usable-size-misc:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'valgrind') && !(contains(github.event.inputs.skiptests, 'modules') && contains(github.event.inputs.skiptests, 'unittest'))
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make valgrind CFLAGS="-DNO_MALLOC_USABLE_SIZE -DREDIS_TEST" REDIS_CFLAGS='-Werror'
+ - name: testprep
+ run: |
+ sudo apt-get update
+ sudo apt-get install tcl8.6 tclx valgrind -y
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --valgrind --no-latency --verbose --clients 1 --timeout 2400 --dump-logs ${{github.event.inputs.test_args}}
+ - name: unittest
+ if: true && !contains(github.event.inputs.skiptests, 'unittest')
+ run: |
+ valgrind --track-origins=yes --suppressions=./src/valgrind.sup --show-reachable=no --show-possibly-lost=no --leak-check=full --log-file=err.txt ./src/redis-server test all --valgrind
+ if grep -q 0x err.txt; then cat err.txt; exit 1; fi
+
+ test-sanitizer-address:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'sanitizer')
+ timeout-minutes: 14400
+ strategy:
+ matrix:
+ compiler: [ gcc, clang ]
+ env:
+ CC: ${{ matrix.compiler }}
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make SANITIZER=address REDIS_CFLAGS='-DREDIS_TEST -Werror'
+ - name: testprep
+ run: |
+ sudo apt-get update
+ sudo apt-get install tcl8.6 tclx -y
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+ - name: unittest
+ if: true && !contains(github.event.inputs.skiptests, 'unittest')
+ run: ./src/redis-server test all
+
+ test-sanitizer-undefined:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'sanitizer')
+ timeout-minutes: 14400
+ strategy:
+ matrix:
+ compiler: [ gcc, clang ]
+ env:
+ CC: ${{ matrix.compiler }}
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make SANITIZER=undefined REDIS_CFLAGS='-DREDIS_TEST -Werror' LUA_DEBUG=yes # we (ab)use this flow to also check Lua C API violations
+ - name: testprep
+ run: |
+ sudo apt-get update
+ sudo apt-get install tcl8.6 tclx -y
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+ - name: unittest
+ if: true && !contains(github.event.inputs.skiptests, 'unittest')
+ run: ./src/redis-server test all --accurate
+
+ test-centos7-jemalloc:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'centos')
+ container: centos:7
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ yum -y install gcc make
+ make REDIS_CFLAGS='-Werror'
+ - name: testprep
+ run: yum -y install which tcl tclx
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+
+ test-centos7-tls-module:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'tls')
+ container: centos:7
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ yum -y install centos-release-scl epel-release
+ yum -y install devtoolset-7 openssl-devel openssl
+ scl enable devtoolset-7 "make BUILD_TLS=module REDIS_CFLAGS='-Werror'"
+ - name: testprep
+ run: |
+ yum -y install tcl tcltls tclx
+ ./utils/gen-test-certs.sh
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: |
+ ./runtest --accurate --verbose --dump-logs --tls-module --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: |
+ ./runtest-moduleapi --verbose --dump-logs --tls-module --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: |
+ ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: |
+ ./runtest-cluster --tls-module ${{github.event.inputs.cluster_test_args}}
+
+ test-centos7-tls-module-no-tls:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'tls')
+ container: centos:7
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ yum -y install centos-release-scl epel-release
+ yum -y install devtoolset-7 openssl-devel openssl
+ scl enable devtoolset-7 "make BUILD_TLS=module REDIS_CFLAGS='-Werror'"
+ - name: testprep
+ run: |
+ yum -y install tcl tcltls tclx
+ ./utils/gen-test-certs.sh
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: |
+ ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: |
+ ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: |
+ ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: |
+ ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+
+ test-macos-latest:
+ runs-on: macos-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'macos') && !(contains(github.event.inputs.skiptests, 'redis') && contains(github.event.inputs.skiptests, 'modules'))
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make REDIS_CFLAGS='-Werror'
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --verbose --clients 1 --no-latency --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --verbose --verbose --clients 1 --no-latency --dump-logs ${{github.event.inputs.test_args}}
+
+ test-macos-latest-sentinel:
+ runs-on: macos-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'macos') && !contains(github.event.inputs.skiptests, 'sentinel')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make REDIS_CFLAGS='-Werror'
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+
+ test-macos-latest-cluster:
+ runs-on: macos-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'macos') && !contains(github.event.inputs.skiptests, 'cluster')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make REDIS_CFLAGS='-Werror'
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+
+ test-freebsd:
+ runs-on: macos-12
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'freebsd') && !(contains(github.event.inputs.skiptests, 'redis') && contains(github.event.inputs.skiptests, 'modules'))
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: test
+ uses: vmactions/freebsd-vm@v0.3.1
+ with:
+ usesh: true
+ sync: rsync
+ copyback: false
+ prepare: pkg install -y bash gmake lang/tcl86 lang/tclx
+ run: >
+ gmake || exit 1 ;
+ if echo "${{github.event.inputs.skiptests}}" | grep -vq redis ; then ./runtest --verbose --timeout 2400 --no-latency --dump-logs ${{github.event.inputs.test_args}} || exit 1 ; fi ;
+ if echo "${{github.event.inputs.skiptests}}" | grep -vq modules ; then MAKE=gmake ./runtest-moduleapi --verbose --timeout 2400 --no-latency --dump-logs ${{github.event.inputs.test_args}} || exit 1 ; fi ;
+
+ test-freebsd-sentinel:
+ runs-on: macos-12
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'freebsd') && !contains(github.event.inputs.skiptests, 'sentinel')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: test
+ uses: vmactions/freebsd-vm@v0.3.1
+ with:
+ usesh: true
+ sync: rsync
+ copyback: false
+ prepare: pkg install -y bash gmake lang/tcl86 lang/tclx
+ run: >
+ gmake || exit 1 ;
+ if echo "${{github.event.inputs.skiptests}}" | grep -vq sentinel ; then ./runtest-sentinel ${{github.event.inputs.cluster_test_args}} || exit 1 ; fi ;
+
+ test-freebsd-cluster:
+ runs-on: macos-12
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'freebsd') && !contains(github.event.inputs.skiptests, 'cluster')
+ timeout-minutes: 14400
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: test
+ uses: vmactions/freebsd-vm@v0.3.1
+ with:
+ usesh: true
+ sync: rsync
+ copyback: false
+ prepare: pkg install -y bash gmake lang/tcl86 lang/tclx
+ run: >
+ gmake || exit 1 ;
+ if echo "${{github.event.inputs.skiptests}}" | grep -vq cluster ; then ./runtest-cluster ${{github.event.inputs.cluster_test_args}} || exit 1 ; fi ;
+
+ test-alpine-jemalloc:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'alpine')
+ container: alpine:latest
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ apk add build-base
+ make REDIS_CFLAGS='-Werror'
+ - name: testprep
+ run: apk add tcl procps tclx
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+
+ test-alpine-libc-malloc:
+ runs-on: ubuntu-latest
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'alpine')
+ container: alpine:latest
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: |
+ apk add build-base
+ make REDIS_CFLAGS='-Werror' USE_JEMALLOC=no CFLAGS=-DUSE_MALLOC_USABLE_SIZE
+ - name: testprep
+ run: apk add tcl procps tclx
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --accurate --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster ${{github.event.inputs.cluster_test_args}}
+
+ reply-schemas-validator:
+ runs-on: ubuntu-latest
+ timeout-minutes: 14400
+ if: |
+ (github.event_name == 'workflow_dispatch' || (github.event_name != 'workflow_dispatch' && github.repository == 'redis/redis')) &&
+ !contains(github.event.inputs.skipjobs, 'reply-schema')
+ steps:
+ - name: prep
+ if: github.event_name == 'workflow_dispatch'
+ run: |
+ echo "GITHUB_REPOSITORY=${{github.event.inputs.use_repo}}" >> $GITHUB_ENV
+ echo "GITHUB_HEAD_REF=${{github.event.inputs.use_git_ref}}" >> $GITHUB_ENV
+ echo "skipjobs: ${{github.event.inputs.skipjobs}}"
+ echo "skiptests: ${{github.event.inputs.skiptests}}"
+ echo "test_args: ${{github.event.inputs.test_args}}"
+ echo "cluster_test_args: ${{github.event.inputs.cluster_test_args}}"
+ - uses: actions/checkout@v3
+ with:
+ repository: ${{ env.GITHUB_REPOSITORY }}
+ ref: ${{ env.GITHUB_HEAD_REF }}
+ - name: make
+ run: make REDIS_CFLAGS='-Werror -DLOG_REQ_RES'
+ - name: testprep
+ run: sudo apt-get install tcl8.6 tclx
+ - name: test
+ if: true && !contains(github.event.inputs.skiptests, 'redis')
+ run: ./runtest --log-req-res --no-latency --dont-clean --force-resp3 --tags -slow --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: module api test
+ if: true && !contains(github.event.inputs.skiptests, 'modules')
+ run: ./runtest-moduleapi --log-req-res --no-latency --dont-clean --force-resp3 --dont-pre-clean --verbose --dump-logs ${{github.event.inputs.test_args}}
+ - name: sentinel tests
+ if: true && !contains(github.event.inputs.skiptests, 'sentinel')
+ run: ./runtest-sentinel --log-req-res --dont-clean --force-resp3 ${{github.event.inputs.cluster_test_args}}
+ - name: cluster tests
+ if: true && !contains(github.event.inputs.skiptests, 'cluster')
+ run: ./runtest-cluster --log-req-res --dont-clean --force-resp3 ${{github.event.inputs.cluster_test_args}}
+ - name: Install Python dependencies
+ uses: py-actions/py-dependency-install@v4
+ with:
+ path: "./utils/req-res-validator/requirements.txt"
+ - name: validator
+ run: ./utils/req-res-log-validator.py --verbose --fail-missing-reply-schemas ${{ (!contains(github.event.inputs.skiptests, 'redis') && !contains(github.event.inputs.skiptests, 'module') && !contains(github.event.inputs.sentinel, 'redis') && !contains(github.event.inputs.skiptests, 'cluster')) && github.event.inputs.test_args == '' && github.event.inputs.cluster_test_args == '' && '--fail-commands-not-all-hit' || '' }}
+
diff --git a/.github/workflows/external.yml b/.github/workflows/external.yml
new file mode 100644
index 0000000..15a9afb
--- /dev/null
+++ b/.github/workflows/external.yml
@@ -0,0 +1,82 @@
+name: External Server Tests
+
+on:
+ pull_request:
+ push:
+ schedule:
+ - cron: '0 0 * * *'
+
+jobs:
+ test-external-standalone:
+ runs-on: ubuntu-latest
+ if: github.event_name != 'schedule' || github.repository == 'redis/redis'
+ timeout-minutes: 14400
+ steps:
+ - uses: actions/checkout@v3
+ - name: Build
+ run: make REDIS_CFLAGS=-Werror
+ - name: Start redis-server
+ run: |
+ ./src/redis-server --daemonize yes --save "" --logfile external-redis.log \
+ --enable-protected-configs yes --enable-debug-command yes --enable-module-command yes
+ - name: Run external test
+ run: |
+ ./runtest \
+ --host 127.0.0.1 --port 6379 \
+ --tags -slow
+ - name: Archive redis log
+ if: ${{ failure() }}
+ uses: actions/upload-artifact@v3
+ with:
+ name: test-external-redis-log
+ path: external-redis.log
+
+ test-external-cluster:
+ runs-on: ubuntu-latest
+ if: github.event_name != 'schedule' || github.repository == 'redis/redis'
+ timeout-minutes: 14400
+ steps:
+ - uses: actions/checkout@v3
+ - name: Build
+ run: make REDIS_CFLAGS=-Werror
+ - name: Start redis-server
+ run: |
+ ./src/redis-server --cluster-enabled yes --daemonize yes --save "" --logfile external-redis.log \
+ --enable-protected-configs yes --enable-debug-command yes --enable-module-command yes
+ - name: Create a single node cluster
+ run: ./src/redis-cli cluster addslots $(for slot in {0..16383}; do echo $slot; done); sleep 5
+ - name: Run external test
+ run: |
+ ./runtest \
+ --host 127.0.0.1 --port 6379 \
+ --cluster-mode \
+ --tags -slow
+ - name: Archive redis log
+ if: ${{ failure() }}
+ uses: actions/upload-artifact@v3
+ with:
+ name: test-external-cluster-log
+ path: external-redis.log
+
+ test-external-nodebug:
+ runs-on: ubuntu-latest
+ if: github.event_name != 'schedule' || github.repository == 'redis/redis'
+ timeout-minutes: 14400
+ steps:
+ - uses: actions/checkout@v3
+ - name: Build
+ run: make REDIS_CFLAGS=-Werror
+ - name: Start redis-server
+ run: |
+ ./src/redis-server --daemonize yes --save "" --logfile external-redis.log
+ - name: Run external test
+ run: |
+ ./runtest \
+ --host 127.0.0.1 --port 6379 \
+ --tags "-slow -needs:debug"
+ - name: Archive redis log
+ if: ${{ failure() }}
+ uses: actions/upload-artifact@v3
+ with:
+ name: test-external-redis-log
+ path: external-redis.log
diff --git a/.github/workflows/reply-schemas-linter.yml b/.github/workflows/reply-schemas-linter.yml
new file mode 100644
index 0000000..13fc8ab
--- /dev/null
+++ b/.github/workflows/reply-schemas-linter.yml
@@ -0,0 +1,22 @@
+name: Reply-schemas linter
+
+on:
+ push:
+ paths:
+ - 'src/commands/*.json'
+ pull_request:
+ paths:
+ - 'src/commands/*.json'
+
+jobs:
+ reply-schemas-linter:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+ - name: Setup nodejs
+ uses: actions/setup-node@v3
+ - name: Install packages
+ run: npm install ajv
+ - name: linter
+ run: node ./utils/reply_schema_linter.js
+
diff --git a/.github/workflows/spell-check.yml b/.github/workflows/spell-check.yml
new file mode 100644
index 0000000..5336074
--- /dev/null
+++ b/.github/workflows/spell-check.yml
@@ -0,0 +1,32 @@
+# A CI action that using codespell to check spell.
+# .github/.codespellrc is a config file.
+# .github/wordlist.txt is a list of words that will ignore word checks.
+# More details please check the following link:
+# https://github.com/codespell-project/codespell
+name: Spellcheck
+
+on:
+ push:
+ pull_request:
+
+jobs:
+ build:
+ name: Spellcheck
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v3
+
+ - name: pip cache
+ uses: actions/cache@v3
+ with:
+ path: ~/.cache/pip
+ key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
+ restore-keys: ${{ runner.os }}-pip-
+
+ - name: Install prerequisites
+ run: sudo pip install -r ./.codespell/requirements.txt
+
+ - name: Spell check
+ run: codespell --config=./.codespell/.codespellrc