【问题标题】:Error on Composer before deploying on Bitbucket Pipeline在 Bitbucket Pipeline 上部署之前 Composer 出错
【发布时间】:2022-01-06 14:27:58
【问题描述】:

我们有一个 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 缓存。 阅读 composer cache not working on bitbucket pipeline buildhttps://github.com/lorisleiva/laravel-docker/issues/67,但仍然不知道为什么会这样,因此非常欢迎任何帮助或建议。

【问题讨论】:

    标签: laravel docker bitbucket laravel-vapor


    【解决方案1】:

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

    现在开始我们的分析??

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

    1. preparation 阶段运行“composer”作业,该作业运行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 系统缓存,并自动提供给后续阶段。 太好了,因为这意味着我们安装依赖项一次,然后我们可以在测试和部署阶段重新使用它。所以我们“部署了我们测试过的东西”...... 但这实际上是错误的,因为生产我们不想安装开发依赖项。这就是我们在 deploy 阶段在 composer 中使用 --no-dev 标志的原因。请记住,我们确实需要那些开发依赖项来运行 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,它会完美运行,但是That's A NoNo

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

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

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


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

    【讨论】:

      【解决方案2】:

      我也有同样的问题。

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

       - 'COMPOSER_MIRROR_PATH_REPOS=1 composer install'
      

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

      【讨论】:

        【解决方案3】:

        我遇到了同样的问题,但终于解决了。

         include(/builds/myapp/myapp-api/vendor/composer/../composer/composer/sr  
          c/Composer/Console/GithubActionError.php): Failed to open stream: No such f  
          ile or directory           
        

        我正在使用具有相同 lorisleiva/laravel-docker:8.0 图像的 gitlab 管道。进一步调查我发现composer self-update 给出了Command "self-update" is not defined. 所以我认为这是关于作曲家的。

        所以我像这样更改 .gitlab.ci.yml 文件;

        - curl -sS https://getcomposer.org/installer | php
        - ./composer.phar -V
        - ./composer.phar install --prefer-dist --no-ansi --no-interaction --no-progress --no-scripts --ignore-platform-reqs
        

        所以我下载了新的 composer.phar 文件并使用它而不是默认的 composer 命令并且它可以工作。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-12-18
          • 2021-08-13
          • 2017-03-03
          • 2017-02-13
          • 2016-07-25
          • 2019-12-10
          • 1970-01-01
          • 2021-08-12
          相关资源
          最近更新 更多