小白服务器踩坑(2)- 自动化部署

上一篇讲了服务器购买到上线的流程,也讲了网站部署和域名相关内容。如果每次更新项目后,都要手动部署项目,显得很麻烦,这篇我们就来尝试 github Actions 实现自动化部署

这是 deepseek 对 github Actions 做的简单介绍

GitHub Actions 通过仓库内 .github/workflows/ 目录下的 YAML 文件定义工作流。当指定事件(如 push、PR)触发时,平台自动创建虚拟机运行器,按步骤执行代码检出、依赖安装、构建测试等任务,最终通过 SSH、API 或 CLI 将构建产物部署至服务器或云平台

下面就按照这个介绍,一步步实现自动化部署

仓库配置

项目根目录下新建文件.github/workflows/deploy.yml

bash 复制代码
# 任务名
name: Deploy to Server
​
# 触发条件
on:
  push:
    branches: [ master ]
​
jobs:
  deploy:
  
  # 运行容器
    runs-on: ubuntu-latest
    steps:
​
    # 检出代码
      - name: Checkout code
        uses: actions/checkout@v4
​
    # 连接 ssh 部署
      - name: Deploy via SSH
        uses: appleboy/ssh-action@v1.0.3
        with:
          host: ${{ secrets.SERVER_HOST }}
          username: ${{ secrets.SERVER_USER }}
          key: ${{ secrets.SSH_PRIVATE_KEY }}
          script: |
            set -e  # 遇到错误立即退出
            
            # 1. 添加GitHub.com的主机密钥(为了git pull)
            mkdir -p ~/.ssh
            ssh-keyscan github.com >> ~/.ssh/known_hosts 2>/dev/null || true
            
            # 2. 定义部署目录
            DEPLOY_DIR="/var/www/utils-web"
            BACKUP_DIR="/var/www/utils-web-backup"
            TIMESTAMP=$(date +%Y%m%d_%H%M%S)
            
            # 3. 检查部署目录是否存在
            if [ ! -d "$DEPLOY_DIR" ]; then
              echo "错误: 部署目录 $DEPLOY_DIR 不存在"
              exit 1
            fi
            
            # 4. 切换到目标目录
            cd "$DEPLOY_DIR"
            
            # 5. 备份当前版本(如果存在)
            if [ -d "$DEPLOY_DIR" ] && [ "$(ls -A $DEPLOY_DIR)" ]; then
              echo "正在备份当前版本..."
              sudo mkdir -p "$BACKUP_DIR"
              sudo cp -r "$DEPLOY_DIR" "$BACKUP_DIR/utils-web_$TIMESTAMP" || true
              echo "备份完成: $BACKUP_DIR/utils-web_$TIMESTAMP"
            fi
            
            # 6. 拉取最新代码(使用SSH方式,公开仓库无需token)
            echo "正在拉取最新代码..."
            git fetch origin master
            git reset --hard origin/master
            git clean -fd
            
            # 7. 验证nginx配置
            echo "正在验证nginx配置..."
            if sudo nginx -t; then
              echo "nginx配置验证通过"
            else
              echo "错误: nginx配置验证失败,正在回滚..."
              # 回滚到备份版本
              if [ -d "$BACKUP_DIR/utils-web_$TIMESTAMP" ]; then
                sudo cp -r "$BACKUP_DIR/utils-web_$TIMESTAMP"/* "$DEPLOY_DIR"/
                echo "已回滚到备份版本"
              fi
              exit 1
            fi
            
            # 8. 重启nginx服务
            echo "正在重启nginx..."
            sudo systemctl restart nginx
            
            # 9. 验证nginx服务状态
            sleep 2
            if sudo systemctl is-active --quiet nginx; then
              echo "✅ 部署成功!nginx服务运行正常"
            else
              echo "⚠️  警告: nginx服务可能未正常启动,请检查日志"
              sudo systemctl status nginx || true
            fi

接下来配置 github Actions

github Actions

找到项目 github 仓库,在仓库主界面选择Settings/Secrets and variables/Actions,分别添加脚本需要的密钥

  • SERVER_HOST:服务器地址
  • SERVER_USER:用户名,默认 root
  • SSH_PRIVATE_KEY:ssh 登录密钥,服务器生成

配置服务器密钥

生成密钥对

css 复制代码
ssh-keygen -t rsa -b 4096

公钥添加到~/.ssh/authorized_keys

javascript 复制代码
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

将服务器私钥(id_rsa内容)添加到SSH_PRIVATE_KEY, 上一节我们配置了密码登录服务器,现在需要 ssh 登录,也需要在服务器设置

服务器设置

登录腾讯云后台,创建密钥,复制上面我们创建的公钥信息

进入服务器详情,绑定密钥,选择已经添加的密钥

验证登录密钥配置

css 复制代码
 ssh -i .ssh/id_rsa root@localhost

返回以下信息,表示登陆成功

在自动化脚本第 6 步,使用 ssh 方式拉取远端仓库,因此还需要在 github 配置

确保 ssh 开启密钥登录

cat /etc/ssh/sshd_config

重启 ssh 服务

systemctl restart sshd

服务端生成 github ssh

bash 复制代码
# 生成专用密钥(不要覆盖现有的id_rsa)
ssh-keygen -t ed25519 -f ~/.ssh/github_key -N ""
​
# 查看公钥
cat ~/.ssh/github_key.pub

访问链接,添加 New SSH key

配置 ssh 客户端

bash 复制代码
# 创建或编辑SSH配置文件
nano ~/.ssh/config

添加内容

bash 复制代码
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_key
    IdentitiesOnly yes
    # 可选:禁用严格检查(调试用)
    # StrictHostKeyChecking no

配置完成测试连接

perl 复制代码
# 测试SSH连接到GitHub
ssh -T git@github.com
​
# 应该看到:
# Hi 你的用户名! You've successfully authenticated, but GitHub does not provide shell access.
​
# 测试拉去
git pull origin master --dry-run

这样就完成了自动化的基本配置,在我们本地修改项目 push 后,就会触发 github Actions 中的工作流,在项目主页面 Actions 标签下,可以看到正在运行的工作流,点击工作流查看每一步的运行状态

相关推荐
回家路上绕了弯1 小时前
Vavr 工具实用指南:Java 函数式编程的高效落地方案
分布式·后端
开心就好20251 小时前
没有 Mac 怎么上架 iOS 应用 跨平台团队的可行交付方案分析
后端
aiopencode2 小时前
构建可靠的 iOS 日志导出体系,从真机日志到系统行为的多工具协同实践
后端
期待のcode2 小时前
MyBatis-Plus通用Service
java·后端·mybatis·springboot
程序员-周李斌2 小时前
ArrayBlockingQueue 源码解析
java·开发语言·后端·哈希算法·散列表
该用户已不存在2 小时前
6款Vibe Coding工具,让开发从从容容游刃有余
后端·aigc·ai编程
qwepoilkjasd2 小时前
std::string详解
后端
bcbnb2 小时前
iOS 应用上架流程的工程化拆解 从签名体系到提交审核的全过程管控
后端
数新网络2 小时前
Compaction in Apache Iceberg
后端