web-dev-qa-db-fra.com

Concourse: comment passer la sortie d'un travail à un autre travail

Ce n'est pas clair pour moi de la documentation s'il est même possible de passer la sortie d'un travail à un autre travail (pas de tâche en tâche, mais de travail en travail).

Je ne sais pas si conceptuellement je fais la bonne chose, peut-être que cela devrait être modélisé différemment dans Concourse, mais ce que j'essaie de réaliser, c'est d'avoir un pipeline pour Java projet divisé en plusieurs travaux granulaires, qui peuvent être exécutés en parallèle et déclenchés indépendamment si j'ai besoin de réexécuter un travail.

Comment je vois le pipeline:

  1. Premier travail:
    • extrait le code du dépôt github
    • construit le projet avec maven
    • déploie des artefacts dans le référentiel maven (mvn deploy)
    • met à jour SNAPSHOT versions des sous-modules du projet Maven
    • copie les artefacts (fichiers jar) dans le répertoire de sortie (output du task)
  2. Deuxième emploi:
    • récupère les jar des output
    • construit des conteneurs docker pour chacun d'eux (en parallèle)
  3. Le pipeline continue

Je n'ai pas pu passer le output du travail 1 au travail 2. En outre, je suis curieux de savoir si des modifications que j'introduis dans la ressource git repo d'origine seront présentes dans le travail suivant (du travail 1 au travail 2) .

Les questions sont donc:

  1. Quelle est la bonne façon de passer l'état de génération d'un travail à l'autre (je sais, les travaux peuvent être planifiés sur différents nœuds, et certainement dans différents conteneurs)?
  2. Est-il nécessaire de stocker l'état dans une ressource (disons, S3/git)?
  3. Le hall est-il apatride par conception (dans ce contexte)?
  4. Quel est le meilleur endroit pour obtenir plus d'informations? J'ai essayé le manuel, ce n'est tout simplement pas si détaillé.

Ce que j'ai trouvé jusqu'à présent:

  1. outputs ne sont pas transmis d'un travail à l'autre
  2. Toutes les modifications apportées à la ressource (put au référentiel github) sont récupérées dans le travail suivant, mais les modifications dans la copie de travail ne sont pas

Exemple minimal (il échoue si les lignes commentées ne sont pas commentées avec une erreur: missing inputs: Gist-upd, Gist-out):

---
resources:
  - name: Gist
    type: git
    source:
      uri: "[email protected]:snippets/foo/bar.git"
      branch: master
      private_key: {{private_git_key}}

jobs:
  - name: update
    plan:
      - get: Gist
        trigger: true

      - task: update-Gist
        config:
          platform: linux
          image_resource:
            type: docker-image
            source: {repository: concourse/bosh-cli}

          inputs:
            - name: Gist

          outputs:
            - name: Gist-upd
            - name: Gist-out

          run:
            path: sh
            args:
              - -exc
              - |
                git config --global user.email "[email protected]"
                git config --global user.name "Concourse"
                git clone Gist gist-upd
                cd Gist-upd
                echo `date` > test
                git commit -am "upd"
                cd ../Gist
                echo "foo" > test
                cd ../Gist-out
                echo "out" > test

      - put: Gist
        params: {repository: Gist-upd}

  - name: fetch-updated
    plan:
      - get: Gist
        passed: [update]
        trigger: true

      - task: check-Gist
        config:
          platform: linux
          image_resource:
            type: docker-image
            source: {repository: Alpine}

          inputs:
            - name: Gist
            #- name: Gist-upd
            #- name: Gist-out

          run:
            path: sh
            args:
              - -exc
              - |
                ls -l Gist
                cat Gist/test
                #ls -l Gist-upd
                #cat Gist-upd/test
                #ls -l Gist-out
                #cat Gist-out/test
12
Max Romanovsky

Répondre à vos questions une par une.

  1. Tout état de construction doit être transmis d'un travail à l'autre sous la forme d'un ressource qui doit être stocké sur une sorte de magasin externe.
  2. Il est nécessaire de stocker sur une sorte de magasin externe. Chaque type de ressource gère ce téléchargement et se télécharge lui-même, donc pour votre cas spécifique, je vérifierais ceci type de ressource personnalisé maven , qui semble faire ce que vous voulez.
  3. Oui, cette apatridie est le trait caractéristique du concours. Le seul élément avec état dans le concours est une ressource, qui doit être strictement versionnée et stockée sur un magasin de données externe. Lorsque vous combinez la conteneurisation des tâches avec le magasin externe de ressources, vous obtenez la reproductibilité garantie offerte par le concours. Chaque version d'une ressource va être sauvegardée sur une sorte de magasin de données, et donc même si le centre de données sur lequel votre ci s'exécute doit tomber complètement en panne, vous pouvez toujours avoir une reproductibilité stricte de chacune de vos générations ci.
  4. Afin d'obtenir plus d'informations, je recommanderais de faire un tutoriel quelconque pour vous salir les mains et construire vous-même un pipeline. Stark et wayne ont un tutoriel qui pourrait être utile. Afin de vous aider à comprendre les ressources, il existe également un tutoriel sur les ressources , qui pourrait vous être utile en particulier.

De plus, pour obtenir votre erreur spécifique, la raison pour laquelle vous voyez missing inputs est parce que Concourse recherchera des répertoires (créés par la ressource gets) nommés pour chacune de ces entrées. Vous devrez donc get des instances de ressource nommées Gist-upd et Gist-out avant de commencer la tâche.

12
Josh Zarrabi