从CircleCi中的Spring Boot访问PostgreSQL 9.6

pup*_*eno 7 java postgresql spring circleci spring-boot

我有一个Spring Boot应用程序,目前在Heroku的CI中构建并运行测试,我也试图让它在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
Run Code Online (Sandbox Code Playgroud)

我尝试了各种方法来定义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
Run Code Online (Sandbox Code Playgroud)

似乎没有什么工作,我总是最终得到这个错误:

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
Run Code Online (Sandbox Code Playgroud)

配置数据库的正确方法是什么?我有点迷茫.

Eug*_*Loy 8

以下几点可以帮助您解决问题.


(1)您在评论中提到的文件(本文)已过时或具有误导性.这个:

PostgreSQL 9.6的默认用户,端口,测试数据库如下:postgres:// ubuntu:@ 127.0.0.1:5432/circle_test

...... 不是真的.

实际默认值为postgres:9.6:

  • 用户名:postgres
  • 密码: <empty>
  • 港口:5432
  • 数据库:postgres

您可以从您的应用程序到达postgres实例127.0.0.1.

你可以在这里找到更多关于默认值的信息,但有一个关于设置它们的问题(更多关于这个(3)).


(2)据我所知是没有办法通过usrename \密码在Postgres的连接器JDBC URL,所以你可能要告诉你的应用程序,不仅DATABASE_URL也像DATABASE_USERDATABASE_PASSWORD.

此部分取决于您的应用程序的细节,但对于具有默认数据库设置的典型Spring启动应用程序,您希望最终得到以下设置:

spring.datasource.url=jdbc:postgresql://127.0.0.1:5432/postgres
spring.datasource.username=postgres
spring.datasource.password=
Run Code Online (Sandbox Code Playgroud)

(3)或者,如果您的连接设置是硬编码的,则可能需要为postgres实例配置凭据.

不幸的是,即使POSTGRES_*在运行容器时设置环境变量docker run工作正常,设置它们.circleci/config.yml也不起作用.很少有开放的bug报告(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;"
Run Code Online (Sandbox Code Playgroud)

......你steps应该做的伎俩(见这里的完整例子).

使用机器执行器手动运行postgres(参见本页上的最后一个示例)也可能是一个选项,但我自己没有尝试过这个.


(4)我实际上尝试为自己配置这个,你可以在这里查看带有工作版本的 repo .在此构建输出示例.

我使用了这个春季靴子样本,并使用postgres,只留下相关测试,添加了圆圈ci以及其他小调整.它演示了通过env配置应用程序.变量和配置postgres实例.

最有趣的部分是.circleci/config.yml(其中定义了凭证env.变量,并在postgres实例中创建了user\db):

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