2017-09-13 73 views
7

Mam aplikację Spring Boot, która obecnie buduje i uruchamia testy w CI CI Heroku i staram się, aby działał także w Circle CI. Mój plik config wygląda następująco:Uzyskiwanie dostępu do PostgreSQL 9.6 z Spring Boot w CircleCi

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 

Próbowałem różnych sposobów definiowania DATABASE_URL bez skutku:

jobs: 
    build: 
    docker: 
     - image: circleci/jdk8:0.1.1 
     environment: 
     - DATABASE_URL=postgresql://[email protected]: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://[email protected]: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://[email protected]:5434/dashman_test 
     - image: postgres:9.6 
     environment: 
      POSTGRES_USER: dashman_test 
      POSTGRES_DB: dashman_test 


TEST_DATABASE_URL: postgresql://[email protected]/circle_test?sslmode=disable   
DATABASE_URL: postgresql://[email protected]/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://[email protected]:5434/circle_test?sslmode=disable 

DATABASE_URL: postgres://dashman_test:[email protected]:5433/dashman_test 

nic nie wydaje się działać, zawsze skończyć z tym błędem:

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 

Jaki jest właściwy sposób konfigurowania bazy danych? Jestem trochę zagubiony.

+0

Jaki jest twój DATABASE_URL? – StanislavL

+0

@StanislavL: Dodałem listę wszystkich testowanych DATABASE_URL. Czy o to pytałeś? – Pablo

+0

Czy to nie może być postgree działa w kontenerze dokowania, więc zamiast localhost potrzebujesz adresu IP kontenera (lub nazwy)? – StanislavL

Odpowiedz

8

Oto kilka punktów, które powinny pomóc w rozwiązaniu problemu.


(1) Dokumentacja wspomniałeś w komentarzach (this one) jest nieaktualna lub zwykły błąd. To:

The default user, port, test database for PostgreSQL 9.6 are as follows: postgres://ubuntu:@127.0.0.1:5432/circle_test

... nie prawda.

Rzeczywiste wartości domyślne dla postgres:9.6 są:

  • użytkownika: postgres
  • hasło: <empty>
  • portu: 5432
  • bazy danych: PostgreSQL

Można dotrzeć instancji postgres'owy od Twoja aplikacja na 127.0.0.1.

Możesz znaleźć więcej informacji o wartościach domyślnych here, ale jest pewien haczyk na temat ich ustawiania (więcej na ten temat w (3)).


(2) O ile wiem there is no way to pass usrename\password JDBC URL w złączu postgres, więc prawdopodobnie trzeba powiedzieć aplikacja nie tylko DATABASE_URL ale również coś podobnego DATABASE_USER i DATABASE_PASSWORD.

Ta część jest zależna od specyfiki danej aplikacji, ale dla typowego zastosowania bagażnika sprężyna z domyślnymi ustawieniami baz chcesz skończyć z następującymi ustawieniami:

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

(3) Alternatywnie , jeśli twoje ustawienia połączenia są zakodowane na sztywno, prawdopodobnie chcesz skonfigurować referencje dla instancji postgres.

Niestety, mimo że ustawienie POSTGRES_* zmiennych środowiskowych podczas pracy z kontenerem z docker run działa dobrze, ustawienie ich w .circleci/config.yml nie działa.Istnieje kilka otwartych raportów o błędach (1, 2) opisujących ten lub podobny problem, a moje pieniądze dotyczą tego błędu.

Na szczęście nadal można obejść ten problem, instalując psql i tworząc pożądane poświadczenia użytkownika podczas kompilacji (domyślne poświadczenia nadal działają). Dodając coś jak:

- 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;" 

... do steps powinno załatwić sprawę (patrz full example here).

Używanie machine executor do uruchamiania postgresów ręcznie (patrz ostatni przykład na this page) również może być opcją, ale sam tego nie próbowałem.


(4) I rzeczywiście próbował konfiguracji to dla siebie i można sprawdzić repo z working version here. Utwórz output example here.

Użyłem tego spring boot sample i wykorzystałem postgreSQL, zostawiłem tylko odpowiednie testy, dodano koło ci wraz z innymi drobnymi poprawkami. Pokazuje zarówno konfigurację aplikacji przez env. zmienne i konfigurowanie instancji postgres.

Najciekawsze części są .circleci/config.yml (gdzie poświadczenia env zmienne są zdefiniowane i user \ db zostanie utworzona w instancji 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 

... i application.properties. (Gdzie wykorzystywane są referencje env zmienne) :

 
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 
+0

Dzięki. Przykład naprawdę pomógł, szczególnie, że musisz skonfigurować plik właściwości, czego mi brakowało. Dodałbym go do odpowiedzi (na wypadek, gdyby przykład został usunięty). – Pablo

+0

@Pablo Nie mam żadnych planów usuwania, ale tak, dobry pomysł. Dodałem plik właściwości wraz z plikiem konfiguracyjnym circleci, którego użyłem w moim przykładzie. –