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

384 阅读3分钟

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

image-20250314144041545

之前一直在使用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_keyssudo chmod 644 ~/.ssh/github_actions.pub

4. 目标目录权限

# 假设部署目录为 /var/www/blogsudo mkdir -p /var/www/blogsudo 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/.sshchmod 600 ~git/.ssh/authorized_keyschown -R git:git ~git/.ssh# 最后的路径调整成静态文件路径sudo chown -R git:git /www/wwwrootsudo setfacl -R -m u:git:rwx /www/wwwrootsudo setfacl -Rd -m u:git:rwx /www/wwwroot

Github仓库配置

1. 添加仓库密钥

    1. 访问仓库 Settings > Secrets > Actions
    1. 点击 New repository secret
    1. 输入名称 SERVER_SSH_KEY,值粘贴前文获取的[私钥内容](#5.获取private 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. 2. 登录GitHub仓库,进入 Actions 标签页查看执行状态 3. 3. 成功完成后,访问服务器目标目录确认文件更新