
GitHub Actions 自动化部署Next.js
2024年8月6日
JavaScriptDevOps
GitHub Actions 的命令可以分为以下几个部分:
- 触发条件:定义何时运行工作流。
- 作业定义:设置工作流中的主要任务。
- 步骤定义:详细说明每个作业中需要执行的具体操作。
- 打包和上传命令:(非必须)。
- 部署到服务器:将构建完成的代码部署到服务器。
详细介绍
- 工作流触发条件,常见的包括
YAML1# 定义触发工作流的事件 2on: 3 # 当推送带有 "v" 前缀的标签时触发 4 push: 5 tags: 6 - "v*" # 例如: v1.0, v20.15.10 7 # 允许手动触发工作流 8 workflow_dispatch: 9 # 当对 master 分支发起 pull request 时触发 10 pull_request: 11 branches: 12 - master 13 # 在每天UTC时间凌晨2点运行 14 schedule: 15 - cron: '0 2 * * *' 16 # 当 issue 被创建时触发 17 push: 18 branches: 19 - master 20# 可以根据需要组合或单独使用这些触发器
这部分定义了工作流的触发条件。它会在推送带有 "v" 前缀的标签、手动触发工作流或向 master 分支发起 pull request ,以及定时执行的触发,可以根据需要组合或单独使用这些触发器。
- 作业定义
YAML1# 定义工作流中的作业 2jobs: 3 # 构建作业 4 build: 5 runs-on: ubuntu-latest # 在最新版本的Ubuntu运行器上执行 6 # 这里可以添加构建步骤,如编译代码、运行测试等 7 # 部署作业 8 deploy: 9 needs: build # 指定该作业依赖于build作业,确保build完成后才运行 10 runs-on: ubuntu-latest # 同样在Ubuntu最新版本上运行 11 if: startsWith(github.ref, 'refs/tags/v') # 只在推送版本标签时执行部署 12 # 这里可以添加部署步骤,如上传构建产物、更新服务器等
这个配置展示了一个基本的CI/CD流程:执行构建作业、如果构建成功,并且触发事件是推送了版本标签,则执行部署作业。
- 步骤定义包括打包等等
YAML1steps: 2 # 步骤1: 检出代码 3 - name: Checkout code 4 uses: actions/checkout@v2 # 使用官方的checkout action来获取仓库代码 5 # 步骤2: 设置Node.js环境 6 - name: Set up Node.js 7 uses: actions/setup-node@v2 # 使用官方的setup-node action 8 with: 9 node-version: "20" # 指定Node.js版本为20 10 # 步骤3: 安装pnpm 11 - name: Install pnpm 12 run: npm install -g pnpm # 全局安装pnpm包管理器 13 # 步骤4: 安装项目依赖 14 - name: Install dependencies 15 run: pnpm install # 使用pnpm安装项目依赖 16 ...
这些是作业中的具体步骤。每个步骤都有一个名称和一个动作(action)或命令。这里包含了代码检出、运行时环境、包管理器和依赖安装,可以根据自己的需要添加
- 打包和上传命令
YAML1# 步骤1: 归档生产构建产物 2- name: Archive production artifacts 3 run: tar -czf nextjs-artifacts.tar.gz .next package.json pnpm-lock.yaml 4 # 使用tar命令创建一个压缩文件,包含所有必要的项目文件 5# 步骤2: 上传构建产物 6- name: Upload artifact 7 uses: actions/upload-artifact@v2 8 with: 9 name: nextjs-artifacts 10 path: nextjs-artifacts.tar.gz 11 # 使用GitHub Actions的upload-artifact动作上传压缩文件
这个步骤使用 tar 命令将所有必要的项目文件打包在一起,便于后续部署或进一步处理
- 部署到服务器,通过 SCP 安全地将构建产物传输到指定的服务器,再根据需要执行后续的步骤进行操作
YAML1deploy: 2 needs: build # 表示这个作业依赖于 'build' 作业 3 runs-on: ubuntu-latest # 在最新的 Ubuntu 运行器上执行 4 if: startsWith(github.ref, 'refs/tags/v') # 只在推送以 'v' 开头的标签时触发 5 steps: 6 # 步骤1: 下载构建产物 7 - name: Download artifact 8 uses: actions/download-artifact@v2 9 with: 10 name: nextjs-artifacts 11 # 步骤2: 通过 SCP 复制文件到服务器 12 - name: Copy files via SCP 13 env: 14 # 环境变量 15 ECS_PRIVATE_KEY: ${{ secrets.ECS_PRIVATE_KEY }} 16 ECS_USERNAME: ${{ secrets.ECS_USERNAME }} 17 ECS_HOST: ${{ secrets.ECS_HOST }} 18 run: | 19 mkdir -p ~/.ssh/ 20 echo "${ECS_PRIVATE_KEY}" > ~/.ssh/id_rsa 21 chmod 600 ~/.ssh/id_rsa 22 ssh-keyscan $ECS_HOST >> ~/.ssh/known_hosts 23 scp -o StrictHostKeyChecking=no nextjs-artifacts.tar.gz $ECS_USERNAME@$ECS_HOST:~/nextjs-artifacts.tar.gz 24 ...
环境变量的值都来自 GitHub 仓库的 Secrets。${{ secrets.XXX }} ,引用在 GitHub 仓库设置中定义的Secrets。配置步骤为:
- 点击仓库顶部的 "Settings" 标签进行配置
- 在左侧菜单中,找到并点击 "Secrets and variables",然后选择 "Actions"。
- 在 "Actions secrets" 部分,你会看到 "New repository secret" 按钮,点击就可以添加Secrets了
3
Likes


