我在项目构建中未使用缓存文件时遇到问题。在我的情况下,我想在构建阶段下载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
在Gitlab documentation中说:cache is used to specify a list of files and directories which should be cached between jobs.
根据我的理解,我已正确设置缓存 - 我已将未跟踪设置为true,路径包含供应商文件夹,并且密钥设置为管道ID,在其他阶段也应该相同。
我看过一些包含Artifacts
的设置,但除非您将其与Dependencies
一起使用,否则它不会产生任何影响。
我不知道我做错了什么。我需要先下载composer依赖项,这样我才能在下一阶段通过rsync
复制它们。你有什么想法/解决方案吗?感谢
答案 0 :(得分:5)
应使用工件永久地提供管道末端可能需要的任何文件,例如生成的二进制文件,管道下一阶段所需的文件,覆盖率报告或甚至磁盘映像。但是应该使用缓存来加速构建过程,例如,如果编译C / C ++二进制文件,第一次构建通常需要很长时间,但后续构建通常更快,因为它不是从头开始,所以如果你是通过使用缓存存储编译器生成的临时文件,它将加快不同管道的编译速度。
所以为了回答你,你应该使用工件,因为你似乎需要在每个管道中运行composer但是想要将文件传递给下一个工作。您不需要在gitlab-ci.yml中明确定义依赖项,因为如果未定义,则每个作业都会从所有先前作业中提取所有工件。缓存应该工作,但它不可靠,并且对于配置更好,它使它更好但不是必需的。