Доступ к PostgreSQL 9.6 из Spring Boot в CircleCi

у меня есть приложение Spring Boot, которое в настоящее время строит и запускает тесты в CI Heroku, и я пытаюсь заставить его работать в Circle CI. Мой конфигурационный файл выглядит так:

version: 2
jobs:
  build:
    docker:
      - image: circleci/jdk8:0.1.1
      - image: postgres:9.6
    working_directory: ~/repo

    environment:
      # Customize the JVM maximum heap limit
      JVM_OPTS: -Xmx3200m
      TERM: dumb

    steps:
      - checkout
      - run: chmod +x gradlew

      # Download and cache dependencies
      - restore_cache:
          keys:
          - v1-dependencies-{{ checksum "build.gradle" }}
          # fallback to using the latest cache if no exact match is found
          - v1-dependencies-

      - run: ./gradlew dependencies

      - save_cache:
          paths:
            - ~/.m2
          key: v1-dependencies-{{ checksum "build.gradle" }}

      # run tests!
      - run: ./gradlew test

Я пробовал различные способы определения DATABASE_URL без эффекта:

jobs:
  build:
    docker:
      - image: circleci/jdk8:0.1.1
        environment:
        - DATABASE_URL=postgresql://dashman_test@localhost:5433/dashman_test
      - image: postgres:9.6
        environment:
        - POSTGRES_USER=dashman_test
        - POSTGRES_DB=dashman_test

jobs:
  build:
    docker:
      - image: circleci/jdk8:0.1.1
        environment:
        - DATABASE_URL=postgresql://dashman_test@localhost:5434/dashman_test
      - image: postgres:9.6
        environment:
        - POSTGRES_USER=dashman_test
        - POSTGRES_DB=dashman_test

jobs:
  build:
    docker:
      - image: circleci/jdk8:0.1.1
        environment:
          DATABASE_URL: postgresql://dashman_test@localhost:5434/dashman_test
      - image: postgres:9.6
        environment:
          POSTGRES_USER: dashman_test
          POSTGRES_DB: dashman_test


TEST_DATABASE_URL: postgresql://ubuntu@localhost/circle_test?sslmode=disable        
DATABASE_URL: postgresql://ubuntu@localhost/circle_test?sslmode=disable

DATABASE_URL: postgres://ubuntu:@127.0.0.1:5433/circle_test

DATABASE_URL: postgres://localhost:5433/dashman_test

DATABASE_URL: postgresql://ubuntu@localhost:5434/circle_test?sslmode=disable

DATABASE_URL: postgres://dashman_test:KnDnHtzneyTzps0WuYr35r9@localhost:5433/dashman_test

ничего не работает, я всегда заканчиваю с этой ошибкой:

tech.dashman.dashmanserver.models.AccountTest > create FAILED
    java.lang.IllegalStateException
        Caused by: org.springframework.beans.factory.BeanCreationException
            Caused by: org.springframework.beans.BeanInstantiationException
                Caused by: org.springframework.beans.factory.BeanCreationException
                    Caused by: org.springframework.beans.BeanInstantiationException
                        Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException

tech.dashman.dashmanserver.models.UserTest > create FAILED
    java.lang.IllegalStateException
        Caused by: org.springframework.beans.factory.BeanCreationException
            Caused by: org.springframework.beans.BeanInstantiationException
                Caused by: org.springframework.beans.factory.BeanCreationException
                    Caused by: org.springframework.beans.BeanInstantiationException
                        Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException

tech.dashman.dashmanserver.DashmanserverApplicationTests > contextLoads FAILED
    java.lang.IllegalStateException
        Caused by: org.springframework.beans.factory.BeanCreationException
            Caused by: org.springframework.beans.BeanInstantiationException
                Caused by: org.springframework.beans.factory.BeanCreationException
                    Caused by: org.springframework.beans.BeanInstantiationException
                        Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException

Как правильно настроить базу данных? Я немного заблудился.

1 ответов


вот несколько моментов, которые должны помочь вам решить эту проблему.


