Share service between build jobs
<!--IssueSummary start--> <details> <summary> Everyone can contribute. [Help move this issue forward](https://handbook.gitlab.com/handbook/marketing/developer-relations/contributor-success/community-contributors-workflows/#contributor-links) while earning points, leveling up and collecting rewards. </summary> - [Close this issue](https://contributors.gitlab.com/manage-issue?action=close&projectId=278964&issueIid=15153) </details> <!--IssueSummary end--> Looking at [services documentation](http://doc.gitlab.com/ee/ci/yaml/README.html#image-and-services) gave me the illusion that when services are defined in root scope, they will be long lived and shared between all stages of a build. However I realised this is not the case, but it could be a great feature. The benefit is clear: lets say I have a Java app that needs OpenJDK image to run. The database however is a PostgreSQL. This means in current setup and I need it to run integration tests. This means in current setup I have to take the OpenJDK image, install at least PostgreSQL client on it using shell scripts, and then I can run my tests. But if it was possible to keep the service running, I could have a DB setup stage that uses postgres image, runs before the java test stages and sets up DB. As an example following build script could be considered: ```yaml stages: - setup - test # lets imagine this service is shared between all stages: services: - postgres:9.4 variables: POSTGRES_DB: pgdb POSTGRES_USER: pguser POSTGRES_PASSWORD: pgpass # this stage sets up DB, no installation needed SetupDB: image: postgres:9.4 stage: setup script: # official way to provide password to psql: http://www.postgresql.org/docs/9.3/static/libpq-envars.html - export PGPASSWORD=$POSTGRES_PASSWORD - psql -h "postgres" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -f "path/to/some/file.sql" # now we have a ready DB for running tests, independent of image used for tests BuildAndTest: image: mohamnag/gradle:2.12 stage: build artifacts: paths: - build/libs/*.war script: # build and run unit tests - gradle clean build # run integration tests - gradle cleanTest integrationTest ```
issue