Travis CI Testing for NodeJS and Redis with a Restored AOF File
Following our previous blog post about Neo4j and Travis-CI this post covers how to use a restored Redis DB as data source for testing within a NodeJS app.
Main requirement: Use a restore of a Redis AOF File as a data source for NodeJS unit/component/integration tests.
Overview
That is the final file ... maybe it is easier installing Redis "by hand" than using the pre-configured Travis-CI services
and maybe there are other ways to configure these services
(before its initial upstart) by e.g. a config.yaml
as stated here for some other database types ... Nevertheless this is one possible solution:
dist: trusty
sudo: required
language: node_js
node_js:
- "6"
services:
- redis-server
before_script:
- npm install
- cp ./config/travis/dnb_tst2_app6_s1_wb_cert_key.pem ~
- cp ./config/travis/dnb_tst2_app6_s1_wb_cert_pub.pem ~
- cp ./config/travis/data.tar ~
- sudo service redis-server stop
- sleep 10
- sudo cat /etc/redis/redis.conf
- sudo sed -i 's|appendonly no|appendonly yes|g' /etc/redis/redis.conf
- sudo sed -i "s|# requirepass foobared|requirepass ${DNB_ENV_APP_S2_DB_PASS}|g" /etc/redis/redis.conf
- sudo cat /etc/redis/redis.conf
- sudo ls -al /var/lib/redis
- sudo find /var/lib/redis -mindepth 1 -delete
- sudo tar -xvf ~/data.tar -C /var/lib/redis --strip 1
- sudo chown redis:redis /var/lib/redis/appendonly.aof
- sudo chmod 660 /var/lib/redis/appendonly.aof
- sudo ls -al /var/lib/redis
- sudo service redis-server start
- sleep 20
script:
- sudo cat /var/log/redis/redis-server.log
- swagger project start &
- sleep 10
- swagger project test
The whole can be found on Github.
Step by step
We use the following base image:
dist: trusty
sudo: required
And then declare the service
utility to use:
services:
- redis-server
In the before_script
stage we then copy the data.tar
backup file to the travis
user home directory:
before_script:
...
- cp ./config/travis/data.tar ~
Travis-CI services
start at very first of the build cycle with the default Travis-CI config. As a consequence one needs to stop
the Redis service
and sleep
a little before doing a custom configuration:
- sudo service redis-server stop
- sleep 10
After having stopped Redis we can start reconfiguring it ... First we edit the config file redis.conf
so that Redis will use appendonly
for data persistence (you might as well drop this setting and leave it with the RDB mode ... it is even faster at startup ... depends on the backup file you want to restore), then enable password authentication via requirepass
, and the print the edited redis.conf
file:
- sudo sed -i 's|appendonly no|appendonly yes|g' /etc/redis/redis.conf
- sudo sed -i "s|# requirepass foobared|requirepass ${DNB_ENV_APP_S2_DB_PASS}|g" /etc/redis/redis.conf
- sudo cat /etc/redis/redis.conf
Next we take care of the data ... The pre-configured data path is /var/lib/redis
which we delete
completely, then tar
the backup file into it, and adjust file permissions
and ownership
afterwards. Just in case we list the contents to be able to compare the pre-configured with our customized settings:
- sudo ls -al /var/lib/redis
- sudo find /var/lib/redis -mindepth 1 -delete
- sudo tar -xvf ~/data.tar -C /var/lib/redis --strip 1
- sudo chown redis:redis /var/lib/redis/appendonly.aof
- sudo chmod 660 /var/lib/redis/appendonly.aof
- sudo ls -al /var/lib/redis
After that there are only two more steps in the before_script
stage ... start
the redis-server
service and then wait a little to make sure that Redis is up in the next build stage:
- sudo service redis-server start
- sleep 20
Almost done ... in the script
build stage we look into redis-server.log
to check the correct start-up and then we can start NodeJS (here with the swagger
commands), sleep again a little, and then test:
script:
- sudo cat /var/log/redis/redis-server.log
- swagger project start &
- sleep 10
- swagger project test
Have fun testing.
Further Information
Github Repo:
https://github.com/daten-und-bass/postcode-geopos-api/
https://github.com/daten-und-bass/postcode-geopos-api/blob/master/.travis.yml
Travis-CI:
https://docs.travis-ci.com/user/database-setup/
Redis Data Persistence Options:
https://redis.io/topics/persistence
Neo4j and Travis-CI:
https://daten-und-bass.io/blog/travis-ci-testing-for-nodejs-and-neo4j-with-a-restored-db-backup/