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

如何配置GitHub,在推送到master或合并PR时自动执行部署脚本?

问题描述

我有一个用于将应用部署至生产服务器的bash脚本,路径为./bin/deploy.sh,该脚本通过SSH密钥连接服务器。我在package.json中配置了npm run deploy:prod命令来执行这个bash脚本。希望当有人推送到master分支或合并PR到master分支时,GitHub能自动运行该脚本,请问需要做哪些配置?


本地部署脚本 deploy.sh

#!/usr/bin/env bash

. $HOME/.bashrc
. .env
. .env.local

args=(-azvP --delete --exclude=node_modules --exclude=.idea --exclude=.git)
hosts=($HOST_DOMAIN) # tornado lightning thunder tundra jefferson
dry=() #add --dry-run to enable testing
user=$HOST_USER
name=$HOST_PATH
project=$HOST_PROJECT

for host in "${hosts[@]}"
do
  echo ""
  date
  echo "---------------------"
  echo "syncing ${host}"
  echo "---------------------"
  rsync ${dry[@]} ${args[@]} ./ ${user}@${host}:www/${name}/${project}
  ssh -t ${user}@${host} \$HOME/www/${name}/${project}/bin/post-deploy.sh
done

version=$(jq -r .version package.json)
say "$HOST_PROJECT is live!"
exit

服务器端后置部署脚本 post-deploy.sh

#!/usr/bin/env bash

cd "$(dirname "$0")/.."
. $HOME/.bashrc
. .env
. .env.local

host=$HOST_DOMAIN
name=$HOST_PATH
project=$HOST_PROJECT

echo "current name: $name"

cd $HOME/www/${name}/${project}
nvm install v18
node -v
npm -v
npm i

sudo /etc/init.d/nginx reload
sudo systemctl daemon-reload
sudo systemctl restart ${META_SERVICE}

配置步骤

1. 创建GitHub Actions工作流文件

在项目根目录下创建.github/workflows/deploy-prod.yml文件,内容如下:

name: 生产环境自动部署
on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
    types: [ closed ]
    if: github.event.pull_request.merged == true

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 设置Node.js环境
        uses: actions/setup-node@v4
        with:
          node-version: '18'

      - name: 添加服务器SSH密钥
        uses: webfactory/ssh-agent@v0.7.0
        with:
          ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}

      - name: 配置服务器主机信任
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SSH_KNOWN_HOSTS }}" >> ~/.ssh/known_hosts
          chmod 644 ~/.ssh/known_hosts

      - name: 加载环境变量
        run: |
          echo "HOST_DOMAIN=${{ secrets.HOST_DOMAIN }}" >> .env
          echo "HOST_USER=${{ secrets.HOST_USER }}" >> .env
          echo "HOST_PATH=${{ secrets.HOST_PATH }}" >> .env
          echo "HOST_PROJECT=${{ secrets.HOST_PROJECT }}" >> .env
          echo "META_SERVICE=${{ secrets.META_SERVICE }}" >> .env

      - name: 执行部署脚本
        run: npm run deploy:prod

2. 配置GitHub Secrets

在仓库的「Settings」→「Secrets and variables」→「Actions」页面,添加以下敏感信息:

  • SSH_PRIVATE_KEY:连接服务器的SSH私钥(无密码或提前配置密码解锁)
  • SSH_KNOWN_HOSTS:服务器的SSH公钥指纹,可通过ssh-keyscan <服务器域名/IP>获取
  • HOST_DOMAIN:服务器域名或IP
  • HOST_USER:服务器登录用户名
  • HOST_PATH:服务器部署路径的上级目录
  • HOST_PROJECT:服务器上的项目目录名
  • META_SERVICE:需要重启的系统服务名

3. 调整脚本适配Actions环境

  • 删除deploy.sh中的say "$HOST_PROJECT is live!"命令(GitHub Actions环境无此工具)
  • 确保脚本有可执行权限:本地执行chmod +x ./bin/deploy.sh和chmod +x ./bin/post-deploy.sh后提交仓库
  • 配置服务器sudo权限:让登录用户无需密码执行nginx reload、systemctl daemon-reload、systemctl restart 服务名,可通过修改/etc/sudoers实现

4. 验证工作流

推送代码到master分支或合并PR到master分支,在仓库「Actions」页面查看执行状态,排查错误日志。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 19:20:41