使用GitHub Actions实现Git推送自动部署到服务器

复制代码
将网站一键部署到服务器的方案很多,比如纯Shell脚本结合SSH、Jenkins等工具。本文将介绍如何利用GitHub Actions这一免费且轻量的CI/CD工具,实现代码推送后自动部署到云服务器。

之前一直在使用github的工作流,确实是一个比较好用的工具。

我之前用来构建公开静态文件仓库,让vercel来管理静态网站,这次我把所有的服务都迁移到了云服务器,所以所有的部署都需要重新调整一下。

还是老样子,先介绍一下我的场景和配置。

前置条件

  • 项目类型: 静态网站(示例使用Hexo)

  • 服务器环境: Linux系统(示例为Ubuntu)

服务器配置

1. 创建专用部署用户
复制代码
# 创建新用户
sudo adduser git --disabled-password
​
# 切换到该用户
sudo su - git
​
# 创建.ssh目录
mkdir -p ~/.ssh && chmod 700 ~/.ssh
2. 生成 SSH 密钥对
复制代码
# 在服务器生成密钥(也可本地生成后传公钥)
sudo ssh-keygen -t ed25519 -C "github-actions-deploy-key" -f ~/.ssh/github_actions
3. 配置授权公钥
复制代码
# 将公钥加入授权列表
sudo sh -c 'cat /home/git/.ssh/github_actions.pub >> /home/git/.ssh/authorized_keys'
​
# 设置权限
sudo chmod 600 ~/.ssh/authorized_keys
sudo chmod 644 ~/.ssh/github_actions.pub
4. 目标目录权限
复制代码
# 假设部署目录为 /var/www/blog
sudo mkdir -p /var/www/blog
sudo chown -R deployer:deployer /var/www/blog
5.获取private key
复制代码
sudo cat ~/.ssh/github_actions

正常情况会返回这样的文本:

复制代码
-----BEGIN OPENSSH PRIVATE KEY-----
-----END OPENSSH PRIVATE KEY-----
6.调整ssh配置
复制代码
/etc/ssh/sshd_config
复制代码
# 启用密钥认证
PubkeyAuthentication yes      
# 禁用密码登录
PasswordAuthentication no      
# 允许部署用户
AllowUsers deployer            
复制代码
sudo systemctl restart ssh
如果遇到权限问题
复制代码
# 切换到root再执行
chmod 700 ~git/.ssh
chmod 600 ~git/.ssh/authorized_keys
chown -R git:git ~git/.ssh
​
# 最后的路径调整成静态文件路径
sudo chown -R git:git /www/wwwroot
​
sudo setfacl -R -m u:git:rwx /www/wwwroot
sudo setfacl -Rd -m u:git:rwx /www/wwwroot

Github仓库配置

1. 添加仓库密钥

  1. 访问仓库 Settings > Secrets > Actions

  2. 点击 New repository secret

  3. 输入名称 SERVER_SSH_KEY,值粘贴前文获取的私钥内容

2. 配置工作流文件

创建 .github/workflows/deploy.yml 内容如下:

复制代码
name: Deploy Blog  # 工作流名称,显示在Actions面板

on: [push]  # 触发条件:任何git push操作

jobs:
  build:   # 任务ID,可自定义
    runs-on: ubuntu-latest  # 使用GitHub托管的Ubuntu运行器

    steps:
      - name: Checkout code  # 步骤1:拉取仓库代码
        uses: actions/checkout@v4  # 官方检出插件

      - name: Install and Build  # 步骤2:安装依赖并构建
        run: |                   # 多行命令执行器
          npm install
          npm run build

      - name: Deploy to Server  # 步骤3:部署到服务器
        uses: easingthemes/ssh-deploy@main  # 第三方SSH部署插件
        env:
          SSH_PRIVATE_KEY: ${{ secrets.SERVER_SSH_KEY }}  # 从仓库密钥读取私钥
          REMOTE_HOST: ""  # 服务器公网IP或域名
          REMOTE_USER: "git"  # 步骤1创建的用户
          SOURCE: "public/"  # 本地构建输出目录
          TARGET: "/www/wwwroot/guoshunfa.com"  # 服务器目标目录
          ARGS: "-avz --chown=git:git"  # rsync参数:归档模式/压缩/删除多余文件

到这所有的配置就结束了。

验证效果

  1. 本地修改后执行Git推送:

    复制代码
    git add .
    git commit -m "触发自动部署"
    git push origin main
  2. 登录GitHub仓库,进入 Actions 标签页查看执行状态

  3. 成功完成后,访问服务器目标目录确认文件更新

相关推荐
微尘寒风1 小时前
【Git】的安装和使用
java·git
怕浪猫2 小时前
FDE 最大的浪费不是写出有 bug 的代码,而是漂亮地解决了一个错误的问题
面试·架构·github
Julien20043 小时前
调查和解决 SELinux 问题
linux·运维·服务器·网络·学习方法
黄敬峰5 小时前
Next.js 全栈实战:数据清洗、ORM 设计与 AI Prompt 工程最佳实践
面试·github
2601_962074685 小时前
自己编译RustDesk,并将自建ID服务器和key信息写入客户端
运维·服务器
大模型丫丫6 小时前
Hermes Agent:轻量级智能体框架实战指南
大数据·运维·服务器
mooooooooooye7 小时前
2026 年跨平台 SSH 客户端怎么选?Xterminal、Termius、MobaXterm 谁更合适
服务器·网络·ssh
Blockchina7 小时前
Codex 实战:从一句需求到可验收的 Linux 主机巡检脚本
运维·服务器·网络
Best-Wishes8 小时前
BurpSuite Pro教育版在linux系统中配置
linux·运维·服务器·网络安全·burpsuite
峰向AI9 小时前
AI reads books:用 AI 逐页「啃」PDF 的知识提取器,一个脚本搞定一切
github