2016-03-23 24 views
9

Non riesco a ottenere la cache o gli artefatti da trasferire tra i lavori in gitlab CI. Sospetto che abbia qualcosa a che fare con la mia configurazione, ma non sono sicuro di cosa. Sto eseguendo gitlab e gitlab-ci-multirunner, entrambi nella finestra mobile, usando la seguente configurazione di docker-compose. Ho lasciato fuori la configurazione del database e alcune variabili di ambiente per brevità:Configurazione Gitlab CI runner con cache nella finestra mobile

version: '2' 

services: 
    gitlab: 
    image: sameersbn/gitlab:8.5.1 
    links: 
     - redis:redisio 
     - postgresql:postgresql 
    ports: 
     - "10080:80" 
     - "10022:22" 
    environment: 
     ... 
    volumes: 
     - gitlab_data:/home/git/data 

    gitlab-ci-runner: 
    restart: always 
    image: gitlab/gitlab-runner 
    volumes: 
     - gitlab_runner_config_data:/etc/gitlab-runner 
     - /var/run/docker.sock:/var/run/docker.sock 
     - /etc/nginx/ssl/gitlab.crt:/etc/gitlab-runner/certs/ca.crt 
     - /etc/ssh:/ssh 
    links: 
     - gitlab:gitlab 

    redis: 
    ... 
    postgresql: 
    ... 


volumes: 
    postgresql_data: 
    redis_data: 
    gitlab_data: 
    gitlab_runner_config_data: 

La configurazione corridore (config.toml) è:

concurrent = 1 

[[runners]] 
    name = "docker" 
    url = <public gitlab url>/ci 
    token = <gitlab token> 
    tls-ca-file = "/etc/gitlab-runner/certs/ca.crt" 
    executor = "docker" 
    [runners.docker] 
    image = "docker-bash" 
    volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"] 

L'immagine docker-bash di cui è solo l'immagine ufficiale docker:1.10 con bash installata.

mio processo di costruzione si compone di 3 fasi:

  1. Run npm install e le prove in immagine ufficiale node:5. Per ora, ho lasciato questo passaggio per testare la distribuzione.
  2. Creare un'immagine di finestra mobile contenente il codice
  3. Utilizzare ansible, tramite un'immagine mobile di docker ansibile creata per distribuire l'immagine creata sul server di produzione.

Il file .gitlab-ci.yml assomiglia a questo:

variables: 
    FULL_IMAGE_TAG: deploy-$CI_BUILD_REF_NAME:$CI_BUILD_ID-$CI_BUILD_REF 
    IMAGE_FILE: deploy-$CI_BUILD_REF_NAME.tar.gz 

cache: 
    paths: 
    - $IMAGE_FILE 

build: 
    stage: build 
    script: 
    - docker build -t $FULL_IMAGE_TAG . 
    - docker save $FULL_IMAGE_TAG | gzip -cf - > $IMAGE_FILE 
    artifacts: 
    paths: 
     - $IMAGE_FILE 

deploy: 
    stage: deploy 
    image: ansible-ssh 
    script: 
    - ls 
    - ansible-playbook -e image_file=$IMAGE_FILE -e branch=$CI_BUILD_REF_NAME -e full_image_name=$FULL_IMAGE_TAG deploy-playbook.yml 
    only: 
    - develop 
    - master 

Come si può vedere, l'immagine finestra mobile compressa viene indicato qui sia in sezioni di cache e manufatti, ma in realtà non è disponibile al passaggio deploy , dove dovrebbe essere ansibile copiarlo sulla macchina remota. Ho provato a includere un comando ls, quindi controlla il contenuto della cartella e il file non è chiaramente lì, ma è sicuramente costruito e posso scaricarlo dall'interfaccia utente di gitlab. Ecco il registro dal lavoro Deploy:

gitlab-ci-multi-runner 1.0.4 (014aa8c) 
Using Docker executor with image ansible-ssh ... 
Pulling docker image ansible-ssh ... 
WARNING: Cannot pull the latest version of image ansible-ssh : Error: image library/ansible-ssh not found 
WARNING: Locally found image will be used instead. 

Running on runner-59d43cf3-project-8-concurrent-0 via 381c2ea97744... 
Fetching changes... 
Removing artifacts.zip 
Removing deploy-develop.tar.gz 
HEAD is now at 6009bd0 test 
Checking out 6009bd0f as develop... 
HEAD is now at 6009bd0... test 

