【问题标题】:gitlab pipeline with embedded mongodb带有嵌入式 mongodb 的 gitlab 管道
【发布时间】:2018-03-26 13:18:12
【问题描述】:

我正在尝试为使用嵌入式 mongo 实例的 gradle java 应用程序构建管道。我已经构建了一个包含 java 和 mongo 的容器。但是,对于需要嵌入式 mongo 实例的所有测试,我不断收到以下错误。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'embeddedMongoServer' 
defined in class path resource [org/springframework/boot/autoconfigure/mongo/embedded/EmbeddedMongoAutoConfiguration.class]: 
Invocation of init method failed; nested exception is java.io.IOException: 
Cannot run program "/tmp/extract-f816c11c-614b-46d7-ad29-68923ca9d624extractmongod": error=2, No such file or directory

我的gitlab-ci.yml 看起来像这样:

image: java:latest
services:
  - docker:dind

variables:
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"
  DOCKER_DRIVER: overlay
  SPRING_PROFILES_ACTIVE: gitlab-ci

stages:
  - build
  - test

build:
  stage: build
  script: ./gradlew --build-cache assemble
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: push
    paths:
      - build
      - .gradle

test:
  stage: test
  image: registry.gitlab.com/path/to/explorer-ci:1.0.0
  script: ./gradlew check --debug
  cache:
    key: "$CI_COMMIT_REF_NAME"
    policy: pull
    paths:
      - build
      - .gradle

构建工作正常,测试工作失败。我的 explorer-ci 容器是使用以下 Dockerfile 构建的

FROM openjdk:8-jdk-alpine

RUN apk update && \
    apk add --no-cache \
        mongodb \
        bash

VOLUME /data/db
VOLUME log

RUN ["mongod", "--smallfiles", "--fork", "--logpath", "log/mongodb.log"]

我花了一周时间处理了一堆不同的配置,但似乎无法破解它。请注意,构建/测试在我的本地机器上运行良好。关于我做错了什么的任何想法?

【问题讨论】:

    标签: mongodb gitlab gitlab-ci


    【解决方案1】:

    经过反思,由于我使用的是嵌入式 mongo 实例,因此我不依赖 mongodb 来构建或测试。我现在正在使用以下gitlab-ci.yaml,它工作正常。

    image: openjdk:8-jdk
    
    variables:
      GRADLE_OPTS: "-Dorg.gradle.daemon=false"
      DOCKER_DRIVER: overlay
      SPRING_PROFILES_ACTIVE: gitlab-ci
    
    stages:
      - build
      - test
    
    build:
      stage: build
      script: ./gradlew --build-cache assemble
      cache:
        key: "$CI_COMMIT_REF_NAME"
        policy: push
        paths:
          - build
          - .gradle
    
    test:
      stage: test
      script: ./gradlew check
      cache:
        key: "$CI_COMMIT_REF_NAME"
        policy: pull
        paths:
          - build
          - .gradle
    

    【讨论】:

      【解决方案2】:

      问题在于您的项目运行器的基础 docker 映像,您需要使用 jdk 版本而不是 alpine。

      尝试将基础图像更改为image: openjdk:8-jdk,它会正常工作。

      【讨论】:

        【解决方案3】:

        在我们的案例中,Fladoodle 嵌入式 MongoDB 中描述的解决方案对这里的问题有所帮助:

        https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo/issues/281

        简而言之 - 我们在运行测试之前将其添加到 Gitlab 脚本中(或者如果可能的话,在容器设置中执行此操作):

            apk --no-cache add ca-certificates
        wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub
        
        wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-2.29-r0.apk
        wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-bin-2.29-r0.apk
        
        apk add glibc-2.29-r0.apk glibc-bin-2.29-r0.apk
        
        wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.29-r0/glibc-i18n-2.29-r0.apk
        apk add glibc-bin-2.29-r0.apk glibc-i18n-2.29-r0.apk
        /usr/glibc-compat/bin/localedef -i en_US -f UTF-8 en_US.UTF-8
        

        【讨论】:

          【解决方案4】:

          只需更新依赖即可解决:

          <dependency>
              <groupId>de.flapdoodle.embed</groupId>
              <artifactId>de.flapdoodle.embed.mongo</artifactId>
              <version>2.2.0</version>
              <scope>test</scope>
          </dependency>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-08-08
            相关资源
            最近更新 更多