2017-07-02 178 views
3

我正在尝试创建一个正确的.gitlab-ci.yml文件。这是针对在线 gitlab.com不适用于自行托管的Gitlab。大多数(如果不是全部)文档都是关于一个自托管的gitlab实例的。Gitlab Mocha测试和Docker标记问题

我想要的是在构建的容器上运行我的Mocha-Chai测试,当测试通过时,我想构建一个图像并将其存储在Gitlab注册表中,并使用与最新的git标签匹配的标记。

测试部分

我无法运行测试,无论我尝试,我总是得到摩卡没有找到

以下是我的.yml文件。构建部分正在工作。 问题出在版本映像的测试部分和docker标签部分。我从官方gitlab文档the official gitlab documentation

image: docker:latest 
services: 
- docker:dind 

stages: 
- build 
- test 
- release 
- deploy 

variables: 
    CONTAINER_TEST_IMAGE: registry.gitlab.com/edelacruz/cloudtrader-microservices:$CI_COMMIT_REF_NAME 
    CONTAINER_RELEASE_IMAGE: registry.gitlab.com/edelacruz/cloudtrader-microservices:latest 

before_script: 
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com/edelacruz/cloudtrader-microservices 

build: 
    stage: build 
    script: 
    - docker build --pull -t $CONTAINER_TEST_IMAGE . 
    - docker push $CONTAINER_TEST_IMAGE 

test: 
    stage: test 
    script: 
    - docker pull $CONTAINER_TEST_IMAGE 
    - docker run $CONTAINER_TEST_IMAGE npm install && npm test 

我也试过

test: 
    stage: test 
    script: 
    - docker pull $CONTAINER_TEST_IMAGE 
    - docker run $CONTAINER_TEST_IMAGE npm test 

test: 
    stage: test 
    script: 
    - docker pull $CONTAINER_TEST_IMAGE 
    - docker run $CONTAINER_TEST_IMAGE npm install mocha -g 
    - docker run $CONTAINER_TEST_IMAGE npm install chai -g 
    - docker run $CONTAINER_TEST_IMAGE npm test 

得到了YML文件中的所有相同的结果:

sh: mocha: not found

的测试脚本吨的package.json

"test": "mocha ./Test", 

我都尝试把摩卡和薛宝钗在devDependencies和依赖性。

"devDependencies": { 
    "chai": "^4.0.2", 
    "mocha": "^3.4.2" 
    } 

"dependencies": { 
    "chai": "^4.0.2", 
    "mocha": "^3.4.2" 
    }, 

标签部分

variables: 
    CONTAINER_TEST_IMAGE: registry.gitlab.com/edelacruz/cloudtrader-microservices:$CI_COMMIT_REF_NAME 
    CONTAINER_RELEASE_IMAGE: registry.gitlab.com/edelacruz/cloudtrader-microservices:latest 

before_script: 
    - docker login -u gitlab-ci-token -p $CI_JOB_TOKEN registry.gitlab.com/edelacruz/cloudtrader-microservices 

release-image: 
    stage: release 
    script: 
    - docker pull $CONTAINER_TEST_IMAGE 
    - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE:$CI_COMMIT_TAG 
    - docker push $CONTAINER_RELEASE_IMAGE 
    only: 
    - master 

释放图像,如果我离开了标签的部分工作。 但我真的想让我的图像用git标签标记,而不是最新的或主人。

$ docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE:$CI_COMMIT_TAG Error parsing reference: "registry.gitlab.com/edelacruz/cloudtrader-microservices:" is not a valid repository/tag: invalid reference format ERROR: Job failed: exit code 1

enter image description here

回答

1

使用此在第一种方法:

test: 
    stage: test 
    script: 
    - docker pull $CONTAINER_TEST_IMAGE 
    - docker run $CONTAINER_TEST_IMAGE sh -c 'npm install -g mocha && npm install && npm test' 

我已经添加了全球的装机量摩卡。您在后面的方法中尝试的操作不起作用,因为每个docker run都是基于图像的新容器,而不是上一个容器。

+0

谢谢,这工作。我确实把所有东西都放在我的Docker镜像中,但是这个回复让我朝着正确的方向发展。 @stacktrace感谢您的解释,很有帮助。但是你的回答是错误的,我的基本形象Alpine没有bash壳,只有sh壳。 –

+0

@EricDelaCruz:很好。考虑到你没有提到你的基本图像是什么,很难真正知道“正确”的答案是什么。我的观点是你需要将你的命令封装在任何可用的shell中,这样跑步者不会将你的命令分成两部分。 – Stacktrace

+0

@Stacktrace,是的,这是关键。我不确定'mocha'命令是否可以在没有-g全局安装的情况下工作。 – Robert

1

在你第一次尝试(与线docker run $CONTAINER_TEST_IMAGE npm install && npm test),该gitlab亚军分离命令到docker run $CONTAINER_TEST_IMAGE npm installnpm test。您可能会注意到,第二个命令未在Docker容器中运行。

第二次尝试,docker run $CONTAINER_TEST_IMAGE npm test要求在码头图像中已经安装了摩卡咖啡。

对于您的第三次尝试:

docker run $CONTAINER_TEST_IMAGE npm install mocha -g 
docker run $CONTAINER_TEST_IMAGE npm install chai -g 
docker run $CONTAINER_TEST_IMAGE npm test 

每个命令实际上是在一个单独的泊坞窗容器中运行(即没有什么指示命令需要在同一个泊坞窗容器内运行)。

那么,解决这个问题最简单的方法是什么?你的第一次尝试实际上非常接近。你只需确保gitlab runner不会将命令分成两部分。

类似下面应该工作:

test: 
    stage: test 
    script: 
    - docker pull $CONTAINER_TEST_IMAGE 
    - docker run $CONTAINER_TEST_IMAGE /bin/bash -c "npm install --only=dev; npm test"