Qual é o uso correto de cache/artefatos no GitLab CI?

estou a enfrentar um problema quando os ficheiros em cache não são usados nas compilações de projectos. No meu caso, eu quero baixar as dependências do compositor no estágio de construção e, em seguida, adicioná-las na pasta final do projeto depois de todas as outras etapas forem bem-sucedidas. Eu pensei que se você definir cache atributo em .gitlab-ci.yml arquivo, ele será compartilhado e usado em outras etapas também. Mas isto às vezes funciona e às vezes não.

a versão do Gitlab é 9.5.4

Aqui está o meu ficheiro .gitlab-ci.yml:

image: ponk/debian:jessie-ssh

variables:
    WEBSERVER: "[email protected]"
    WEBSERVER_DEPLOY_DIR: "/domains/example.com/web-presentation/deploy/"
    WEBSERVER_CDN_DIR: "/domains/example.com/web-presentation/cdn/"
    TEST_VENDOR: '[ "$(ls -A ${WEBSERVER_DEPLOY_DIR}${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA}/vendor)" ]'

cache:
  key: $CI_PIPELINE_ID
  untracked: true
  paths:
    - vendor/

before_script:


stages:
    - build
    - tests
    - deploy
    - post-deploy

Build sources:
    image: ponk/php5.6
    stage: build
    script:
        # Install composer dependencies
        - composer -n install --no-progress
    only:
        - tags
        - staging


Deploy to Webserver:
    stage: deploy
    script:
        - echo "DEPLOYING TO ... ${WEBSERVER_DEPLOY_DIR}${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA}"
        - ssh $WEBSERVER mkdir -p ${WEBSERVER_DEPLOY_DIR}${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA}
        - rsync -rzha app bin vendor www .htaccess ${WEBSERVER}:${WEBSERVER_DEPLOY_DIR}${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA}
        - ssh $WEBSERVER '${TEST_VENDOR} && echo "vendor is not empty, build seems ok" || exit 1'
        - ssh $WEBSERVER [ -f ${WEBSERVER_DEPLOY_DIR}${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA}/vendor/autoload.php ] && echo "vendor/autoload.php exists, build seems ok" || exit 1
        - echo "DEPLOYED"
    only:
        - tags
        - staging

Post Deploy Link PRODUCTION to Webserver:
    stage: post-deploy
    script:
        - echo "BINDING PRODUCTION"
        - ssh $WEBSERVER unlink ${WEBSERVER_DEPLOY_DIR}production-latest || true
        - ssh $WEBSERVER ln -s ${WEBSERVER_DEPLOY_DIR}${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA} ${WEBSERVER_DEPLOY_DIR}production-latest
        - echo "BOUNDED  $CI_COMMIT_SHA -> production-latest"
        - ssh $WEBSERVER sudo service php5.6-fpm reload
    environment:
        name: production
        url: http://www.example.com
    only:
        - tags

Post Deploy Link STAGING to Webserver:
    stage: post-deploy
    script:
        - echo "BINDING STAGING"
        - ssh $WEBSERVER unlink ${WEBSERVER_DEPLOY_DIR}staging-latest || true
        - ssh $WEBSERVER ln -s ${WEBSERVER_DEPLOY_DIR}${CI_COMMIT_REF_NAME}/${CI_COMMIT_SHA} ${WEBSERVER_DEPLOY_DIR}staging-latest
        - echo "BOUNDED  ${CI_COMMIT_SHA} -> staging-latest"
        - ssh $WEBSERVER sudo service php5.6-fpm reload
    environment:
        name: staging
        url: http://staging.example.com
    only:
        - staging

em A documentação do Gitlab diz:: cache is used to specify a list of files and directories which should be cached between jobs.

pelo que sei, configurei o cache correctamente - não localizei o true, o path inclui a pasta do fornecedor e a chave está configurada para o ID do Pipeline, que deve ser a mesma em outras fases também.

Já vi algumas montagens que continham Artifacts, mas a menos que a uses com Dependencies, não deve ter qualquer efeito.

Não sei o que estou a fazer de errado. Primeiro preciso de transferir as dependências do compositor, para que as possa copiar via rsync na próxima etapa. Tem alguma ideia / solução? Obrigado.
Author: WellBloud, 2017-09-18

1 answers

Os artefactos devem ser usados para disponibilizar permanentemente todos os ficheiros de que possa necessitar no final de um gasoduto, por exemplo, binários gerados, ficheiros necessários para a próxima fase do gasoduto, relatórios de cobertura ou até mesmo uma imagem de disco. Mas cache deve ser usado para acelerar o processo de compilação, por exemplo, se você compilar um binário C / C++ normalmente leva um longo tempo para a primeira compilação, mas as compilações subsequentes são geralmente mais rápidas, porque não começa do zero, então se você fosse armazenar os arquivos temporários feitos pelo compilador usando cache, aceleraria a compilação através de diferentes pipelines.

Então para responder, você deve usar artefatos porque você parece precisar executar composer cada pipeline, mas quer passar os arquivos para o próximo trabalho. Você não precisa definir explicitamente dependências em seu gitlab-ci.yml porque se não estiver definido, cada trabalho puxa todos os artefactos de todos os trabalhos anteriores. Cache deve funcionar, mas não é confiável e é melhor para uma configuração onde o torna melhor, mas não é uma necessidade.

 3
Author: Clive Makamara, 2017-09-21 10:46:18