Gitlab CI中cache / artifacts的正确用法是什么?

当项目构build中没有使用caching文件时,我正面临一个问题。 在我的情况下,我想在构build阶段下载composer php依赖项,然后在所有其他阶段成功后将它们添加到最终项目文件夹中。 我认为如果你把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 

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

从我的理解我已经正确设置caching – 我有未跟踪设置为true,path包括供应商文件夹和密钥设置为pipe道ID,这应该是在其他阶段相同。

我已经看到一些包含Artifacts设置,但是除非您使用Dependencies ,否则不应该有任何效果。

我不知道我在做什么错。 我需要首先下载composer php的依赖关系,所以我可以通过rsync在下一个阶段复制它们。 你有什么想法/解决scheme? 谢谢

应该使用工件来永久性地提供任何您可能需要在pipe道末端的文件,例如生成的二进制文件,stream水线下一阶段所需的文件,覆盖率报告或甚至磁盘映像。 但是caching应该用来加快构build过程,例如,如果编译C / C ++二进制文件,第一次构build通常需要很长时间,但后续构build通常更快,因为它不是从头开始,所以如果你是通过使用caching来存储编译器制作的临时文件,这将加快跨不同stream水线的编译。

所以要回答你,你应该使用工件,因为你似乎需要运行每个pipe道composer php,但要传递文件到下一个工作。 你不需要在你的gitlab-ci.yml中明确定义依赖关系,因为如果没有定义,每个作业都会从所有以前的作业中抽取所有的工件。 caching应该工作,但它是不可靠的,更好的configuration,使其更好,但不是必要的。