超详细 GitHub Actions 自动发布部署教程
在日常开发中,项目迭代完成后的打包、上传、部署工作往往重复且繁琐:每次更新代码都需要本地打包、登录服务器、替换文件、重启服务,不仅浪费时间,还容易因人为操作失误导致部署失败。
而 GitHub Actions 完美解决了这个痛点,作为 GitHub 官方免费的 CI/CD 工具,无需额外搭建服务器、无需第三方平台,仅通过简单的配置文件,就能实现 代码提交自动触发构建、打包、测试、部署上线 的全自动化流程。
一、什么是 GitHub Actions?
GitHub Actions 是 GitHub 内置的持续集成/持续部署(CI/CD)服务,核心作用是 监听仓库代码变动,自动执行自定义工作流,适配前端、后端、静态网站、服务端项目等几乎所有开发场景。
1. 核心术语
-
Workflow(工作流) :完整的自动化任务流程,一个仓库可配置多个工作流,文件存放于仓库
.github/workflows/目录下,后缀为.yml。 -
Event(触发事件) :触发工作流的条件,最常用的是
push(代码推送)、pull_request(合并请求)。 -
Job(任务):工作流中的独立执行单元,一个工作流可包含多个任务,默认并行执行。
-
Step(步骤):任务中的具体执行步骤,可执行命令、调用官方插件、自定义脚本。
-
Action(动作):可复用的自动化脚本(官方/开源社区提供),简化配置,无需手写复杂命令。
2. 优势亮点
-
完全免费:公开仓库无使用限制,私有仓库免费额度足够个人/小型团队使用;
-
开箱即用:内置大量官方 Action 插件,支持打包、部署、SSH、OSS 上传等场景;
-
跨平台:支持 Windows、Linux、MacOS 运行环境;
-
轻量高效:无需搭建 Jenkins、GitLab CI 等专属服务,零运维成本。
二、前置准备工作
在配置自动化部署前,只需准备2个基础条件
-
已有 GitHub 仓库,项目代码已上传(前端Vue/React、后端Node、静态网页等均可);
-
部署目标资源:服务器(云服务器/轻量应用服务器)、GitHub Pages、阿里云OSS、腾讯云COS 等(本文以 服务器SSH部署 通用场景为例);
-
服务器已开启 SSH 登录权限,可正常远程连接。
三、从零配置 GitHub Actions 自动部署
我们以 前端项目(Vue/React)提交代码→自动打包→自动上传服务器部署 为例,手把手完成完整配置,其他项目(后端、静态站)可通用适配。
步骤1:创建工作流配置文件
在你的项目根目录,新建文件夹层级:.github/workflows/,并在目录下新建配置文件,命名为 deploy.yml(文件名自定义,后缀必须 yml)。
重点:目录名称
.github/workflows必须完全一致,否则 GitHub 无法识别工作流。
步骤2:完整配置文件详解
下面是通用的前端自动部署配置,包含「代码拉取-环境安装-依赖下载-项目打包-服务器部署」全流程:
yaml
# 工作流名称,GitHub 后台展示的任务名称
name: Auto Deploy Project
# 触发条件:main分支推送代码、合并代码时触发
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
# 执行任务
jobs:
# 构建打包任务
build-and-deploy:
# 运行环境:最新Ubuntu系统
runs-on: ubuntu-latest
# 执行步骤
steps:
# 1. 拉取当前仓库代码
- name: Checkout Code
uses: actions/checkout@v4
# 2. 安装Node.js环境(适配前端项目)
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: 18 # 适配你的项目Node版本
cache: 'npm' # 缓存依赖,提升下次构建速度
# 3. 安装项目依赖
- name: Install Dependencies
run: npm install
# 4. 项目打包(根据你的项目修改打包命令)
- name: Build Project
run: npm run build
# 5. 部署到远程服务器(核心步骤)
- name: Deploy to Server
uses: easingthemes/ssh-deploy@v2
env:
# 服务器SSH密钥(后续配置GitHub密钥)
SSH_PRIVATE_KEY: ${{ secrets.SSH_KEY }}
# 服务器IP、端口、账号
REMOTE_HOST: ${{ secrets.SERVER_HOST }}
REMOTE_USER: ${{ secrets.SERVER_USER }}
REMOTE_PORT: ${{ secrets.SERVER_PORT }}
# 本地打包后的文件目录(前端默认dist)
SOURCE: dist/
# 服务器部署目录(替换为你的项目部署路径)
TARGET: /usr/local/nginx/html/project
# 部署前清空服务器旧文件(避免残留缓存)
ARGS: "-rltgoDzvO --delete"
步骤3:配置 GitHub 仓库密钥
配置文件中 secrets.xxx 是加密环境变量,绝对不能直接写在配置文件中,需要在 GitHub 仓库后台手动配置:
-
打开你的 GitHub 项目仓库,点击顶部 Settings;
-
左侧菜单栏找到 Secrets and variables → Actions;
-
点击New repository secret,依次添加4个密钥:
| 密钥名称(Name) | 密钥值(Secret) |
|---|---|
| SSH_KEY | 本地SSH私钥(~/.ssh/id_rsa 完整内容) |
| SERVER_HOST | 服务器公网IP地址 |
| SERVER_USER | 服务器登录账号(如 root) |
| SERVER_PORT | 服务器SSH端口(默认22) |
⚠️ 注意:私钥无需密码,确保服务器已添加本地公钥到
~/.ssh/authorized_keys,保证免密登录。
步骤4:提交配置,触发自动部署
将新建的 .github/workflows/deploy.yml 文件提交并推送到 GitHub 远程仓库:
bash
git add .
git commit -m "feat: 新增github actions自动部署配置"
git push
推送完成后,仓库顶部点击 Actions 标签,即可看到正在执行的工作流任务,点击进入可查看实时日志。
当任务全部显示绿色 ✅ success,代表部署完成,打开项目域名即可看到最新代码效果。
四、常用场景适配修改
1. React 项目适配
React 项目打包命令、打包目录和 Vue 一致,无需修改配置,直接复用即可。
2. 后端 Node 项目适配
删除前端打包步骤,新增项目启动命令,示例修改:
yaml
# 替换打包步骤
- name: Build & Start Server
run: |
npm install
pm2 restart server || pm2 start app.js --name server
3. GitHub Pages 自动部署
GitHub Pages 是 GitHub 免费提供的静态页面托管服务,无需服务器、无需域名,适合 Vue、React、H5、文档站等静态项目托管。下面给出 零报错、可直接复用 的 GitHub Actions 自动部署 Pages 完整方案,解决「POST请求报错、页面空白、部署不更新」等常见问题。
第一步:仓库基础配置
-
进入仓库 Settings → Pages;
-
Build and deployment 选择:GitHub Actions(必须选择,否则自动部署不生效);
-
无需手动选择分支和目录,交由工作流自动配置覆盖。
第二步:新增 GitHub Pages 专属工作流文件
在 .github/workflows/ 目录新建文件 pages-deploy.yml,专门用于静态页面自动部署,和服务器部署配置互不冲突,完整代码如下
yaml
# GitHub Pages 静态项目自动部署 + 钉钉通知
name: Deploy GitHub Pages
# 触发条件:main分支推送、合并代码触发
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
# 权限配置:必须开启页面读写权限,否则部署失败
permissions:
contents: read
pages: write
id-token: write
# 并发限制:避免多次部署冲突
concurrency:
group: "pages"
cancel-in-progress: false
jobs:
# 构建静态资源
build:
runs-on: ubuntu-latest
steps:
- name: Checkout Code
uses: actions/checkout@v4
# 适配前端项目打包
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: 18
cache: 'npm'
- name: Install Dependencies
run: npm install
- name: Build Static Page
run: npm run build
# 上传打包产物为部署资源
- name: Upload Pages Artifact
uses: actions/upload-pages-artifact@v3
with:
path: ./dist # 根据你的项目打包目录修改
# 部署到 GitHub Pages
deploy:
# 依赖构建任务完成
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
# 钉钉部署成功通知(原生POST请求,解决 43002 需要POST请求报错)
- name: DingTalk Success Notify
if: success()
uses: crazy-max/dingtalk-action@v2
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
msgtype: markdown
content: |
### ✅ GitHub Pages 部署成功
- 部署分支:${{ github.ref_name }}
- 提交人:${{ github.actor }}
- 访问地址:[点击访问](${{ steps.deployment.outputs.page_url }})
- name: DingTalk Fail Notify
if: failure()
uses: crazy-max/dingtalk-action@v2
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
msgtype: markdown
content: |
### ❌ GitHub Pages 部署失败
- 部署分支:${{ github.ref_name }}
- 提交人:${{ github.actor }}
- 请及时查看 Actions 日志排查问题
第三步:关键配置说明
-
修复 43002 需要POST请求报错 :替换老旧钉钉Action,使用官方兼容POST请求的
crazy-max/dingtalk-action@v2,彻底解决钉钉机器人仅支持POST、旧插件GET请求报错问题; -
权限配置必加 :新增
permissions权限配置,是新版 GitHub Pages 部署强制要求,缺失会直接部署失败; -
目录适配 :Vue/React 默认打包目录为
dist,Nuxt/Vite 项目可根据实际输出目录修改path参数。
第四步:生效测试
提交并推送配置文件,触发工作流:git push,等待任务绿色成功后,即可通过日志中的页面地址访问项目,同时钉钉群正常接收部署通知。
GitHub Pages 专属避坑点
-
页面空白:检查打包资源路径,静态项目需配置
publicPath: ./相对路径,避免绝对路径资源加载失败; -
部署成功但页面无更新:开启并发限制、清理浏览器缓存,或手动重新执行工作流;
-
权限报错:必须完整配置文档中的
permissions权限字段,新版 GH Pages 已废弃旧权限规则。
无需服务器,直接使用官方 pages-deploy 插件,可实现静态项目免费托管部署。
五、常见报错与避坑指南
1. 部署失败:SSH 连接超时/拒绝连接
✅ 原因:服务器防火墙未开放SSH端口、密钥配置错误、服务器未添加公钥
✅ 解决:检查服务器安全组放行22端口、重新复制完整私钥、确认本地公钥已录入服务器。
2. 打包失败:依赖安装报错
✅ 原因:Node版本不匹配、项目依赖兼容问题
✅ 解决:修改配置中 node-version 为项目本地一致版本,锁定依赖版本。
3. 部署后页面无更新
✅ 原因:服务器旧文件缓存、打包目录配置错误
✅ 解决:配置中保留 ARGS: "-rltgoDzvO --delete" 清空旧文件,核对 SOURCE 打包目录。
4. 工作流不触发
✅ 原因:分支不匹配、配置文件目录错误
✅ 解决:确保推送分支为 main,目录严格为 .github/workflows。
六、进阶优化技巧
-
开启依赖缓存 :配置中
cache: 'npm'可缓存node_modules,大幅缩短构建时间; -
指定触发分支:仅配置主干分支触发部署,避免开发分支误部署;
-
添加部署通知:对接钉钉/企业微信机器人,部署成功/失败实时推送消息提醒
-
多环境部署:区分测试环境、生产环境,配置不同部署目录和触发分支。
1、钉钉机器人部署通知完整配置
通过配置钉钉机器人,可实现 GitHub Actions 部署 成功/失败/取消 状态实时推送,无需手动查看仓库日志,全程监控部署状态,适配所有部署场景。
第一步:创建钉钉自定义机器人
-
Open DingTalk and enter the group chat where you want to receive notifications;
-
Click Group Settings → Smart Group Assistant → Add Robot → select "Custom Robot";
-
Set the robot name (e.g., "Project Deployment Notification"), enable Custom Keywords , and enter the keyword:
GitHub(required, otherwise notifications will fail); -
After creation, copy the robot's Webhook URL , in the format:
https://oapi.dingtalk.com/robot/send?access_token=xxxxxx.#### 第二步:配置 GitHub 私密密钥
和服务器密钥配置方式一致,在仓库 Settings → Secrets and variables → Actions 中,新增1个密钥:
-
密钥名称:
DINGTALK_WEBHOOK -
密钥值:钉钉机器人完整的 Webhook 地址
第三步:完整改造工作流配置文件
基于前文的部署配置,新增钉钉通知步骤,支持部署成功、部署失败、任务取消 三种状态精准推送,以下是可直接复用的完整 deploy.yml 配置:
yaml
# 工作流名称,GitHub 后台展示的任务名称
name: Auto Deploy Project
# 触发条件:main分支推送代码、合并代码时触发
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
# 执行任务
jobs:
# 构建打包任务
build-and-deploy:
# 运行环境:最新Ubuntu系统
runs-on: ubuntu-latest
# 执行步骤
steps:
# 1. 拉取当前仓库代码
- name: Checkout Code
uses: actions/checkout@v4
# 2. 安装Node.js环境(适配前端项目)
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: 18 # 适配你的项目Node版本
cache: 'npm' # 缓存依赖,提升下次构建速度
# 3. 安装项目依赖
- name: Install Dependencies
run: npm install
# 4. 项目打包(根据你的项目修改打包命令)
- name: Build Project
run: npm run build
# 5. 部署到远程服务器(核心步骤)
- name: Deploy to Server
uses: easingthemes/ssh-deploy@v2
env:
# 服务器SSH密钥(后续配置GitHub密钥)
SSH_PRIVATE_KEY: ${{ secrets.SSH_KEY }}
# 服务器IP、端口、账号
REMOTE_HOST: ${{ secrets.SERVER_HOST }}
REMOTE_USER: ${{ secrets.SERVER_USER }}
REMOTE_PORT: ${{ secrets.SERVER_PORT }}
# 本地打包后的文件目录(前端默认dist)
SOURCE: dist/
# 服务器部署目录(替换为你的项目部署路径)
TARGET: /usr/local/nginx/html/project
# 部署前清空服务器旧文件(避免残留缓存)
ARGS: "-rltgoDzvO --delete"
# 6. 钉钉部署成功通知
- name: DingTalk Deploy Success
if: success()
uses: zkxiaoming/dingtalk-action@v1
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
title: '✅ 项目部署成功'
message: |
【GitHub Actions 自动部署通知】
项目分支:${{ github.ref_name }}
提交人:${{ github.actor }}
提交信息:${{ github.event.head_commit.message }}
部署状态:部署完成,服务正常上线
# 7. 钉钉部署失败通知
- name: DingTalk Deploy Failed
if: failure()
uses: zkxiaoming/dingtalk-action@v1
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
title: '❌ 项目部署失败'
message: |
【GitHub Actions 自动部署通知】
项目分支:${{ github.ref_name }}
提交人:${{ github.actor }}
提交信息:${{ github.event.head_commit.message }}
部署状态:部署异常,请及时排查日志修复
# 8. 钉钉任务取消通知
- name: DingTalk Deploy Cancelled
if: cancelled()
uses: zkxiaoming/dingtalk-action@v1
with:
webhook: ${{ secrets.DINGTALK_WEBHOOK }}
title: '⚠️ 项目部署取消'
message: |
【GitHub Actions 自动部署通知】
项目分支:${{ github.ref_name }}
提交人:${{ github.actor }}
部署状态:部署任务被手动取消
第四步:测试生效
修改代码并执行 git push 推送代码,部署流程结束后,钉钉群会自动接收对应状态的通知消息,无需人工值守查看部署日志。
常见问题避坑
-
收不到消息:检查钉钉机器人自定义关键词 是否包含
GitHub,核对 Webhook 地址是否完整无误; -
通知不精准:确认
if: success() / failure() / cancelled()条件不遗漏,三个状态步骤缺一不可; -
权限报错:无需额外权限,仅需正确配置 GitHub 仓库私密密钥即可正常使用。
七、总结
GitHub Actions 作为零成本、零运维的 CI/CD 工具,一次配置、永久省心,彻底告别手动部署的低效和失误。
核心流程总结:创建工作流配置文件 → 配置仓库私密密钥 → 提交代码触发自动构建部署,适配几乎所有前后端项目部署场景,是个人开发、小型团队的最优自动化部署方案。
配置完成后,后续所有代码更新,只需 git push 一行命令,即可自动完成全流程部署,极大提升开发迭代效率!