How to run integration test inside a docker container in drone pipeline

3.2k views Asked by At

I have a docker image built up for mongodb test. You can be found from zhaoyi0113/mongo-uat. When start a docker container from this image, it will create a few mongodb instances which will take a few minutes to startup. Now I want to run my integration test cases inside this container by drone CI. Below is my .drone.yml file:

pipeline:
  build:
    image: node:latest
    commands:
      - npm install
      - npm test
      - npm run eslint
  integration:
    image: zhaoyi0113/mongo-uat
    commands:
      - npm install
      - npm run integration

There are two steps in this pipeline, the first is to run unit test in a nodejs project. The second one integration is used to run integration test cases in the mongodb docker image.

when I run drone exec it will get an error failed to connect to mongo instance. I think that because the mongodb instance needs a few minutes to startup. The commands npm install and npm run integration should be run after the mongodb instance launched. How can I delay the build commands?

EDIT1

The image zhaoyi0113/mongo-uat has mongodb environment. It will create a few mongodb instances. I can run this command docker run -d zhaoyi0113/mongo-uat to launch this container after that I can attach to this container to see the mongodb instances. I am not sure how drone launch the docker container.

2

There are 2 answers

0
Brad Rydzewski On BEST ANSWER

The recommended approach to integration testing is to place your service containers in the service section of the Yaml [1][2]

Therefore in order to start a Mongo service container I would create the below Yaml file. The Mongo service will start on the default port at 127.0.0.1 and be accessible from your pipeline containers.

pipeline:
  test:
    image: node
    commands:
      - npm install
      - npm run test
  integration:
    image: node
    commands:
      - npm run integration

services:
  mongo:
    image: mongo:3.0

This is the recommended approach for testing services like MySQL, Postgres, Mongo and more.

[1] http://readme.drone.io/usage/getting-started/#services
[2] http://readme.drone.io/usage/services-guide/

0
jvda On

As a short addendum to Brads answer: While the mongo service will run on 127.0.0.1 on the drone host machine - it will not be possible to reach the service from this IP within the node app. To access the service you would reference its service name (here: mongo).