I am currently running a docker-compose stack for basic integration tests with a protractor test runner, a nodejs server serving a web page and a wildfly server serving a java backend.
The stack is run from a dind(docker in docker) container in my build server(concourse ci).
But it appears that the containers does not terminate on finishing the protractor tests.
So since the containers for wildfly, and nodejs are still running the build task never finishes...
How can I make the compose end in success or failure when the tests are finished?
# Test runner
test-runner:
image: "${RUNNER_IMG}"
privileged: true
links:
- client
- server
volumes:
- /Users/me/frontend_test/client-devops:/protractor/project
- /dev/shm:/dev/shm
entrypoint:
- /entrypoint.sh
- --baseUrl=http://client:9000/dist/
- /protractor/conf-dev.js
- --suite=remember
# Client deployment
client:
image: "${CLIENT_IMG}"
links:
- server
# Server deployment
server:
image: "${SERVER_IMG}"
Compose has added the --exit-code-from {container}
flag to docker-compose up
which makes this easier.
docker-compose up --exit-code-from test-runner
See Michael Spector's answer for more detail.
Similar to this rspec q/a, you need to run the tests as a standalone task that report an exit status back to your CI.
You could separate the test-runner into it's own yaml or modify the test-runner to default to a no op command/entrypoint.
Specify the test-runner
config separately (You might need to upgrade to version 2 networks
instead of using links
to work across multiple compose files).
docker-compose up -d
docker-compose -f test-runner.yml run test-runner
rc=$?
docker-compose down
exit $rc
Default the test-runner
to a no op entrypoint/command and then manually run the test command
services:
test-runner:
image: "${RUNNER_IMG}"
command: 'true'
Then
docker-compose up -d
docker-compose run test-runner /launch-tests.sh
rc=$?
docker-compose down
exit $rc
If your CI has the concept of "post tasks" you might be able to skip the rc
capturing and just run the docker-compose down
after the test-runner CI task has completed. It's also possible your CI cleans up the containers for you.