GitHub Actions部署React+Express至AWS EB时dist文件夹未部署问题求助
问题:GitHub Actions部署React+Express到Elastic Beanstalk时dist文件夹未被部署
我正尝试通过GitHub Actions搭建部署流程,实现React应用构建并通过Express提供服务。以下是我的GitHub Actions工作流配置:
name: EB Deploy on: push: branches: [ main ] jobs: deploy: runs-on: ubuntu-latest env: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_DEFAULT_REGION: ${{ secrets.AWS_DEFAULT_REGION }} steps: - uses: actions/checkout@v2 - name: Set up Python 3.9 uses: actions/setup-python@v2 with: python-version: 3.9 - name: Install dependencies run: | python -m pip install --upgrade pip pip install awsebcli - uses: actions/setup-node@v2 with: node-version: '16' - name: Deploy to Elastic Beanstalk run: | cd client npm i npm run build mv dist .. cd .. eb deploy
Express静态资源托管配置:
app.use(express.static(path.join(__dirname, './dist')))
目前流程其他环节均正常,但eb命令并未部署dist文件夹,即使执行eb labs download下载部署版本,压缩包中也找不到dist目录。最终我通过压缩整个目录并执行eb deploy --staged才完成部署,想请教为何原流程无法部署dist文件夹,以及正确的部署方案。
原因分析
- EB CLI默认部署规则:EB CLI默认仅打包Git追踪的文件生成部署包,而
dist作为构建产物,通常会被添加到.gitignore中,因此不会被纳入部署范围 - 文件移动不改变Git追踪状态:工作流中把
dist从client目录移到根目录,但该目录依然不在Git的追踪列表内,eb deploy命令无法识别并包含它
正确部署方案
方案一:使用eb deploy --staged(推荐,已验证可行)
--staged参数会让EB CLI基于当前工作目录的所有文件(无论是否被Git追踪)生成部署包,刚好适配构建产物的部署需求。调整工作流的部署步骤即可:
- name: Deploy to Elastic Beanstalk run: | cd client npm i npm run build mv dist .. cd .. eb deploy --staged
方案二:用.ebignore文件控制部署内容
在项目根目录创建.ebignore文件,通过该文件指定部署时要包含/排除的内容(优先级高于.gitignore):
# 排除不需要的依赖目录 node_modules/ # 排除React源码目录,只保留构建产物 client/ # 明确包含dist目录 !dist/
配置完成后直接运行eb deploy,EB CLI会遵循.ebignore的规则打包文件。
方案三:临时将dist加入Git暂存(不推荐)
如果不想使用前两种方案,可以在构建后临时把dist加入Git暂存区,部署完成后再移除暂存状态:
- name: Deploy to Elastic Beanstalk run: | cd client npm i npm run build mv dist .. cd .. git add dist eb deploy git reset HEAD dist
该方法仅在GitHub Actions的临时仓库中操作,不会影响本地或远程仓库的Git状态,但流程相对繁琐,不如前两种方案简洁。
内容的提问来源于stack exchange,提问作者oskr
相关产品推荐
相关产品推荐

