You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vue/Vite项目Github CI/CD部署:如何复用SSH连接分步执行脚本?

如何在Github Actions中单次SSH连接下拆分部署步骤

核心结论

可以在单次SSH连接下拆分出多个带名称的独立操作,不需要每次执行脚本都重新建立SSH连接。下面提供两种适合新手的实现方式:

方法1:在ssh-action的script中添加步骤标识(最简单)

不需要修改整体结构,只需在原有脚本中加入echo输出步骤名称,这样在Github Actions的日志里就能清晰区分每个操作阶段,同时全程保持一次SSH连接。

修改后的Deploy任务配置:

deploy:
    name: "Deploy"
    needs: project_setup
    runs-on: ubuntu-latest
    steps:
      - name: Deploy to server (single SSH connection)
        uses: appleboy/ssh-action@master
        env:
          GIT_REPO: Comet-Frontend
          GIT_SSH: ${{ github.repositoryUrl }}
        with:
          host: ${{ secrets.VPS_IP }}
          username: ${{ secrets.VPS_USER }}
          password: ${{ secrets.VPS_PASSWORD }}
          port: ${{ secrets.VPS_PORT }}
          envs: GIT_SSH, GIT_REPO
        script: |
            echo "=== 步骤1:切换到项目目录 ==="
            cd /var/www/vue
            
            echo "=== 步骤2:拉取最新代码 ==="
            git pull
            
            echo "=== 步骤3:查看目录内容 ==="
            ls
            
            echo "=== 步骤4:安装依赖 ==="
            yarn
            
            echo "=== 步骤5:构建项目 ==="
            yarn build
            
            echo "=== 步骤6:复制构建产物 ==="
            cp -R /root/Frontend/dist /var/www/vue

这样在Actions日志里,每个echo的内容会作为步骤标识显示,你能清楚看到每个操作的执行情况,而且全程只建立一次SSH连接。

方法2:使用ssh-agent维持连接,拆分独立步骤(更规范)

如果希望每个操作都作为Github Actions的独立步骤显示(而不是在一个步骤的日志里),可以用webfactory/ssh-agent来管理SSH密钥,然后每个步骤通过ssh命令执行操作,这样所有步骤复用同一个SSH连接池,不需要重复验证。

修改后的Deploy任务配置:

deploy:
    name: "Deploy"
    needs: project_setup
    runs-on: ubuntu-latest
    steps:
      - name: 设置SSH代理
        uses: webfactory/ssh-agent@v0.5.4
        with:
          ssh-private-key: ${{ secrets.VPS_SSH_PRIVATE_KEY }} # 建议用密钥登录替代密码,更安全

      - name: 步骤1:切换到项目目录并拉取代码
        run: ssh -p ${{ secrets.VPS_PORT }} ${{ secrets.VPS_USER }}@${{ secrets.VPS_IP }} "cd /var/www/vue && git pull"

      - name: 步骤2:查看目录内容
        run: ssh -p ${{ secrets.VPS_PORT }} ${{ secrets.VPS_USER }}@${{ secrets.VPS_IP }} "cd /var/www/vue && ls"

      - name: 步骤3:安装依赖
        run: ssh -p ${{ secrets.VPS_PORT }} ${{ secrets.VPS_USER }}@${{ secrets.VPS_IP }} "cd /var/www/vue && yarn"

      - name: 步骤4:构建项目
        run: ssh -p ${{ secrets.VPS_PORT }} ${{ secrets.VPS_USER }}@${{ secrets.VPS_IP }} "cd /var/www/vue && yarn build"

      - name: 步骤5:复制构建产物
        run: ssh -p ${{ secrets.VPS_PORT }} ${{ secrets.VPS_USER }}@${{ secrets.VPS_IP }} "cp -R /root/Frontend/dist /var/www/vue"

注意:这种方式需要你将VPS的SSH私钥添加到Github Secrets中(VPS_SSH_PRIVATE_KEY),替代原有的密码登录,安全性更高。SSH代理会自动复用连接,避免每次步骤都重新建立连接。

额外建议

  • 优先选择方法1,对新手更友好,配置改动小,且能满足步骤拆分的需求。
  • 如果用方法2,建议使用SSH密钥登录而非密码,避免密码泄露风险。
  • 你的Build任务可以把构建产物上传到Github Artifacts,然后在Deploy任务中下载到Runner,再通过SCP传到VPS,这样不需要在VPS上执行构建,节省VPS资源,也更符合CI/CD的最佳实践。

内容的提问来源于stack exchange,提问作者HOHOOH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 20:45:54