能否通过GitHub Action将构建产物提交至指定分支?
问题
摘要
能否通过GitHub Action将构建产物提交至特定分支(例如prod分支)?
背景/问题缘由
我正在搭建首条部署流水线,已尝试两种策略但均不满意:
- 策略1:构建Laravel和Vue应用;打包产物后通过scp推送至服务器并解压。后续更新能力不佳,且应用内用于上传的storage app文件夹无法保持持久化。
- 策略2:通过GitHub Action以SSH登录服务器,从master分支执行git pull。但git pull不会拉取
node_modules这类依赖,需在部署时在服务器构建并删除node_modules和dev-dependencies,在服务器构建存在诸多问题。
解决方案:用GitHub Action推送构建产物至
prod分支 完全可以实现这个需求,核心逻辑是在GitHub Action环境中完成项目构建,再将纯净的构建产物提交并推送到prod分支。以下是具体实现步骤:
1. 创建GitHub Action工作流文件
在项目根目录的.github/workflows下新建deploy-to-prod.yml文件,内容如下:
name: 构建并推送产物至prod分支 on: push: branches: - master # 当master分支有代码推送时触发流程 jobs: build-and-deploy: runs-on: ubuntu-latest steps: # 拉取仓库完整代码(需拉取全量历史以操作分支) - name: 拉取代码 uses: actions/checkout@v4 with: fetch-depth: 0 # 配置Node环境(根据项目实际版本调整) - name: 设置Node.js环境 uses: actions/setup-node@v4 with: node-version: '20' cache: 'npm' # 缓存依赖加速构建 # Laravel+Vue项目构建流程 - name: 安装Laravel生产依赖 run: composer install --no-dev --optimize-autoloader - name: 安装前端依赖 run: npm ci # 基于lock文件安装,保证依赖版本一致 - name: 构建前端资源 run: npm run build # 清理非必要文件(按需调整) - name: 清理开发相关文件 run: | rm -rf node_modules rm -rf composer.json composer.lock rm -rf .gitignore .env.example # 配置Git身份用于提交 - name: 配置Git用户信息 run: | git config --global user.name "GitHub Action" git config --global user.email "action@github.com" # 切换或创建prod分支 - name: 切换到prod分支 run: git checkout prod || git checkout -b prod # 清空prod分支现有内容(保留.git目录) - name: 清空prod分支旧内容 run: ls -a | grep -v -E '^\.$|^\.\.$|^\.git$' | xargs rm -rf # 复制构建产物到prod分支根目录 - name: 复制构建产物 run: cp -r ../* . # 提交并推送 - name: 提交推送产物 run: | git add . git commit -m "Deploy build artifacts to prod" git push origin prod
2. 关键细节说明
- 依赖安装:
composer install --no-dev只安装生产环境依赖,避免冗余文件;npm ci保证依赖版本与本地开发环境一致。 - 分支处理:通过
git checkout prod || git checkout -b prod自动处理分支不存在的情况;清空分支时保留.git目录,确保分支结构正常。 - 持久化目录:服务器上的
storage/app可配置为Git忽略,部署时仅拉取prod分支代码,不会覆盖该目录的持久化内容。
3. 服务器部署优化
后续服务器只需从prod分支拉取代码即可直接运行,无需再执行构建步骤,彻底解决服务器构建的依赖问题。
内容的提问来源于stack exchange,提问作者MartinTTS
相关产品推荐
相关产品推荐