$ ls 
Dockerfile 
deploy-playbook.yml 
server 
$ ansible-playbook -e image_file=$IMAGE_FILE -e branch=$CI_BUILD_REF_NAME -e full_image_name=$FULL_IMAGE_TAG deploy-playbook.yml 
Using /etc/ansible/ansible.cfg as config file 
1 plays in deploy-playbook.yml 

PLAY *************************************************************************** 

TASK [setup] ******************************************************************* 
ok: [deploy-host] 

TASK [copy docker image] ******************************************************* 
task path: /builds/test/test/deploy-playbook.yml:44 
fatal: [deploy-host]: FAILED! => {"changed": false, "failed": true, "msg": "could not find src=/builds/test/test/deploy-develop.tar.gz"} 

NO MORE HOSTS LEFT ************************************************************* 
    to retry, use: --limit @deploy-playbook.retry 

PLAY RECAP ********************************************************************* 
deploy-host   : ok=1 changed=0 unreachable=0 failed=1 


ERROR: Build failed with: exit code 1 

ho il sospetto che io non sono la creazione o l'utilizzo in modo corretto il corridore, ma non riesco a trovare molto nella documentazione per nulla al di là dei casi veramente semplici e I don' Conosco abbastanza bene lo strumento per sapere come si inserisce tutto sotto il cofano.

+0

per essere sicuri i passi sono in esecuzione uno dopo l'altro ha fatto si tenta di aggiungere fasi: - Costruire - distribuire – Pascal

+0

ho fatto, ma posso vedere l'ordine che corrono dentro e va bene. – aquavitae

+0

Cosa succede se aggiungete il passo 'artefatti' al lavoro' deploy'? O spostalo sotto 'cache', quindi influenzerà tutti i lavori? L'altra domanda è, sei sicuro che sia 'cache' che' artefacts' possono puntare allo stesso percorso? Non lo so, sto solo cercando di aiutarti con la logica. ;) –

risposta

5

Il caching non è progettato per passare file tra le fasi di una build.

Dal doc

cache: Definire elenco di file che devono essere memorizzate nella cache tra successive piste

Penso che quello che serve è infatti in corso: WIP: Download build artifacts from previous stages and restore them in context of the build (Technology Preview)

+0

Sì, questo è quello che voglio ed è quello che sto cercando di fare, ma non funziona. Ho letto entrambi i link e ho aggiunto solo la cache per vedere se avrebbe fatto la differenza. Nonostante ciò che dice la documentazione, però, gli artefatti non vengono ripristinati nel secondo lavoro. – aquavitae

+0

build: e deploy: non sono due lavori, sono solo due passaggi dello stesso lavoro – Pascal

+0

Ok, forse la semantica è discutibile, ma allora? Fa la differenza? – aquavitae

0

Prima di tutto, aggiorna gitlab e gitlab runner, in particolare il runner 1.0.4 è stato tranquillo sperimentale.

In secondo luogo nella definizione della cache, si dovrebbe aggiungere una chiave vedono https://docs.gitlab.com/ce/ci/yaml/README.html#cache-key

cache: 
    key: "$CI_BUILD_REF_NAME" 
    paths: 
    - .. 

Dal https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/configuration/advanced-configuration.md#the-runners-section, è necessario modificare l'config.toml e aggiungere una directory di cache

cache_dir:

directory in cui le cache di compilazione verranno memorizzate nel contesto dell'esecutore selezionato (Locally, Docker, SSH). Se viene utilizzato l'esecutore di finestra mobile, questa directory deve essere inclusa nel parametro dei volumi.

0

Caching è un po 'strano, ma essenzialmente:

<dir path> sotto della cache sono disponibili tra un lavoro e costruire mentre <dir path> artefatti vi permetterà di utilizzarlo all'interno lo stesso lavoro.

Quindi:

cache: 
    untracked: true 
    key: "$CI_BUILD_REF_NAME" 
    paths: 
    - cache-dir/ 

setup: 
    stage: setup 
    [snip] 
    artifacts: 
    paths: 
    - cache-dir/ #notice that the path above is the same 

Questo vi permetterà di memorizzare nella cache i file tra di Lavoro composto, consentendo di utilizzare tale stessa cache all'interno lo stesso lavoro.

Non dimenticare di aggiungere i file necessari alle risorse in ogni fase di creazione.

Problemi correlati