配合之前的Github Actions入门实操和Hyperf项目使用Supervisor部署两篇文章,填一下自动部署的坑。
因为是自己项目的部署推送,非公司项目所以一切以简单快速方便为主。
如果你的服务器上还没生成过SSH公钥则通过以下命令生成
ssh-keygen
一路回车即可,生成完毕后则在执行命令的当前用户下的目录查看
.ssh
目录里面的文件:![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fbd2ac642-f8df-4f64-a448-f9f4ae376407%2F1649905873-image.png?table=block&id=a4036701-921f-4686-85d5-5c15036079c6&cache=v2)
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的项目地址去配置密钥文件:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F5ede04ea-0fdf-4e7a-93e2-ffa94efae68f%2F1649906285-image-1024x646.png?table=block&id=06aac4ec-1ae6-4198-88fa-b4b390942edf&cache=v2)
进入到该页面后,点击右边的New repository secret创建密钥,分别创建下面几个密钥
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2Fc2b17355-5d56-4db0-88a5-59948c9168ba%2F1649906351-image.png?table=block&id=16465a50-9a0c-4c3c-8603-d68a2aa0bc51&cache=v2)
- 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 #重启项目
文件修改好后推送上去,就可以看到流水线结果了:
![notion image](https://www.notion.so/image/https%3A%2F%2Fs3-us-west-2.amazonaws.com%2Fsecure.notion-static.com%2F25f6f268-bbe8-43d5-adc8-9dfc5c7468cf%2F1649906697-image-1024x484.png?table=block&id=02008849-39a5-41f6-a327-5b574f05d29d&cache=v2)
那么之后修改完毕后就可以直接推送到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