如何通过Github Action构建React应用,再通过AWS CodeDeploy部署到EC2?
可行实现方案
你当前的问题核心是两点:
- Github Action中不同Job运行在完全独立的Runner实例上,build阶段生成的
/build、node_modules等产物默认不会传递到deploy阶段 - 使用
--github-location参数时CodeDeploy只会拉取对应提交的原始仓库代码,不会包含CI流程中生成的动态产物
正确的实现方式是走「S3中转构建产物包」的流程,不需要把构建产物提交到Git仓库,修改后的工作流配置如下:
修改后的完整工作流配置
name: Deploy to staging on: push: branches: [master] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 # 安装依赖、构建 - name: npm install for Server run: npm ci - name: npm install in client DIR and build run: | cd client npm ci npm run build env: CI: false # 上传构建产物和部署所需文件到Action缓存,供deploy阶段使用 - name: Upload build artifacts uses: actions/upload-artifact@v4 with: name: deploy-package # 这里列出所有需要部署到EC2的文件/文件夹,按需调整 path: | ./ !.git/ !.github/ deploy: needs: build runs-on: ubuntu-latest if: github.ref == 'refs/heads/master' steps: # 下载build阶段上传的所有产物 - name: Download build artifacts uses: actions/download-artifact@v4 with: name: deploy-package - name: Configure AWS credentials uses: aws-actions/configure-aws-credentials@v4 with: aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} aws-region: us-east-1 # 把所有部署文件打包成zip上传到S3 - name: Upload deployment package to S3 run: | zip -r deploy-package.zip . aws s3 cp deploy-package.zip s3://${{ secrets.S3_DEPLOY_BUCKET_NAME }}/deploy-package-${{ github.sha }}.zip # 触发CodeDeploy,从S3拉取产物包部署 - name: Create CodeDeploy Deployment run: | aws deploy create-deployment \ --application-name "app-name" \ --deployment-group-name "deply-app-ec2" \ --deployment-config-name CodeDeployDefault.OneAtATime \ --s3-location bucket=${{ secrets.S3_DEPLOY_BUCKET_NAME }},key=deploy-package-${{ github.sha }}.zip,bundleType=zip
前置配置要求
- 提前在AWS S3中创建一个专属的部署包存储桶,把桶名存入Github仓库的Secrets中,命名为
S3_DEPLOY_BUCKET_NAME - 给Github Action使用的AWS IAM用户增加S3桶的上传权限、CodeDeploy的部署创建权限
- 给CodeDeploy的服务角色增加对应S3桶的读取权限
- 确保你仓库根目录的
appspec.yml配置正确,部署脚本的路径和执行逻辑匹配上传的产物结构
内容的提问来源于stack exchange,提问作者Stanley Moon
相关产品推荐
相关产品推荐

