diff options
author | Kristján Valur Jónsson <sweskman@gmail.com> | 2022-08-29 21:30:08 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-29 14:30:08 -0700 |
commit | 8491a65a95527ced112310faa068eba395212a32 (patch) | |
tree | bd7c8036f0cf63746b9422ee6791d09f3ed2de23 | |
parent | 77e4f09ea8e01a500586c6b2aa37a76c98e172f0 (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.yml | 102 | ||||
-rw-r--r-- | Makefile | 6 | ||||
-rwxr-xr-x | test.sh | 47 |
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 @@ -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) @@ -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} |