如何配置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:服务器域名或IPHOST_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
相关产品推荐
相关产品推荐

