Skip to main content

Github Actions

以前用的 Jenkins,但感觉它的界面体验不是很好,然后安装、升级、插件安装、关联 github 都很不方便,所以索性就换成了 Github Actions。事实证明,简单的应用部署确实没必要动用 Jenkins

生成 ssh 秘钥

如果没有生成过,需要先创建,确保 ssh 正常连接

ls ~/.ssh # 没有的话说明没有创建过,需要执行以下命令生成秘钥
mkdir -p ~/.ssh && cd ~/.ssh
ssh-keygen -t rsa -f demo # demo是秘钥文件名称,可以自定义
# 默认回车就行,之后会生成公钥:demo.pub;私钥:demo 这俩文件
cat mysite.pub >> authorized_keys
cat demo
# 复制私钥

到仓库 Settings > Secrets and variables > Actions

  1. 点击 New repository secret
  2. 新增 DEPLOY_KEY,也就是你复制的私钥
  3. 新增 SSH_HOST,你的服务器 ip
  4. 新增 SSH_USERNAME,你的服务器用户名,whoami 可以查看

新增 workflow 文件夹

在项目根目录新增 .github 目录

cd .github
mkdir workflows & cd workflows
touch deploy.yaml

deploy.yaml

下面是我部署本站的 deploy.yaml 文件,适用于单应用页面,仅供参考:

name: Deploy My Docs

on:
push:
branches:
- main
paths-ignore: # 以下文件变更不触发脚本执行
- README.md
- LICENSE

jobs:
deploy:
runs-on: ubuntu-latest # 使用ubuntu系统镜像
steps:
- uses: actions/checkout@v2 # 下载代码仓库
- name: Setup node # 安装 Node.Js
uses: actions/setup-node@v1
with:
node-version: "16.16.0"
- name: Build # 执行打包逻辑
run: |
npm install
npm run build
env:
CI: true
- name: Deploy to Server # 推送打包产物
uses: AEnterprise/rsync-deploy@v1.0.2
env:
DEPLOY_KEY: ${{ secrets.DEPLOY_KEY }} # SSH私钥,在仓库Setting里配置
ARGS: "-e -c -r --delete"
SERVER_PORT: "22" # SSH端口
FOLDER: build # 要推送的文件夹,路径相对于代码仓库的根目录
SERVER_IP: ${{ secrets.SSH_HOST }} # 服务器的ip
USERNAME: ${{ secrets.SSH_USERNAME }} # 服务器登录名,可以在终端输入 whoami 查看
SERVER_DESTINATION: /home/docs # 部署到目标文件夹
- name: Deploy Post # 后置处理,比如我会将/home/build文件名改成docs(对应nginx指定的应用目录)
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SSH_HOST }}
username: ${{ secrets.SSH_USERNAME }}
key: ${{ secrets.DEPLOY_KEY }}
script: |
cd /home
cp -r docs/build docs-temp
rm -rf docs
mv docs-temp docs

注意看我配置里的注释,有些自定义的选项注意替换成自己的。之后可以在本地尝试 git push,然后到仓库的 Actions 页查看流水线

完整的配置参考 工作流程语法

nginx 配置

注意 nginx 设置的应用目录要关联 deploy.yaml里的配置

安装

yum install nginx
systemctl start nginx
systemctl enable nginx
# 常用命令
# systemctl restart nginx
# systemctl status nginx
# systemctl stop nginx

修改配置

先找个目录用于部署个人应用,然后修改下 nginx 配置

# /etc/nginx/nginx.conf
#...
# 新增
server {
listen 80;
# 注意:如果是用二级域名,需要先在域名控制台解析对应的二级域名
server_name docs.zhouweibin.top;
location / {
root /home/docs;
index index.html;
}
}
# https
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name docs.zhouweibin.top;
root /usr/share/nginx/html;
# 注意:密钥需要预先生成并上传,这里不能为空
# 可以在服务器对应云服务商里免费申请和下载,之后上传到指定目录即可
ssl_certificate "/etc/ssl/xxx.pem";
ssl_certificate_key "/etc/ssl/xxx.key";
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 10m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

# Load configuration files for the default server block.
include /etc/nginx/default.d/*.conf;

location / {
root /home/docs;
index index.html;
# try_files $uri $uri/ /index.html;
}
}
#...

二级域名和 ssl 证书配置可以参考 https://docs.zhouweibin.top/docs/awesome-dev/%E6%9C%8D%E5%8A%A1%E5%99%A8/

如果没有 ssl 证书,可以先注释掉 https 的配置。接下来先在本地打包,将 build 里的所有文件上传到 nginx 指定目录下,然后重启 nginx 访问尝试下

systemctl restart nginx

到这里应该就大功告成了。有问题欢迎评论 ~