Gitlab CI中缓存/工件的正确用法是什么?

Wel*_*oud 5 caching gitlab composer-php docker gitlab-ci

当项目构建中不使用缓存文件时,我面临一个问题。就我而言,我想在构建阶段下载composer依赖项,然后在所有其他阶段都成功之后将它们添加到最终项目文件夹中。我认为,如果将cache属性设置到.gitlab-ci.yml文件中,它也会在其他阶段共享和使用。但这有时有效,有时却无效。

Gitlab版本是9.5.4

这是我的.gitlab-ci.yml文件:

image: ponk/debian:jessie-ssh

variables:
    WEBSERVER: "user@example.com"
    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
Run Code Online (Sandbox Code Playgroud)

Gitlab文档中说:cache is used to specify a list of files and directories which should be cached between jobs.

据我了解,我已经正确设置了缓存-我将untracked设置为true,路径包括供应商文件夹,并且密钥设置为Pipeline ID,在其他阶段也应该相同。

我已经看到了一些包含的设置Artifacts,但是除非将它与一起使用,否则Dependencies它不会产生任何效果。

我不知道我在做什么错。我需要首先下载composer依赖项,因此我可以rsync在下一阶段通过复制它们。您有什么想法/解决方案吗?谢谢

Cli*_*ara 9

应该使用工件来永久提供管道末端可能需要的任何文件,例如生成的二进制文件,管道下一阶段所需的文件,覆盖率报告甚至磁盘映像。但是应使用缓存来加快构建过程,例如,如果您编译C / C ++二进制文件,则通常第一次构建花费很长时间,但是后续构建通常更快,因为它不是从头开始的,因此,如果您将使用缓存存储由编译器生成的临时文件,这将加快跨不同管道的编译速度。

因此,要回答您的问题,您应该使用工件,因为您似乎需要在每个管道上运行composer,但希望将文件传递给下一个作业。您无需在gitlab-ci.yml中显式定义依赖项,因为如果未定义,则每个作业都会拉回所有先前作业中的所有工件。缓存应该可以工作,但是它并不可靠,并且对于配置更好,但不是必须的,它可以更好地进行配置。