I’m trying to set up testing automation for a simple Rails app using postgres 10.3. I’ve configured my config.yml as follows…
# Ruby CircleCI 2.0 configuration file
#
# Check https://circleci.com/docs/2.0/language-ruby/ for more details
#
version: 2
jobs:
build:
docker:
# specify the version you desire here
- image: circleci/ruby:2.4.1-node-browsers
# Specify service dependencies here if necessary
# CircleCI maintains a library of pre-built images
# documented at https://circleci.com/docs/2.0/circleci-images/
- image: circleci/postgres:10.4-alpine-postgis
environment:
POSTGRES_USER: postgres
POSTGRES_DB: sun-server_development
working_directory: ~/repo
steps:
- checkout
# Download and cache dependencies
- restore_cache:
keys:
- v1-dependencies-{{ checksum "Gemfile.lock" }}
# fallback to using the latest cache if no exact match is found
- v1-dependencies-
- run:
name: install dependencies
command: |
bundle install --jobs=4 --retry=3 --path vendor/bundle
- save_cache:
paths:
- ./vendor/bundle
key: v1-dependencies-{{ checksum "Gemfile.lock" }}
# found in https://github.com/CircleCI-Public/circleci-demo-ruby-rails/blob/master/.circleci/config.yml
# sgardn
- run:
name: Wait for DB
command: dockerize -wait tcp://localhost:5432 -timeout 1m
- run:
name: Sleep more because CI isn't waiting for DB setup
command: sleep 30
# Database setup
- run: bundle exec rake db:create
- run: bundle exec rake db:schema:load
# run tests!
- run:
name: run tests
command: |
mkdir /tmp/test-results
TEST_FILES="$(circleci tests glob "spec/**/*_spec.rb" | circleci tests split --split-by=timings)"
bundle exec rspec --format progress \
--format RspecJunitFormatter \
--out /tmp/test-results/rspec.xml \
--format progress \
$TEST_FILES
# collect reports
- store_test_results:
path: /tmp/test-results
- store_artifacts:
path: /tmp/test-results
destination: test-results
Which is pretty unsurprising. What is surprising is that the command to run db:create goes ahead and seems to run while the docker image for postgres is still trying to build. What gives? Why would any of the steps run while I’m still trying to set up the database? Here’s what I see from the feedback for the image building for postgres:
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... sh: locale: not found
2018-07-24 20:49:01.391 UTC [79] WARNING: no usable system locales were found
ok
syncing data to disk ... ok
WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
Success. You can now start the database server using:
pg_ctl -D /var/lib/postgresql/data -l logfile start
****************************************************
WARNING: No password has been set for the database.
This will allow anyone with access to the
Postgres port to access your database. In
Docker's default configuration, this is
effectively any other container on the same
system.
Use "-e POSTGRES_PASSWORD=password" to set
it in "docker run".
****************************************************
waiting for server to start....2018-07-24 20:49:03.900 UTC [92] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2018-07-24 20:49:03.909 UTC [93] LOG: database system was shut down at 2018-07-24 20:49:01 UTC
2018-07-24 20:49:03.910 UTC [92] LOG: database system is ready to accept connections
done
server started
CREATE DATABASE
ALTER ROLE
/usr/local/bin/docker-entrypoint.sh: sourcing /docker-entrypoint-initdb.d/postgis.sh
CREATE DATABASE
UPDATE 1
Loading PostGIS extensions into template_postgis
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
Loading PostGIS extensions into sun-server_development
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
CREATE EXTENSION
waiting for server to shut down....2018-07-24 20:49:07.410 UTC [92] LOG: received fast shutdown request
2018-07-24 20:49:07.410 UTC [92] LOG: aborting any active transactions
2018-07-24 20:49:07.411 UTC [92] LOG: worker process: logical replication launcher (PID 99) exited with exit code 1
2018-07-24 20:49:07.416 UTC [94] LOG: shutting down
2018-07-24 20:49:07.439 UTC [92] LOG: database system is shut down
done
server stopped
PostgreSQL init process complete; ready for start up.
2018-07-24 20:49:07.515 UTC [25] LOG: listening on IPv4 address "0.0.0.0", port 5432
2018-07-24 20:49:07.515 UTC [25] LOG: listening on IPv6 address "::", port 5432
2018-07-24 20:49:07.515 UTC [25] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2018-07-24 20:49:07.525 UTC [140] LOG: database system was shut down at 2018-07-24 20:49:07 UTC
2018-07-24 20:49:07.526 UTC [25] LOG: database system is ready to accept connections
2018-07-24 20:49:08.412 UTC [159] LOG: incomplete startup packet
Job was canceled
This is what I see for the rake db:create
command that comes later:
#!/bin/bash -eo pipefail
bundle exec rake db:create
could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?