summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristján Valur Jónsson <sweskman@gmail.com>2022-08-29 21:30:08 +0000
committerGitHub <noreply@github.com>2022-08-29 14:30:08 -0700
commit8491a65a95527ced112310faa068eba395212a32 (patch)
treebd7c8036f0cf63746b9422ee6791d09f3ed2de23
parent77e4f09ea8e01a500586c6b2aa37a76c98e172f0 (diff)
Add Github Actions CI workflow for hiredis: Arm, Arm64, 386, windows. (#943)
* Add docker support to test.sh specifying a REDIS_DOCKER env var will run this as a server. * Add initial test workflow * Add workflow test to test 32 bit build * Add ARM x compilation tests * Add tests for windows platform * Test with valgrind
-rw-r--r--.github/workflows/test.yml102
-rw-r--r--Makefile6
-rwxr-xr-xtest.sh47
3 files changed, 141 insertions, 14 deletions
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 0000000..baf5c82
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,102 @@
+name: C/C++ CI
+
+on:
+ push:
+ branches: [ master, dev ]
+ pull_request:
+ branches: [ master ]
+
+jobs:
+ full-build:
+ name: Build all, plus default examples, run tests against redis
+
+ runs-on: ubuntu-latest
+ env:
+ # the docker image used by the test.sh
+ REDIS_DOCKER: redis:alpine
+
+ steps:
+
+ - name: install prerequisites
+ run: sudo apt-get update && sudo apt-get install -y libev-dev libevent-dev libglib2.0-dev libssl-dev valgrind
+ - uses: actions/checkout@v2
+ - name: run make
+ run: make all examples
+ - name: Run unittests
+ run: make check
+ - name: Run tests with valgrind
+ env:
+ TEST_PREFIX: valgrind --error-exitcode=100
+ SKIPS_ARG: --skip-throughput
+ run: make check
+
+ build-32-bit:
+ name: Build and test minimal 32 bit linux
+ runs-on: ubuntu-latest
+ steps:
+ - name: install prerequisites
+ run: sudo apt-get update && sudo apt-get install gcc-multilib
+ - uses: actions/checkout@v2
+ - name: run make
+ run: make all
+ env:
+ PLATFORM_FLAGS: -m32
+ - name: Run unittests
+ env:
+ REDIS_DOCKER: redis:alpine
+ run: make check
+
+ build-arm:
+ name: Cross-compile and test arm linux with Qemu
+ runs-on: ubuntu-latest
+ strategy:
+ matrix:
+ include:
+ - name: arm
+ toolset: arm-linux-gnueabi
+ emulator: qemu-arm
+ - name: aarch64
+ toolset: aarch64-linux-gnu
+ emulator: qemu-aarch64
+
+ steps:
+ - name: install qemu
+ if: matrix.emulator
+ run: sudo apt-get install -y qemu-user
+ - name: install ploatform toolset
+ if: matrix.toolset
+ run: sudo apt-get install -y gcc-${{matrix.toolset}}
+ - uses: actions/checkout@v2
+ - name: run make
+ run: make all
+ env:
+ CC: ${{matrix.toolset}}-gcc
+ AR: ${{matrix.toolset}}-ar
+ - name: Run unittests
+ env:
+ REDIS_DOCKER: redis:alpine
+ TEST_PREFIX: ${{matrix.emulator}} -L /usr/${{matrix.toolset}}/
+ run: make check
+
+ build-windows:
+ name: Build and test on windows 64 bit Intel
+ runs-on: windows-latest
+ steps:
+ - uses: microsoft/setup-msbuild@v1.0.2
+ - uses: actions/checkout@v2
+ - name: Cmake
+ run: cmake -Wno-dev CmakeLists.txt
+ - name: build redis
+ run: MSBuild hiredis.vcxproj /p:Configuration=Debug
+ - name: build redis_static
+ run: MSBuild hiredis_static.vcxproj /p:Configuration=Debug
+ - name: build redis-test
+ run: MSBuild hiredis-test.vcxproj /p:Configuration=Debug
+ # use memurai, redis compatible server, since it is easy to install. Can't
+ # install official redis containers on the windows runner
+ - name: install Memurai redis server
+ run: choco install -y memurai-developer.install
+ - name: run tests
+ run: Debug\hiredis-test.exe
+
+ \ No newline at end of file
diff --git a/Makefile b/Makefile
index 667a600..94fbc2f 100644
--- a/Makefile
+++ b/Makefile
@@ -41,7 +41,7 @@ CXX:=$(shell sh -c 'type $${CXX%% *} >/dev/null 2>/dev/null && echo $(CXX) || ec
OPTIMIZATION?=-O3
WARNINGS=-Wall -W -Wstrict-prototypes -Wwrite-strings -Wno-missing-field-initializers
DEBUG_FLAGS?= -g -ggdb
-REAL_CFLAGS=$(OPTIMIZATION) -fPIC $(CPPFLAGS) $(CFLAGS) $(WARNINGS) $(DEBUG_FLAGS)
+REAL_CFLAGS=$(OPTIMIZATION) -fPIC $(CPPFLAGS) $(CFLAGS) $(WARNINGS) $(DEBUG_FLAGS) $(PLATFORM_FLAGS)
REAL_LDFLAGS=$(LDFLAGS)
DYLIBSUFFIX=so
@@ -50,7 +50,7 @@ DYLIB_MINOR_NAME=$(LIBNAME).$(DYLIBSUFFIX).$(HIREDIS_SONAME)
DYLIB_MAJOR_NAME=$(LIBNAME).$(DYLIBSUFFIX).$(HIREDIS_MAJOR)
DYLIBNAME=$(LIBNAME).$(DYLIBSUFFIX)
-DYLIB_MAKE_CMD=$(CC) -shared -Wl,-soname,$(DYLIB_MINOR_NAME)
+DYLIB_MAKE_CMD=$(CC) $(PLATFORM_FLAGS) -shared -Wl,-soname,$(DYLIB_MINOR_NAME)
STLIBNAME=$(LIBNAME).$(STLIBSUFFIX)
STLIB_MAKE_CMD=$(AR) rcs
@@ -63,7 +63,7 @@ SSL_DYLIB_MINOR_NAME=$(SSL_LIBNAME).$(DYLIBSUFFIX).$(HIREDIS_SONAME)
SSL_DYLIB_MAJOR_NAME=$(SSL_LIBNAME).$(DYLIBSUFFIX).$(HIREDIS_MAJOR)
SSL_DYLIBNAME=$(SSL_LIBNAME).$(DYLIBSUFFIX)
SSL_STLIBNAME=$(SSL_LIBNAME).$(STLIBSUFFIX)
-SSL_DYLIB_MAKE_CMD=$(CC) -shared -Wl,-soname,$(SSL_DYLIB_MINOR_NAME)
+SSL_DYLIB_MAKE_CMD=$(CC) $(PLATFORM_FLAGS) -shared -Wl,-soname,$(SSL_DYLIB_MINOR_NAME)
USE_SSL?=0
ifeq ($(USE_SSL),1)
diff --git a/test.sh b/test.sh
index a518db7..0a1afb9 100755
--- a/test.sh
+++ b/test.sh
@@ -4,10 +4,11 @@ REDIS_SERVER=${REDIS_SERVER:-redis-server}
REDIS_PORT=${REDIS_PORT:-56379}
REDIS_SSL_PORT=${REDIS_SSL_PORT:-56443}
TEST_SSL=${TEST_SSL:-0}
-SKIPS_AS_FAILS=${SKIPS_AS_FAILS-:0}
+SKIPS_AS_FAILS=${SKIPS_AS_FAILS:-0}
ENABLE_DEBUG_CMD=
SSL_TEST_ARGS=
-SKIPS_ARG=
+SKIPS_ARG=${SKIPS_ARG:-}
+REDIS_DOCKER=${REDIS_DOCKER:-}
# We need to enable the DEBUG command for redis-server >= 7.0.0
REDIS_MAJOR_VERSION="$(redis-server --version|awk -F'[^0-9]+' '{ print $2 }')"
@@ -50,22 +51,34 @@ if [ "$TEST_SSL" = "1" ]; then
fi
cleanup() {
- set +e
- kill $(cat ${PID_FILE})
+ if [ -n "${REDIS_DOCKER}" ] ; then
+ docker kill redis-test-server
+ else
+ set +e
+ kill $(cat ${PID_FILE})
+ fi
rm -rf ${tmpdir}
}
trap cleanup INT TERM EXIT
-
+# base config
cat > ${tmpdir}/redis.conf <<EOF
-daemonize yes
-${ENABLE_DEBUG_CMD}
pidfile ${PID_FILE}
port ${REDIS_PORT}
-bind 127.0.0.1
unixsocket ${SOCK_FILE}
+unixsocketperm 777
+EOF
+
+# if not running in docker add these:
+if [ ! -n "${REDIS_DOCKER}" ]; then
+cat >> ${tmpdir}/redis.conf <<EOF
+daemonize yes
+${ENABLE_DEBUG_CMD}
+bind 127.0.0.1
EOF
+fi
+# if doing ssl, add these
if [ "$TEST_SSL" = "1" ]; then
cat >> ${tmpdir}/redis.conf <<EOF
tls-port ${REDIS_SSL_PORT}
@@ -75,13 +88,25 @@ tls-key-file ${SSL_KEY}
EOF
fi
+echo ${tmpdir}
cat ${tmpdir}/redis.conf
-${REDIS_SERVER} ${tmpdir}/redis.conf
-
+if [ -n "${REDIS_DOCKER}" ] ; then
+ chmod a+wx ${tmpdir}
+ chmod a+r ${tmpdir}/*
+ docker run -d --rm --name redis-test-server \
+ -p ${REDIS_PORT}:${REDIS_PORT} \
+ -p ${REDIS_SSL_PORT}:${REDIS_SSL_PORT} \
+ -v ${tmpdir}:${tmpdir} \
+ ${REDIS_DOCKER} \
+ redis-server ${tmpdir}/redis.conf
+else
+ ${REDIS_SERVER} ${tmpdir}/redis.conf
+fi
# Wait until we detect the unix socket
+echo waiting for server
while [ ! -S "${SOCK_FILE}" ]; do sleep 1; done
# Treat skips as failures if directed
-[ "$SKIPS_AS_FAILS" = 1 ] && SKIPS_ARG="--skips-as-fails"
+[ "$SKIPS_AS_FAILS" = 1 ] && SKIPS_ARG="${SKIPS_ARG} --skips-as-fails"
${TEST_PREFIX:-} ./hiredis-test -h 127.0.0.1 -p ${REDIS_PORT} -s ${SOCK_FILE} ${SSL_TEST_ARGS} ${SKIPS_ARG}