2017-07-02 4 views
3

Ich versuche, eine korrekte .gitlab-ci.yml Datei zu erstellen. Dies ist für die online gitlab.com nicht für ein selbst gehostetes Gitlab. Die meisten (wenn nicht alle) Dokumentation handelt von einer selbst gehosteten Gitlab-Instanz.Gitlab Mocha Tests und Docker Tag Probleme

Ich möchte meine Mocha-Chai-Tests auf dem gebauten Container ausführen und wenn die Tests bestanden haben, möchte ich ein Bild erstellen und es in der Gitlab-Registry mit einem Tag speichern, das meinem letzten Git-Tag entspricht.

Test-Teil

Ich kann die Tests zum Laufen bringen, was auch immer ich versuche, erhalte ich immer Mokka nicht gefunden.

Unten ist meine . Datei. Der Build-Abschnitt funktioniert. Das Problem liegt in der Test-Sektion und im Docker-Tag-Teil des Release-Images. Ich habe die yml Datei aus der offiziellen Gitlab Dokumentation 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 

Ich habe auch versucht

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

und

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 

die alle das gleiche Ergebnis:

sh: mocha: not found

die Test Scrip t in package.json ist

"test": "mocha ./Test", 

Ich habe versucht, beide setzen Mokka und chai in den devDependencies und in Abhängigkeiten.

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

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

Tag Teil

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 

Das Release-Bild funktioniert, wenn ich den Tag-Teil auslassen. Aber ich möchte wirklich mein Bild mit dem Git-Tag getaggt haben, nicht mit den Ends oder Master.

$ 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

Antwort

1

Verwenden Sie diese im ersten Ansatz:

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

Ich habe die weltweit installierten Mokka hinzugefügt. Was Sie in den späteren Ansätzen versuchten, funktionierte nicht, weil jeder docker run ein neuer Container basierend auf dem Bild und nicht auf dem vorherigen Container ist.

+0

Danke, das hat funktioniert. Ich habe schließlich alles in mein Docker-Bild gelegt, aber diese Antwort hat mich in die richtige Richtung gebracht. @stacktrace danke für deine Erklärung, hilfreich. Aber deine Antwort war falsch, mein Basisbild Alpine hatte keine Bash Shell, nur die Sh Shell. –

+0

@EricDelaCruz: Das ist in Ordnung. Wenn man bedenkt, dass Sie nicht angegeben haben, was Ihr Basisbild war, ist es schwer zu wissen, was die "richtige" Antwort wäre. Mein Punkt war, dass Sie Ihren Befehl in jede verfügbare Shell einbinden müssen, damit der Runner Ihren Befehl nicht in zwei Teile aufteilt. – Stacktrace

+0

@Stacktrace, ja, das war der Punkt. Ich bin mir nicht sicher, ob der 'Mokka'-Befehl ohne globale Installation funktionieren kann. – Robert

1

In Ihrem ersten Versuch (mit der Linie docker run $CONTAINER_TEST_IMAGE npm install && npm test) trennt sich die Gitlab Läufer den Befehl in docker run $CONTAINER_TEST_IMAGE npm install und npm test. Wie Sie vielleicht bemerken, wird der zweite Befehl nicht in einem Andock-Container ausgeführt.

Für Ihren zweiten Versuch erfordert docker run $CONTAINER_TEST_IMAGE npm test, dass Mocha bereits im Docker-Image installiert ist.

Für Ihren dritten Versuch:

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 

Jeder der Befehle tatsächlich auf einen separaten Docker Behälter läuft (. Dh es gibt nichts, was anzeigt, dass die Befehle innerhalb der gleichen Docker Container ausgeführt werden müssen).

Also, was ist der einfachste Weg, um dies zu beheben? Dein erster Versuch ist eigentlich ziemlich nah. Sie müssen nur sicherstellen, dass der Gitlab-Runner den Befehl nicht in zwei Teile aufteilt.

So etwas wie die folgenden funktionieren sollte:

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