如何利用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
相关产品推荐
相关产品推荐

