【问题标题】:Can't get tests to pass on Gitlab CI无法在 Gitlab CI 上通过测试
【发布时间】:2018-08-17 20:39:40
【问题描述】:

我一直试图让我们的测试通过我们的 Gitlab CI,但不能。我正在使用 Gitlab 附带的库存管道配置。我所要做的就是提供 gitlab yaml 文件来配置 CI。

这就是我们正在使用的

image: maven:3.5.0-jdk-8-alpine

services:
  - postgres:latest

variables:
  POSTGRES_DB: my_test_db
  POSTGRES_USER: my_test_user
  POSTGRES_PASSWORD: ""
  MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository -Dorg.slf4j.simpleLogger.log.org.apache.maven.cli.transfer.Slf4jMavenTransferListener=WARN -Dorg.slf4j.simpleLogger.showDateTime=true -Djava.awt.headless=true"
  MAVEN_CLI_OPTS: "--batch-mode --errors --fail-at-end --show-version -DinstallAtEnd=true -DdeployAtEnd=true"
  ACTIVE_ENV: test

connect:
  image: postgres
  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" -c "SELECT 'OK' AS status;"

stages:
  - test

test:
  stage: test
  script:
    - "mvn -Denvironments=test -B db-migrator:migrate; mvn -Denvironments=test -DACTIVE_ENV=test -B test"

在测试运行之前,一切都完美无缺。然后他们都会出错并显示类似的消息:

383 [main] WARN org.javalite.activeweb.DBSpecHelper - no DB connections are configured, none opened
456 [main] WARN org.javalite.activeweb.DBSpecHelper - no DB connections are configured, none opened
Tests run: 2, Failures: 0, Errors: 2, Skipped: 0, Time elapsed: 0.528 sec <<< FAILURE! - in app.models.RoleTest
validatePresenceOfUsers(app.models.RoleTest)  Time elapsed: 0.071 sec  <<< ERROR!
org.javalite.activejdbc.DBException: Failed to retrieve metadata from DB, connection: 'default' is not available

我有一个 database.properties 文件已签入并且仅用于测试(我们的开发和生产环境使用 jndi)。看起来是这样的:

test.driver=org.postgresql.Driver
test.username=my_test_user
test.password=
test.url=jdbc:postgresql://postgres/edv_test

同样,迁移使用所有这些完全相同的配置运行。我只是无法弄清楚为什么测试不会运行。我理解为什么它说没有默认数据库,但我不明白为什么它没有看到测试设置并按预期配置该连接。

【问题讨论】:

  • 我建议您在失败之前运行此代码:System.out.println(AppConfig.activeEnv()) - 这将告诉您它作为ACTIVE_ENV 获得的价值。
  • 啊,比你领先一步。 :) 它们不会格式化,但这些是我在 CI 上打印出来的调试:env: testload test env properties 负载测试调试在我的 DbConfig 块中:if(Configuration.getEnv().equalsIgnoreCase("test")) { System.out.println("load test env properties"); loadConfiguration("src/main/resources/database.properties"); } else {
  • 不知道为什么要自己加载属性文件
  • 好吧,由于通常的原因,我们开始不想检查 database.properties。所以我和我的团队在 gitignore 中设置了我们自己的 database-developer.properties,它有我们自己的本地连接信息。因为我无法在没有属性文件的情况下在 CI 上运行迁移,所以我决定只将 CI 测试配置添加到 database.properties,这就是我使用上述检查的原因。
  • 你知道吗,你可以在文件系统上拥有你的连接文件:javalite.io/…

标签: activejdbc activeweb


【解决方案1】:

所以你知道,Maven 标志 environments 像这样:mvn test -Denvironments=test 仅适用于 DB-Migrator,不适用于测试。任何处于标准运行模式或作为测试的 JavaLite 应用程序都将查看 ACTIVE_ENV。如果未设置,它将假定为development。在测试模式下,它将查看database.propertiesdevelopment.test.xxx=yyy,如http://javalite.io/database_configuration#property-file-configuration。 将其视为“开发”环境,“测试”模式。

另外,DbConfig 不参与测试,因为测试中的数据库连接有特殊处理(回滚事务),请参阅:http://javalite.io/testing_with_db_connection

【讨论】:

  • 这一切都说得通。我主要对这里的碎片进行分类。我认为我们的第一个基本问题是如何让database.properties 现在可供开发人员使用。我想答案是使用ACTIVE_ENV 以及覆盖database.properties。我会从头开始,重新开始前进的道路。谢谢。
  • 为了清楚起见,站点地址上记录的大多数文档和用例都在本地完成所有这些工作。我们已经成功地做到了这一点。我们遇到所有问题的地方都在部署上。这真的不是框架的错,只是我们试图让它在登台和生产环境中工作。我们没有使用 Jenkins——主要是 Gitlab CI,现在是他们的 Auto DevOps,我认为对于 Javalite,这似乎是一个未知领域。我们将继续破解它。
  • 我认为我们需要围绕部署选项做更多的文档。完成后,您是否介意向该站点提供一个页面来描述您的设置:github.com/javalite/site-content?我们也会在 Jenkins 周围添加我们的,以便读者可以选择。
  • 太棒了!一旦我们开始工作,我会为 Gitlab 添加它。
  • 欣赏,期待!
猜你喜欢
  • 1970-01-01
  • 2014-07-07
  • 2020-12-04
  • 2019-04-11
  • 2017-05-07
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 2021-09-28
相关资源
最近更新 更多