GitLab-CI Docker执行器 | 如何设置MySQL服务?

3
我正在尝试进行gitlab-ci构建,但是在mysql设置部分遇到了问题。当我提交时,mysql脚本似乎运行正常,但是应用程序构建失败,无法连接到数据库。我在这里漏掉了什么? .gitlab-ci.yml
stages:
  - prepare
  - test

services:
  - mariadb

variables:
  MYSQL_ROOT_PASSWORD: "password"

connect:
  stage: prepare
  image: mysql
  script:
  - mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mariadb < "data/db/scripts/create-db.sql"
  - mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mariadb < "data/db/scripts/init-db-tables.sql"

dev:
  stage: test
  image: java:opendjdk-8
  script:
    - ./gradlew assemble
    - ./gradlew check

数据源配置

@Bean
public DataSource dataSource() {
    DriverManagerDataSource dataSource = new DriverManagerDataSource();

    dataSource.setUrl("jdbc:mysql://mariadb:3306/rvep");
    dataSource.setUsername("root");
    dataSource.setPassword("password");
    dataSource.setDriverClassName("com.mysql.jdbc.Driver");

    return dataSource;
}

构建错误 hibernate配置未能连接到数据库导致的结果

io.abnd.rvep.RVEPTests > contextLoads FAILED
    java.lang.IllegalStateException
        Caused by: org.springframework.beans.factory.BeanCreationException
            Caused by: org.springframework.beans.factory.BeanCreationException
                Caused by: org.springframework.beans.BeanInstantiationException
                    Caused by: org.hibernate.HibernateException

io.abnd.rvep.security.rest.TestControllerTest > findAllRoleCategories FAILED
    java.lang.IllegalStateException
        Caused by: org.springframework.beans.factory.BeanCreationException
            Caused by: org.springframework.beans.factory.BeanCreationException
                Caused by: org.springframework.beans.BeanInstantiationException
                    Caused by: org.hibernate.HibernateException

io.abnd.rvep.security.rest.TestControllerTest > findAllRoles FAILED
    java.lang.IllegalStateException
        Caused by: org.springframework.beans.factory.BeanCreationException
            Caused by: org.springframework.beans.factory.BeanCreationException
                Caused by: org.springframework.beans.BeanInstantiationException
                    Caused by: org.hibernate.HibernateException
2个回答

5

首先,请仔细阅读文档中的“服务是什么”和“服务与构建的关系”部分:http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-service

在您的配置中,您正在启动mysql服务的这两行:

services:
  - mysql

感谢此操作,您可以在构建容器中使用标准端口的mysql服务,主机名为mysql

在这里:

connect:
  image: mysql
  script:
  - service mysql start
  - echo "SET PASSWORD FOR 'root'@'localhost' = PASSWORD('password');" | mysql -u root
  - echo "SELECT 'OK';" | mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -h mysql "$MYSQL_DATABASE"
  - mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -h localhost < "data/db/scripts/create-db.sql"
  - mysql -uroot -p"$MYSQL_ROOT_PASSWORD" -h localhost < "data/db/scripts/init-db-tables.sql"

您正在启动一个新的构建,在从mysql映像启动的容器中并准备本地数据库状态!这些命令都没有涉及到您的mysql服务。
相反,您应该在一个带有mysql客户端的容器中运行connect作业(也可以是这个mysql),但是在主机mysql上运行所有命令,而不是在主机localhost上运行。
第二件事是您在一个阶段中同时运行这两个作业 - connectdev,因此它们将并行执行(但在运行程序配置中设置了限制)。
您应该首先添加一个顶级条目:
stages:
  - prepare
  - test

然后修改这两个作业为:
connect:
  stage: prepare
  (...)

dev:
  stage: test
  (...)

在此之后,第一阶段 (prepare) 的任务将并行执行,然后是第二阶段 (test) 的任务,以此类推。


即使有些变化,我似乎仍然停留在同一地点。 - oxenfree
1
是的,在Java配置中,您还应该将数据库主机名从localhost更改为mysql。 - Tomasz Maczukin

2
似乎通过apt-get安装mysql-client,并结合脚本可以帮助解决问题。这是我现在的.gitlab-ci.yml文件,构建已经通过了。
variables:
  MYSQL_ROOT_PASSWORD: "password"

dev:
  image: java:openjdk-8
  services:
    - mariadb
  script:
    - apt-get update && apt-get --assume-yes install mysql-client
    - mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mariadb < "data/db/scripts/create-db.sql"
    - mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mariadb < "data/db/scripts/init-db-tables.sql"
    - ./gradlew assemble check --info

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接