You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用GitHub Actions缓存获取/vendor目录优化部署流程?

GitHub Actions中Composer Vendor跨作业复用的解决方案

能不能用缓存让第三个作业拿到/vendor目录?

可以,但得满足两个前提:

  • 缓存的key要统一:第二个作业存缓存时,用composer.lock的哈希值+运行环境(比如系统、PHP版本)作为key,第三个作业用完全相同的key去读缓存。
  • 两个作业的运行环境要一致:比如都是ubuntu-latest、PHP版本相同,不然缓存匹配不上。

举个配置示例:
第二个作业存缓存:

- name: 缓存Composer Vendor
  uses: actions/cache@v3
  with:
    path: vendor
    key: composer-${{ hashFiles('composer.lock') }}-${{ runner.os }}

第三个作业读缓存:

- name: 从缓存恢复Composer Vendor
  uses: actions/cache@v3
  with:
    path: vendor
    key: composer-${{ hashFiles('composer.lock') }}-${{ runner.os }}

不过要注意,缓存有有效期,而且如果composer.lock更新了,缓存会失效,得重新安装。

要不要在最后一步重新执行composer install?第二个作业是不是多余?

分两种情况看:

情况1:直接在第三个作业装vendor,删掉第二个作业

如果第二个作业除了装vendor没别的操作,那确实多余。直接把composer install移到第三个作业,同时用缓存加速就行,流程更简单:

- name: 缓存Composer Vendor
  uses: actions/cache@v3
  id: composer-cache
  with:
    path: vendor
    key: composer-${{ hashFiles('composer.lock') }}-${{ runner.os }}

- name: 安装Composer依赖
  if: steps.composer-cache.outputs.cache-hit != 'true'
  run: composer install --no-interaction --prefer-dist --optimize-autoloader

这样缓存命中就跳过安装,没命中再执行,速度也不会慢。

情况2:保留第二个作业的场景

如果第二个作业还要做其他依赖vendor的操作(比如代码检查、单元测试),那留着它是有用的;不然单独一个作业只装vendor就没必要。

额外建议(针对Sage主题)

你可以把构建资源、装vendor、部署放到同一个作业里,彻底避免跨作业传递的麻烦:

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      # 处理Node依赖和资源构建
      - name: 缓存node_modules
        uses: actions/cache@v3
        id: node-cache
        with:
          path: node_modules
          key: node-${{ hashFiles('package-lock.json') }}-${{ runner.os }}

      - name: 安装Node依赖
        if: steps.node-cache.outputs.cache-hit != 'true'
        run: npm install

      - name: 构建静态资源
        run: npm run build

      # 处理Composer依赖
      - name: 缓存Composer Vendor
        uses: actions/cache@v3
        id: composer-cache
        with:
          path: vendor
          key: composer-${{ hashFiles('composer.lock') }}-${{ runner.os }}

      - name: 安装Composer依赖
        if: steps.composer-cache.outputs.cache-hit != 'true'
        run: composer install --no-interaction --prefer-dist --optimize-autoloader

      # 部署
      - name: 用rsync部署
        run: rsync -avz --delete ./public/ ./vendor/ user@server:/path/to/sage/theme/

单作业的方式减少了跨作业的开销,也降低了缓存失效或工件传递失败的风险,更适合Sage主题的部署场景。

内容的提问来源于stack exchange,提问作者Pof

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:25:18