本教程将指导你如何使用 GitHub Actions 实现自动构建和部署项目到目标服务器。通过此配置,每当你将代码推送到 main 分支时,GitHub Actions 将自动执行构建过程,并将构建好的文件部署到指定的服务器。
前提条件
这里以nextjs项目为例,在开始之前,请确保你已经具备以下条件:
- GitHub 账户:你需要一个 GitHub 账户和一个代码仓库。
- 服务器:你需要有一个服务器,并确保能够通过 SSH 连接。
因为要自动部署,所以需要github远程连接我们的目标服务器,这样就需要我们提供ssh的连接公钥和私钥,所以需要在你的服务器上通过:ssh-keygen -t rsa -b 4096 -C "你的邮箱地址"
生成后的公钥和私钥被保存在了服务器的:/root/.ssh路径下,一般来说生成的文件名为:id_rsa、id_rsa.pub,
一、先将私钥id_rsa的内容完整复制,填写到github仓库的下图的页面处并保存:
接着将公钥
id_rsa.pub中的内容完整复制,添加到id_rsa.pub所在同级目录的authorized_keys文件中,记得复制时,如果authorized_keys文件中已有内容,要换行粘贴哦!
至此我们前置的事情就做完了,接着我们开始配置构建脚本!
二、创建 GitHub Actions 工作流
在你的 GitHub 仓库中,创建一个目录 .github/workflows/,然后在该目录下创建一个名为 deploy.yml 的文件,并将以下内容粘贴到文件中:
我们先看一个完整的自动构建、自动部署的脚本,后面再一一介绍:
name: Deploy i3d to Alibaba Cloud
on:
push:
branches:
- main
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Setup Node.js
uses: actions/setup-node@v3
with:
node-version: '20.13.1'
- name: Install dependencies
run: yarn
- name: Build project
run: yarn build
- name: Setup SSH agent
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Add SSH known hosts
run: |
ssh-keyscan -H x.xxx.xxx.xx >> ~/.ssh/known_hosts
- name: Packaged products
run: |
tar -czvf build.tar.gz ./package.json ./.next
- name: Upload tar
run: |
scp -r ./build.tar.gz root@x.xxx.xxx.xx:/www/wwwroot/www.i3d.resgoing.com/
- name: Del old files
run: |
ssh root@x.xxx.xxx.xx "
rm -rf /www/wwwroot/www.i3d.resgoing.com/.next;
rm -rf /www/wwwroot/www.i3d.resgoing.com/node_modules;
rm -rf /www/wwwroot/www.i3d.resgoing.com/package.json
"
- name: Unpackaged products
run: |
ssh root@x.xxx.xxx.xx "
tar -xzvf /www/wwwroot/www.i3d.resgoing.com/build.tar.gz -C /www/wwwroot/www.i3d.resgoing.com;
rm -f /www/wwwroot/www.i3d.resgoing.com/build.tar.gz
"
- name: Install dependencies
run: |
ssh root@x.xxx.xxx.xx "source ~/.nvm/nvm.sh && nvm use v20.17.0 && cd /www/wwwroot/www.i3d.resgoing.com && npm install --registry=https://registry.npmmirror.com"
- name: Clean Cache
run: |
ssh root@x.xxx.xxx.xx "
rm -rf /www/server/nginx/proxy_cache_dir/*;
fuser -k 18085/tcp
"
- name: Restart Project
run: |
ssh root@x.xxx.xxx.xx "source ~/.nvm/nvm.sh && nvm use v20.17.0 && cd /www/wwwroot/www.i3d.resgoing.com && nohup npm run start > /dev/null 2>&1 &"
1. name
在工作流文件的顶部,你可以看到 name 字段,它定义了整个工作流的名称。这是一个可选字段,但为工作流提供一个易于识别的名称可以帮助你在 GitHub 的 Actions 标签页中快速找到和理解你的工作流。
2. on
on 字段指定了触发工作流的事件。在这个例子中,工作流会在推送到 main 分支时被触发。你可以根据需求自定义触发条件,例如,使用 pull_request、release 等事件
on:
push:
branches:
- main
-
push:表示当有代码推送到指定的分支时触发。 -
branches:指定了要监听的分支,可以是一个分支名称或一个模式。
3. jobs
jobs 字段定义了工作流中的一组任务。每个任务都是一个独立的执行单元,可以并行或顺序执行。在本例中,我们只有一个名为 build 的任务。
jobs:
build:
runs-on: ubuntu-latest
-
build:这是任务的名称,可以根据你的需求自定义。 -
runs-on:指定运行环境,ubuntu-latest表示在最新的 Ubuntu 运行环境中执行任务。
任务步骤(steps)
在 jobs 内部,你可以定义一个或多个 steps,这些步骤是任务执行的具体内容,每一步都可以运行一个操作或执行一个脚本。
这里面需要解释的是:Setup SSH agent、Add SSH known hosts
- 设置 SSH 代理
- name: Setup SSH agent
uses: webfactory/ssh-agent@v0.5.3
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
-
name:这是步骤的名称,便于在日志中识别。 -
uses:这里使用的是webfactory/ssh-agentAction,它用于设置 SSH 代理。这一步是为了在后续的步骤中能够通过 SSH 连接到你的阿里云服务器。 -
with:在这里,你传递了一个参数ssh-private-key,其值为${{ secrets.SSH_PRIVATE_KEY }}。这表示你从 GitHub Secrets 中提取 SSH 私钥,以确保安全性。通过将私钥存储在 GitHub Secrets 中,只有工作流可以访问它,而不会暴露在代码中。SSH_PRIVATE_KEY这个就是你在第一步中给github/settings/ actions添加secret时填写的Name。
- 添加 SSH 已知主机
- name: Add SSH known hosts
run: |
ssh-keyscan -H x.xxx.xxx.xx >> ~/.ssh/known_hosts
-
name:此步骤的名称,用于说明其目的。 -
run:这里你执行的是一条 shell 命令,使用ssh-keyscan工具。ssh-keyscan -H x.xxx.xxx.xx:这个命令用于获取指定主机(在这个例子中是x.xxx.xxx.xx,需要替换为你的阿里云服务器的实际 IP 地址)的 SSH 公钥,并将其添加到known_hosts文件中。>> ~/.ssh/known_hosts:这个部分将获取到的公钥追加到当前用户的known_hosts文件中。known_hosts文件用于存储已知主机的公钥,以避免在连接时出现安全警告。
其他就是常规的代码构建、部署的节点了。大家可以自行理解,觉得有用的,点赞吧!