Gitlab-CI:测试作业失败

Posted

技术标签:

【中文标题】Gitlab-CI:测试作业失败【英文标题】:Gitlab-CI : Test Job is failing 【发布时间】:2018-06-05 16:56:22 【问题描述】:

我目前正在编写一个 .gitlab-ci.yml 文件来自动化我的应用程序的构建、测试、打包和部署,但是构建作业正在通过,但其他作业(测试、部署)却失败了。

我的应用是一个 Springboot Web 应用,有一个 mysql 数据库来存储数据,我正在使用 maven 来构建项目。

下面是我的 .gitlab-ci.yml 文件

before_script:
 - echo "Execute scripts which are required to bootstrap the application. !"

after_script:
 - echo "Clean up activity can be done here !."

stages:
 - build
 - test
 - package
 - deploy

variables:
 MAVEN_CLI_OPTS: "--batch-mode"
 MAVEN_OPTS: "-Dmaven.repo.local=.m2/repository"

cache:
 paths:
  - .m2/repository/
  - target/

build:
 stage: build
 image: maven:latest
 script:
  - mvn $MAVEN_CLI_OPTS clean compile

test:
 stage: test
 image: maven:latest
 script:
  - mvn $MAVEN_CLI_OPTS test

package:
 stage: package
 image: maven:latest
 script:
  - mvn $MAVEN_CLI_OPTS package
 artifacts:
  paths: [target/basecamp-0.0.1.war]


deploy_test:
 stage: deploy
 script:
  - echo "########   To be defined   ########"
 environment: staging

deploy_prod:
 stage: deploy
 script:
  - echo "########   To be defined   ########"
 only:
  - master
 environment: production

我收到的错误如下:

2017-12-23 10:00:33.854  WARN 65 --- [           main] o.a.tomcat.jdbc.pool.ConnectionPool      : maxIdle is larger than maxActive, setting maxIdle to: 50
2017-12-23 10:00:34.567 ERROR 65 --- [           main] o.a.tomcat.jdbc.pool.ConnectionPool      : Unable to create initial connections of pool.

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. 
The driver has not received any packets from the server.
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:989)
at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:341)
at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2189)
at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2222)
at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2017)
at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:779)
at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:47)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:425)

你能知道是什么问题吗?

谢谢, G.

【问题讨论】:

可以在本地运行mvn test 吗?也许问题出在 SpringBoot 自动生成的测试上,它试图加载整个 Spring 上下文,因此应用程序想要连接到您的数据库。由于您的 CI 环境中没有数据库,因此您的测试失败。 @rieckpil 是的,本地一切运行良好。测试在本地运行良好。问题不在于自动生成的测试。我有一堆我实现的单元测试。他们都在本地运行良好。 尝试停止本地mysql并再次运行测试 刚刚尝试停止,测试仍在运行。 你“试图”停止?您的数据库是否关闭? x) 【参考方案1】:

找到您的 Spring 上下文测试并将其禁用(例如,将其注释掉或在测试类上使用 JUnit 的 @Ignore 以重新尝试您的管道。文本可能如下所示:

@RunWith(SpringRunner.class)
@SpringBootTest
public class YourApplicationTest 

    @Test
    public void contextLoads() 
    


您的异常是因为在测试期间无法访问您的数据库而引发的。详细解释和一些故障排除可以在这里找到:com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

【讨论】:

我按照您的要求更新了该测试,忽略了它。我再次尝试了管道,但我仍然遇到同样的问题,我之前发布的相同错误消息。我了解问题是因为无法访问数据库,有没有办法在 .gitlab-ci.yml 文件中指定另一个数据库实例。 您是否还有其他加载 Spring 上下文的测试?如果你愿意,你可以将你的项目发布到 GitHub,我会看看。 问题是我想创建一个带有 mysql 实例的 docker 容器,然后测试将运行良好。我不认为这个问题与上下文有关。我有一堆测试。您能告诉我如何在测试作业中使用 maven 和 mysql 运行/指定 docker 映像,以便测试作业可以正常运行吗? @charli,你能帮忙解决这个问题吗?【参考方案2】:

好吧,这有点晚了……但我假设您的构建过程(集成测试)没有 MySQL 数据库。这就是您收到 CommunicationsException 的原因。我有同样的问题。我尝试设置一个 gitlab-pipeline,它可以执行集成测试(还没有工作)

这就是我发现的

    https://docs.gitlab.com/ce/ci/services/mysql.html https://gitlab.com/gitlab-examples/mysql

【讨论】:

以上是关于Gitlab-CI:测试作业失败的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 .gitlab-ci.yml 在纱线测试中不断失败,并出现错误“/bin/sh: 1: react-scripts: not found”?

Gitlab-ci alpine图像:主机密钥验证失败

.gitlab-ci.yml配置参数

如何排除 gitlab-ci.yml 更改触发作业

如何使用 gitlab-ci 作业推送到 gitlab 存储库?

如何将存储库中的文件复制到用于作业的 Docker 容器中,在 gitlab-ci.yml