0

我们有一个 CI&CD 流程,其中包含一个 dockerfile,用于通过 bitbucket 管道部署到 laravel vapor 环境,该管道由 4 个基本步骤组成:

  • 安装
  • 建造
  • 测试
  • 部署

有趣的是,我们顺利通过了 3 个步骤。

我们可以在本地环境的第 4 步运行相同的命令,然后部署到任何环境都不会出现任何问题。

但是,当我们尝试通过 Bitbucket Pipeline 部署它时(它已经在 10 天前工作,但现在已损坏)我们失败并显示错误消息

In ClassLoader.php line 571:
                                                                               
  include(/opt/atlassian/pipelines/agent/build/.vapor/build/app/vendor/compos  
  er/../composer/composer/src/Composer/Console/GithubActionError.php): Failed  
   to open stream: No such file or directory                  

在作曲家安装命令。

我们当前的管道配置:

image: lorisleiva/laravel-docker:8.0

definitions:
  steps:
    - step: &Install
        name: Install
        script:
          - npm ci
          - composer install
          - composer dump-autoload
        artifacts:
          - node_modules/**
          - vendor/**
    - step: &Build
        name: Build
        script:
          - npm run prod
        artifacts:
          - public/**
          - vendor/**
    - step: &Test
        name: Test & Lint
        script:
          - php -d memory_limit=4G vendor/bin/phpstan
          - vendor/bin/phplint ./ --exclude=vendor
          - vendor/bin/phpunit --coverage-text --colors=never
  caches:
    node: node_modules
    composer: vendor
    public: public

pipelines:
  branches:
    release/test:
      - step: *Install
      - step: *Build
      - step: *Test
      - step:
          name: Release to Vapor [test]
          services:
            - docker
          script:
            - COMMIT_MESSAGE=`git log --format=%B -n 1 $BITBUCKET_COMMIT`
            - vendor/bin/vapor deploy test --commit="$BITBUCKET_COMMIT" --message="$COMMIT_MESSAGE"

我们的蒸汽测试 dockerfile

FROM laravelphp/vapor:php80

COPY . /var/task

和我们的蒸汽配置:

build:
      - "COMPOSER_MIRROR_PATH_REPOS=1 composer install --no-dev"
      - "php artisan event:cache"
      - "npm ci && npm run prod && rm -rf node_modules"
    deploy:
      - "php artisan migrate"
      - "php artisan lighthouse:clear-cache"

试图删除 bitbucket 管道配置上的作曲家缓存。阅读composer cache not working on bitbucket pipeline buildhttps://github.com/lorisleiva/laravel-docker/issues/67但仍然不知道为什么会这样,所以任何帮助或建议都非常受欢迎。

4

2 回答 2

1

TLDR:rm -rf ./vendor在您的作曲家安装之前运行,然后再部署。

现在开始我们的分析

我们在 GitLab CI 中运行所有测试和部署(感谢 @lorisleiva)。我们在 3 个阶段有 3 个工作:

  1. 准备阶段运行“作曲家”作业,该作业运行composer install --prefer-dist --no-ansi --no-interaction --no-progress --no-scripts
  2. 测试阶段运行“phpunit”作业
  3. deploy阶段运行我们的 Vapor 部署脚本,该脚本运行COMPOSER_MIRROR_PATH_REPOS=1 composer install --prefer-dist --no-ansi --no-interaction --no-progress --optimize-autoloader --no-dev

因此,在 composer 作业中,我们安装了我们的开发依赖项,因为我们需要它们来测试应用程序。结果./vendor目录被 GitLab 的 CI 系统缓存,并自动提供给后续阶段。太好了,因为这意味着我们安装依赖项一次,然后我们可以在测试和部署阶段重新使用它。所以我们“部署与我们测试过的相同的东西”......但这实际上是错误的,因为生产我们不想安装开发依赖项。这就是为什么我们在部署阶段使用--no-devcomposer 中的标志。请记住,我们确实需要那些开发依赖项来运行 phpunit。当我们运行它时,我们会看到如下消息:

Installing dependencies from lock file
Verifying lock file contents can be installed on current platform.
Package operations: 0 installs, 0 updates, 73 removals

这是有道理的,我们已经可以./vendor从作曲家作业访问缓存目录,现在我们只需要删除开发依赖项。那就是事情分崩离析的时候。我不知道这是否是作曲家本身、依赖项、我们的代码库等中的一个错误……但作曲家...GithubActionError.php在尝试删除开发依赖项时出错并出现错误。如果我们删除--no-dev它,它会完美运行,但那是 A NoNo

长话短说,我们的解决方案是接受 composer.lock 存在并且该作业在 CI 中运行(下载速度非常快)这一事实。因此,我们在 deployable 之前对./vendor运行的目录进行核对。rm -rf ./vendorcomposer install ... --no-dev

最后,我认为这是完全可以接受的。我确信有一种方法可以告诉 GitLab 避免下载缓存./vendor目录,或者是一种更好的方法来做到这一点。但是我们今天花了很多时间试图理解和解决这个问题......所以,它会保持这样的状态。而且,不,它看起来与lorisleiva/laravel-docker:x.xdocker 图像无关。

我希望这会有所帮助或至少很有趣:)如果有人找到更好的方法,请告诉我。


来源在这里https://github.com/lorisleiva/laravel-docker/issues/67#issuecomment-1009419913

于 2022-01-10T23:52:03.797 回答
0

我有同样的问题。

如果我删除此行中的 vapor.yaml 文件“--no-dev”,则工作正常。

 - 'COMPOSER_MIRROR_PATH_REPOS=1 composer install'

当然不是解决方案,但也许它有助于识别问题。

于 2022-01-07T09:36:36.590 回答