gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:15:56 26 4
gpt4 key购买 nike

在项目构建中不使用缓存文件时,我面临一个问题。就我而言,我想在构建阶段下载 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.
据我所知,我已经正确设置了缓存 - 我已将 untracked 设置为 true,路径包括供应商文件夹, key 设置为管道 ID,在其他阶段也应该相同。

我看过一些设置,其中包含 Artifacts ,但除非您将它与 Dependencies 一起使用,它应该没有任何影响。

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

最佳答案

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

因此,要回答您,您应该使用工件,因为您似乎需要在每个管道上运行 Composer,但希望将文件传递给下一个作业。您不需要在 gitlab-ci.yml 中明确定义依赖项,因为如果未定义,每个作业都会从所有以前的作业中提取所有工件。缓存应该可以工作,但它不可靠,并且对于可以使其更好但不是必需的配置更好。

关于caching - Gitlab CI 中缓存/工件的正确用法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46281351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com