2016-06-10 1 views
2

Je veux configurer un pipeline de construction dans Concourse pour mon application web. L'application est construite en utilisant Node.Concourse CI - Construire des artefacts à l'intérieur de la source, passer tout à la tâche suivante

Le plan est de faire quelque chose comme ceci:

         ,-> build style guide -> dockerize 
source code -> npm install -> npm test -| 
             `-> build website -> dockerize 

Le problème est, après NPM installation, un nouveau conteneur est créé de sorte que le répertoire node_modules est perdu. Je veux passer node_modules dans les tâches ultérieures mais parce qu'il est « à l'intérieur » le code source, il ne l'aime pas et me donne

invalid task configuration: 
    you may not have more than one input or output when one of them has a path of '.' 

Voici mes emplois créés

jobs: 
    - name: test 
    serial: true 
    disable_manual_trigger: false 
    plan: 
     - get: source-code 
     trigger: true 

     - task: npm-install 
     config: 
      platform: linux 
      image_resource: 
      type: docker-image 
      source: {repository: node, tag: "6" } 
      inputs: 
      - name: source-code 
       path: . 
      outputs: 
      - name: node_modules 
      run: 
      path: npm 
      args: [ install ] 

     - task: npm-test 
     config: 
      platform: linux 
      image_resource: 
      type: docker-image 
      source: {repository: node, tag: "6" } 
      inputs: 
      - name: source-code 
       path: . 
      - name: node_modules 
      run: 
      path: npm 
      args: [ test ] 

Mise à jour 2016-06-14

Les entrées et sorties sont simplement des répertoires. Vous mettez donc ce que vous voulez dans un répertoire de sortie et vous pouvez ensuite le passer à une autre tâche dans le même travail. Les entrées et les sorties ne peuvent pas se chevaucher, donc pour le faire avec npm, vous devez soit copier node_modules, soit le dossier source entier du dossier d'entrée vers un dossier de sortie, puis l'utiliser dans la tâche suivante.

Cela ne fonctionne pas entre les travaux. Meilleure suggestion que j'ai vu jusqu'à présent est d'utiliser un référentiel git temporaire ou un seau pour pousser tout vers le haut. Il doit y avoir une meilleure façon de procéder car une partie de ce que j'essaie d'éviter est d'éviter d'énormes quantités d'E/S réseau.

+0

Est-il correct si vous postez votre fichier pipeline.yml mis à jour afin de voir ce que vous avez fait parce que je Je cours dans un problème similaire et j'ai essayé pendant des jours pour le réparer! Ça me rend fou. – Fadi

+0

Je ne peux pas poster le code mais je peux vous dire la solution. Je l'ai rebaptisé Jenkinsfile ... binned Concourse et j'ai utilisé Jenkins Blue Ocean à la place. Je suis sensiblement plus heureux. J'ai même créé un fichier Vagrantfile qui construit Jenkins dans Docker sur CoreOS et permet à n'importe lequel de nos développeurs d'exécuter exactement le même pipeline sur leur machine que sur n'importe quel test, scène ou machine live. Ce n'est pas complet, mais je vais l'ouvrir à l'avenir et j'essaierai de me souvenir de le lier ici quand je le ferai. – DanielM

+0

Nice! J'ai une configuration Jenkins normale et je fais tout, mais dernièrement j'ai testé Concourse juste pour des coups de pied et jusqu'ici ça a été très frustrant! Je ne connaissais pas Jenkins Blue Ocean mais grâce à vous, je vais vérifier ça aussi! :) – Fadi

Répondre

2

Il existe une ressource spécialement conçue pour ce cas d'utilisation de npm entre les travaux. Je l'ai utilisé pendant quelques semaines:

https://github.com/ymedlop/npm-cache-resource

Il vous permet essentiellement de mettre en cache la première installation de NPM et injectent tout comme un dossier dans le prochain travail de votre pipeline. Vous pouvez facilement configurer vos propres ressources de mise en cache en lisant la source de celle-ci, si vous voulez mettre en cache plus de node_modules. J'utilise en fait cette ressource npm-cache en combinaison avec un proxy Nexus pour accélérer encore plus l'installation initiale de npm. Sachez que certains paquets npm ont des bindings natifs qui doivent être construits avec les standardslibs qui correspondent aux librairies linux des versions standard des conteneurs. Si vous vous déplacez beaucoup entre différents types de conteneurs, vous pouvez rencontrer des problèmes avec libmusl etc, dans ce cas, je recommande soit streamlinging d'utiliser les mêmes types de conteneurs à travers le pipeline ou la reconstruction du node_modules en question ...

Il y a un similaire pour gradle (sur lequel une NGP est basée sur) https://github.com/projectfalcon/gradle-cache-resource

3

Cela ne fonctionne pas entre les travaux.

Ceci est voulu. Chaque étape (get, task, put) dans un Job est exécutée dans un conteneur isolé. Les entrées et les sorties sont uniquement valides dans un seul travail.

Ce qui relie les tâches est Ressources. Pousser à git est un moyen. Il serait presque certainement plus rapide et plus facile d'utiliser un magasin de blob (par exemple S3) ou un magasin de fichiers (par exemple FTP).

+0

Ce sont des choses que j'ai considérées. Cependant, afin d'éviter de construire un paquet différent de celui qui a été testé en utilisant un travail autour de quelque chose qui était "par conception" suggère que ce n'est pas le bon outil pour le travail. – DanielM

+3

Je ne suis pas sûr de comprendre ce que vous voulez dire en utilisant un travail. Concourse est délibérément apatride à chaque étape de chaque travail, vous devez explicitement dire comment faire bouger les choses. Il faut un certain temps pour ajuster, mais ce n'est pas un "travail". Jenkins a un modèle d'opération différent, qui ressemble plus à de nombreux flux de travail historiques. –