小白服务器踩坑(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 标签下,可以看到正在运行的工作流,点击工作流查看每一步的运行状态

相关推荐
Victor3569 小时前
https://editor.csdn.net/md/?articleId=139321571&spm=1011.2415.3001.9698
后端
Victor35610 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
后端
灰子学技术11 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
Gogo81612 小时前
BigInt 与 Number 的爱恨情仇,为何大佬都劝你“能用 Number 就别用 BigInt”?
后端
fuquxiaoguang12 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐13 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
野犬寒鸦14 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
逍遥德15 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
MX_935916 小时前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
程序员泠零澪回家种桔子16 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构