(1) документация, которую вы упомянули в комментариях (этот) либо устарел, либо просто вводит в заблуждение. Это:

пользователь по умолчанию, порт, тестовая база данных для PostgreSQL 9.6 следующие: postgres://ubuntu:@127.0.0.1:5432/circle_test

... is не так.

фактический по умолчанию для postgres:9.6 являются:

  • имя пользователя: postgres
  • пароль: <empty>
  • порт: 5432
  • база данных: postgres

вы можете добраться до экземпляра postgres из своего приложения на 127.0.0.1.

вы можете найти более подробную информацию о дефолтах здесь но есть загвоздка в их установке (подробнее об этом в (3)).


(2) насколько я знай нет способа передать usrename\password в JDBC url для postgres connector, поэтому вам, вероятно, придется сообщить вашему приложению не только DATABASE_URL, но и что-то вроде DATABASE_USER и DATABASE_PASSWORD.

эта часть зависит от особенностей вашего приложения, но для типичного приложения spring boot с настройками базы данных по умолчанию вы хотите получить следующие настройки:

spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=

(3) кроме того, если ваш параметры подключения жестко прописаны вы, вероятно, хотите настроить учетные данные для экземпляра базы данных Postgres.

к сожалению, даже если параметр POSTGRES_* переменные среды при запуске контейнера с docker run отлично работает, устанавливая их в .circleci/config.yml не работает. Есть несколько открытых отчетов об ошибках (1, 2) описывая эту или подобную проблему, и мои деньги на этом являются ошибкой.

к счастью, вы все еще можете обойти это путем установки psql и создание необходимых учетных данных пользователя во время сборки (учетные данные по умолчанию все еще работают). Добавив что-то вроде:

  - run: apt-get update -qq && apt-get install -y postgresql
  - run:
      command: |
        psql -h 127.0.0.1 -U postgres -c "CREATE DATABASE databasename;"
        psql -h 127.0.0.1 -U postgres -c "CREATE USER username WITH PASSWORD 'password'; GRANT ALL PRIVILEGES ON DATABASE databasename TO username;"

... к вашим steps должен сделать трюк (см. полный пример здесь).

используя машина исполнителем для запуска postgres вручную (см. Последний пример на на этой странице) может быть тоже вариант, но я не пробовал это сам.


(4) я на самом деле пробовал настроить это для себя, и вы можете проверить РЕПО с здесь рабочая версия. Build пример вывода здесь.

я использовал этот образец весенней загрузки и использовал postgres, оставил только соответствующие тесты, добавил circle ci вместе с другими незначительными настройками. Он демонстрирует как конфигурирование приложения через env. переменные и настройка экземпляра postgres.

самые интересные части являются .circleci/config.yml (где полномочия env. переменные определены, и user\db создается в экземпляре postgres):

version: 2
jobs:
  build:
    docker:
      - image: maven:3.5.0-jdk-8
        environment:
          DATABASE_URL: jdbc:postgresql://127.0.0.1:5432/databasename
          DATABASE_USER: username
          DATABASE_PASSWORD: password
      - image: postgres:9.6

    working_directory: ~/repo

    steps:
      - checkout
      - run: apt-get update -qq && apt-get install -y postgresql
      - run:
          command: |
            psql -h 127.0.0.1 -U postgres -c "CREATE DATABASE databasename;"
            psql -h 127.0.0.1 -U postgres -c "CREATE USER username WITH PASSWORD 'password'; GRANT ALL PRIVILEGES ON DATABASE databasename TO username;"
- run: mvn test

... и application.properties (где учетные данные env. используются переменные):

spring.h2.console.enabled=false

logging.level.org.hibernate.SQL=error

spring.datasource.url=${DATABASE_URL}
spring.datasource.username=${DATABASE_USER}
spring.datasource.password=${DATABASE_PASSWORD}
spring.jpa.hibernate.ddl-auto=create-drop
spring.jpa.database=POSTGRESQL
spring.datasource.platform=postgres
spring.jpa.show-sql=true
spring.database.driverClassName=org.postgresql.Driver