配合之前的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