【问题标题】:I have a bash script for deploying my app to my production server, how can I use GitHub to automate when someone pushes to master?我有一个用于将我的应用程序部署到我的生产服务器的 bash 脚本,当有人推送到 master 时,我如何使用 GitHub 来自动化?
【发布时间】:2023-01-30 00:06:18
【问题描述】:

该脚本位于./bin/deploy.sh 并使用 SSH 密钥连接到服务器。

我在 package.json 中有一个名为 npm run deploy:prod 的脚本,它运行这个 bash 脚本。

当有人推送或合并 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}

【问题讨论】:

标签: github


【解决方案1】:

哪个满足我的要求?

一个可以通过 SSH 连接到您的服务器并执行命令(比如您的npm run deploy:prod)。

分开两个步骤(rsync,然后是远程脚本)

对于 rsync:actions/rsync-deployments-action

name: rsync
on: 
  push:
    branches:
    - master
  pull_request:
    branches:
    - master
jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: rsync deployments
      uses: burnett01/rsync-deployments@5.2.1
      with:
        switches: -avzr --delete --exclude="" --include="" --filter=""
        path: src/
        remote_path: /var/www/html/
        remote_host: example.com
        remote_port: 5555
        remote_user: debian
        remote_key: ${{ secrets.DEPLOY_KEY }}

例如:appleboy/ssh-action

你可以adapt the trigger for pushes or pull-request to master

name: remote ssh command
on: 
  push:
    branches:
    - master
  pull_request:
    branches:
    - master
jobs:

  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
    - name: executing remote ssh commands using password
      uses: appleboy/ssh-action@v0.1.7
      with:
        host: ${{ secrets.HOST }}
        username: ${{ secrets.USERNAME }}
        password: ${{ secrets.PASSWORD }}
        port: ${{ secrets.PORT }}
        script: whoami

【讨论】:

  • 也许我应该发布我的 bash 脚本。我已经更新了问题,因为它使用 rsync 传输文件,然后在部署文件后使用 ssh 在服务器上执行远程命令。
  • @chovy 当然:使用actions/rsync-deployments-action,然后是SSH 操作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-20
  • 2021-12-18
  • 1970-01-01
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多