Github推送代码后利用Actions部署到服务器

配合之前的Github Actions入门实操Hyperf项目使用Supervisor部署两篇文章,填一下自动部署的坑。

因为是自己项目的部署推送,非公司项目所以一切以简单快速方便为主。

如果你的服务器上还没生成过SSH公钥则通过以下命令生成

ssh-keygen

一路回车即可,生成完毕后则在执行命令的当前用户下的目录查看.ssh目录里面的文件:

id_rsa是私钥文件谨慎传播,id_rsa.pub是公钥文件

接下来执行命令,复制一份公钥到这个文件:

cat id_rsa.pub >> authorized_keys

并且修改一下文件权限:

chmod -R 700 ~/.ssh
chmod -R 640 authorized_keys

接下来还是在.ssh目录下执行cat id_rsa获得私钥内容,结构大概如下:

-----BEGIN OPENSSH PRIVATE KEY-----
...内容
-----END OPENSSH PRIVATE KEY-----

复制完整的内容,将在配置上会使用上;接下来我们去Github的项目地址去配置密钥文件:

进入到该页面后,点击右边的New repository secret创建密钥,分别创建下面几个密钥

  • SERVER_HOST:为服务器地址
  • SERVER_KEY:就是刚才我们复制的私钥
  • SERVER_USERNAME:是创建私钥的用户名
  • SERVER_WORKDIR:是项目的路径

都创建完毕后,我们则开始写流水线作业了。

因为Hyperf原先就有一个Build的作业用于判断程序是否能正常运行,那么我们在这个文件接下来的位置继续写这个作业:

name: Build Docker

on:
  push:
    branches:
      - master #只在master推送时执行

jobs:
  build: # 原本Hyperf自带的作业
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v2
      - name: Build
        run: cp -rf .github/workflows/Dockerfile . && docker build -t hyperf .

  deploy:
    runs-on: ubuntu-latest
    needs: build # 要求上一个作业完成
    steps:
      - uses: actions/checkout@v2
      - name: pull code
        uses: appleboy/ssh-action@master
        env:
          SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }} #传递工作目录变量
        with:
          host: ${{ secrets.SERVER_HOST }} #服务器地址
          username: ${{ secrets.SERVER_USERNAME }} #用户名
          key: ${{ secrets.SERVER_KEY }} #私钥 安全问题一定都以变量的方式传递!!!
          envs: SERVER_WORKDIR #使用工作目录变量
          # 进入到项目目录,执行依赖更新
          script: |
            cd $SERVER_WORKDIR #进入到工作目录
            git checkout . #丢弃修改
            git pull #拉取代码
            composer update #更新依赖
            sudo supervisorctl restart emo #重启项目

文件修改好后推送上去,就可以看到流水线结果了:

那么之后修改完毕后就可以直接推送到master就会自动到服务器上更新代码,不用再手动部署了。

那么另外一个Nuxt的项目,只要修改后面的脚本就可以,Nuxt的项目完整工作流:

name: Deploy Project

on:
  push:
    branches:
      - master

jobs:
  deploy:
    runs-on: ubuntu-latest
    needs: build
    steps:
      - uses: actions/checkout@v2
      - name: pull code
        uses: appleboy/ssh-action@master
        env:
          SERVER_WORKDIR: ${{ secrets.SERVER_WORKDIR }}
        with:
          host: ${{ secrets.SERVER_HOST }} # 下面三个配置与上面一样
          username: ${{ secrets.SERVER_USERNAME }}
          key: ${{ secrets.SERVER_KEY }}
          envs: SERVER_WORKDIR
          # 进入到项目目录,执行依赖更新
          script: |
            cd $SERVER_WORKDIR
            git checkout .
            git pull
            npm update
            npm run build
            pm2 restart emo