最近这段时间想要搞个自己的网站,然后再不懈的折腾下完成了初始化项目的部署,然后每次更新代码都要去服务器上拉代码、再打包感觉太麻烦了,有没有简单的自动化部署🤔🤔🤔 没错就是我们的主角 github action
它是什么
在 GitHub Actions 的仓库中自动化、自定义和执行软件开发工作流程。 您可以发现、创建和共享操作以执行您喜欢的任何作业(包括 CI/CD),并将操作合并到完全自定义的工作流程中。
几个关键词:自动化、自定义
我们完全可以用这个去部署前端的页面简直是意大利炮去打蚊子,但是无所谓主不在乎,能简单快捷的帮助我部署就行,搞起!!!
起步
我这边的大概诉求是:代码 push 到 master 分支,触发构建流程,将构建产物部署到我的服务器上
大致流程如下:
新建项目
我这里是创建了一个新的工程用作演示
这里以 vue 项目为例,创建一个新的项目
npm create vue@latest
cd <your-project-name>
npm install
npm run dev
服务器设置
前置条件:
- 安装 git
- 安装 node
- 安装 nginx
- 检查服务器防火墙设置以及安全组网络设置的端口打开
- 注意:ESC 服务器需要安装 rsync 我的是 linux 直接 yum install rsync即可,后续 ssh 上传代码会用到
我们现在服务器上把静态资源的位置以及基本的nginx 代理给设置好,我这里通过 ssh 登录到服务器的
随便创建一个文件夹把项目 clone 到本地
mkdir /var/www && cd /var/www && git clone <your github address>
cd <your github address>
npm install
npm run build
# 把构建产物 copy 到该目录下,或者你随便创建目录
cp -r dist/ /var/www/html
注:如果依赖安装缓慢,请设置 npm 镜像
# 设置
npm config set registry https://registry.npmmirror.com
# 检查
npm config get registry
设置 nginx 代理,简单配置下能访问静态页面即可,这里是监听服务器的9876的端口,访问到我们的前端构建产物,注意修改完之后执行 nginx -s reload
server {
listen 9876;
server_name localhost;
location / {
root /var/www/html/vue3-static;
index index.html;
}
}
这样就可以直接通过ip:port访问,我这里是:39.106.130.29:9876
创建 github action
在 github 点击 actions 创建该项目的 workflow,如下
name: 自动化部署
on:
# 哪些钩子触发,这里是 push
push:
branches:
# 具体的分支
- master
# 因为我这里是一个git 项目下有多个子项目,所以指定了对应的路径
paths:
- "vue3-static/**"
jobs:
build:
# 运行环境,这里是 ubuntu,参考 https://docs.github.com/zh/actions/using-workflows/workflow-syntax-for-github-actions#%E7%94%A8%E4%BA%8E%E5%85%AC%E5%85%B1%E5%AD%98%E5%82%A8%E5%BA%93%E7%9A%84-github-%E6%89%98%E7%AE%A1%E7%9A%84%E6%A0%87%E5%87%86%E8%BF%90%E8%A1%8C%E5%99%A8
runs-on: ubuntu-latest
steps:
- name: 变量和密钥配置的区别(secrets & vars)
run: echo "var ${{vars.TEST}} secrets ${{secrets.DEPLOY}}}}"
- name: Checkout
# 检出对应代码
uses: actions/checkout@v3
- name: Install Node.js
# 设置node环境
uses: actions/setup-node@v4
with:
node-version: 20.x
- name: 打包
run: |
npm install
npm run build
- name: 上传静态资源到服务器
uses: easingthemes/ssh-deploy@main
with:
# ssh公钥
SSH_PRIVATE_KEY: ${{ secrets.DEPLOY }}
# 复制操作的参数。"-avzr --delete"意味部署时清空服务器目标目录下的文件
ARGS: "-avz --delete"
# 打包出来的静态代码
SOURCE: "dist/"
# 部署ESC目标主机 xx.xx.xx.xx
REMOTE_HOST: ${{ secrets.HOST }}
# 登录ESC用户 root 或其他的 user
REMOTE_USER: ${{ secrets.USER }}
# 部署目标目录
TARGET: /var/www/html/dist
- name: 通知
run: |
curl --location 'https://sctapi.ftqq.com/${{secrets.FT_KEY}}.send' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'text=部署成功了~~~'
这个工作流中的大致流程:
- 监听了工程
push代码到master(注意 我这里指定了vue3-static工程代码的上传才触发工作流,参考:paths) - 检出对应的代码
uses: actions/checkout@v3 - 安装
nodeuses: actions/setup-node@v4 - 执行命令打包
- 使用
ssh上传静态代码到服务器uses: easingthemes/ssh-deploy@main
因为需要用到 ssh 上传代码,其中我们需要设置 ssh 密钥,当然我们直接写死也行,不过会不安全
# 执行这个一路回车
ssh-keygen -t rsa -b 4096
# 把公钥复制到ESC 服务器的 authorized_keys
cat ~/.ssh/id_rsa.pub
# 登录到服务器
ssh root@xx.xx.xx.xx
# 把公钥内容粘贴到authorized_keys
vi ~/.ssh/authorized_keys
上面的流程完成后我们可以重新 ssh root@xx.xx.xx.xx测试一下,如果不需要密码登录,说明 ssh 密钥配置成功。
随后我们去给我们的工程配置项目变量和密钥,如下:
注意⚠️:HOST和 USER的逻辑一样,当然也可以写死在 workflow 里,隐私的一些东西配置到secrets里,这样打印也打印不出来,如下:
最后我们可以对接【方糖】的push 功能来通知我们部署成功~
增加下面的流程即可,完整版参考上面的
- name: 通知
run: |
curl --location 'https://sctapi.ftqq.com/${{secrets.FT_KEY}}.send' --header 'Content-Type: application/x-www-form-urlencoded' --data-urlencode 'text=部署成功了~~~'
这样在我们部署成功就会收到微信公众号的推送通知啦,当然你也可以选择性对接飞书、钉钉等通知平台
测试
我们随便改个工程的文案,然后把代码 push 到 github
我们进到工程的 github 的 action 里就可以看到对应的工作流执行了
再次访问我们的页面就可以看到对应的代码更新啦🎉🎉🎉🎉🎉🎉🎉🎉
总结
- 这样通过
git actions可以非常简单的完成我们代码的部署 - 注意私密的东西配置到
Secrets里面,避免信息泄露 - 初步了解认识到 githubactions 能做的事情不仅仅是这些,大胆发挥想象力和创造力
套个盾:非专业人员,文中有错误的地方欢迎指出交流,谢谢~~
看到这里了如果觉得有帮助,麻烦点个赞~~