巧用GitHub的CICD功能免费打包部署前端项目
近年来,随着前端技术的发展,前端项目的构建和打包过程变得越来越复杂,占用的资源也越来越多。我有一台云服务器,原本打算使用Docker进行部署,以简化操作流程。然而,只要执行
sudo docker-compose -f deploy/docker-compose/docker-compose.yaml up命令,服务器就直接卡死,CPU占用率飙升至100%,导致我无法正常使用。
经过一番思考和尝试,我决定借助GitHub的CICD功能来解决这个问题。通过利用免费的GitHub的服务器资源,我可以只将打包好的文件部署到我的后台服务器上,简直不要太方便啦!下面详细介绍具体步骤。
背景
在使用Docker进行前端项目和后端服务的部署时,我遇到的问题主要出在资源占用上。由于我的云服务器配置较低,同时执行多个Docker容器的构建和启动指令,导致服务器资源被瞬间耗尽。因此,我决定寻找一种更高效的方式来完成前端项目的构建和打包,而无需占用本地服务器的大量资源。GitHub的CICD功能恰好可以满足这一需求,它提供了一个强大的云端构建环境,可以轻松地完成项目的构建和打包工作。

准备工作
- GitHub账户:确保你有一个GitHub账户,并且已经创建了一个仓库来存放你的前端项目代码。
- 部署服务器:准备好你的部署服务器,确保服务器可以访问GitHub,并且已经做好了相应的部署准备工作。
- SSH密钥:为GitHub配置SSH密钥,以便能够通过SSH连接到你的部署服务器。
步骤
1. 编写Dockerfile
首先,确保你的前端项目有一个Dockerfile,用于构建前端项目的镜像。以下是一个简单的Dockerfile示例:
# 使用官方Node镜像作为构建环境
FROM node:20-slim AS build-stage
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build# 使用官方Nginx镜像作为运行环境
FROM nginx:alpine AS production-stage
COPY --from=build-stage /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
2. 创建GitHub Actions Workflow
在GitHub仓库中创建一个.github/workflows文件夹,然后在文件夹中创建一个YAML文件,例如ci-cd.yml。这个文件将定义GitHub Actions的工作流程。
name: CI/CD for Frontend Projecton:push:branches:- mainjobs:build:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v4- name: Set up Node.jsuses: actions/setup-node@v4with:node-version: '20'- name: Install dependenciesrun: npm install- name: Run build scriptrun: npm run build- name: Upload build artifactsuses: actions/upload-artifact@v4with:name: frontend-buildpath: ./distdeploy:needs: buildruns-on: ubuntu-lateststeps:- name: Download build artifactsuses: actions/download-artifact@v4with:name: frontend-buildpath: ./dist- name: Deploy to serveruses: appleboy/scp-action@masterwith:host: ${{ secrets.SERVER_HOST }}username: ${{ secrets.SERVER_USERNAME }}password: ${{ secrets.SERVER_PASSWORD }}port: ${{ secrets.SERVER_PORT }}source: "dist"target: "/root/build"
3. 配置GitHub Secrets
在GitHub仓库设置中,配置以下Secrets:
SERVER_HOST:你的服务器IP地址SERVER_USERNAME:你的服务器用户名SERVER_PASSWORD:你的服务器密码SERVER_PORT:你的服务器SSH端口(默认为22)
这些Secrets用于在GitHub Actions Workflow中安全地存储和使用敏感信息,如服务器的登录凭证。
4. 配置服务器
确保服务器已经配置好Nginx,并且可以通过SSH访问。将前端项目的构建输出目录(例如dist)上传到服务器后,Nginx需要配置为指向这个目录以提供静态文件服务。
5. 下载构件
当工作流运行完成后,构建好的前端文件会被上传为构件。可以在 GitHub 项目的 Actions 标签下找到对应的运行记录,并下载构件。具体操作如下:
- 打开GitHub 项目页面,在左侧菜单中点击
Actions。 - 找到触发的构建工作流,点击对应的运行记录。
- 在运行记录页面的右上角,会看到
Artifacts标签,点击它。 - 点击上传的构件名称(如
frontend-build),就可以开始下载。
6. 自动化部署到后台服务器
为了进一步提升效率,可以借助 scp 或 rsync 将构件从 GitHub Actions 自动部署到云服务器。这里以 scp 为例,需要配置 SSH 密钥,并在 GitHub Secrets 中设置服务器的访问凭据。
配置 SSH 密钥
- 在本地生成 SSH 密钥对(如果还没有的话),使用命令
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"。 - 将生成的公钥添加到云服务器的
~/.ssh/authorized_keys文件中。 - 将私钥添加到 GitHub 项目的 Secrets 中,设置为
SSH_PRIVATE_KEY。
修改工作流文件以支持自动部署
在build.yml 文件中添加部署步骤:
- name: Install SSH Clientuses: webfactory/ssh-agent@v0.5.4with:ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}- name: Deploy to Remote Serverrun: |scp -r ./build user@your_server_ip:/path/to/deploy
确保将上述命令中的 user、your_server_ip 和 /path/to/deploy 替换为你的服务器用户名、服务器 IP 地址和你想部署到的路径。

为了使上述命令能够顺利执行,需要在GitHub仓库的“Settings” -> “Secrets”中添加SSH_PRIVATE_KEY和服务器的IP地址等信息,将本地生成的私钥内容复制到该Secret中。

总结需要确认以下三点:
- 确认公钥已经正确添加到云服务器的
~/.ssh/authorized_keys文件中。 - 在GitHub仓库的“Settings” -> “Secrets”中添加SSH_PRIVATE_KEY。将本地生成的私钥内容复制到该Secret中。
- 添加SERVER_IP,将你的云服务器的IP地址添加到该Secret中。
通过上述步骤,利用 GitHub Actions 的免费 CI/CD 资源编译打包前端项目,并将结果自动部署到你的云服务器上,无需占用本地服务器的资源。这样不仅提高了效率,还简化了部署流程,太美啦。
注: 在使用 GitHub Actions 实现 CI/CD 自动化部署时,将生成的公钥添加到云服务器的 ~/.ssh/authorized_keys 文件中是推荐的做法,这样可以实现无密码的自动化部署。这样 GitHub Actions 在执行部署时就可以使用私钥进行身份验证,而无需每次都输入密码。这不仅提高了部署的效率,也增强了安全性,因为私钥的存储和使用可以被更好地控制。

结论
通过GitHub的CICD功能,我们可以利用其强大的云端构建环境来完成前端项目的构建和打包工作,而无需占用本地服务器的大量资源。这样不仅可以提高构建效率,还可以降低服务器的负担,使我们的开发和部署过程更加流畅。
附:我的Dockerfile:
# 如果需要用 cicd ,请设置环境变量:
# variables:
# DOCKER_BUILDKIT: 1FROM node:20-slim AS base
ENV PNPM_HOME="/pnpm"
ENV PATH="$PNPM_HOME:$PATH"
RUN corepack enable
COPY . /app
WORKDIR /appFROM base AS prod-deps
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install --prodFROM base AS build
COPY --from=prod-deps /app/node_modules /app/node_modules
RUN --mount=type=cache,id=pnpm,target=/pnpm/store pnpm install && pnpm run buildFROM nginx:alpine
LABEL MAINTAINER="bypanghu@163.com"
COPY --from=base /app/.docker-compose/nginx/conf.d/my.conf /etc/nginx/conf.d/my.conf
COPY --from=build /app/dist /usr/share/nginx/html
RUN ls -al /usr/share/nginx/html
我的docker-compose.yaml文件:
version: "3"# 声明一个名为network的networks,subnet为network的子网地址,默认网关是177.7.0.1
networks:network:ipam:driver: defaultconfig:- subnet: '177.7.0.0/16'# 设置mysql,redis持久化保存
volumes:mysql:redis:services:web:build:context: ../../webdockerfile: ./Dockerfilecontainer_name: gva-webrestart: alwaysports:- '8080:8080'depends_on:- servercommand: [ 'nginx-debug', '-g', 'daemon off;' ]networks:network:ipv4_address: 177.7.0.11server:build:context: ../../serverdockerfile: ./Dockerfilecontainer_name: gva-serverrestart: alwaysports:- '8888:8888'depends_on:mysql:condition: service_healthyredis:condition: service_healthylinks:- mysql- redisnetworks:network:ipv4_address: 177.7.0.12mysql:image: mysql:8.0.21 # 如果您是 arm64 架构:如 MacOS 的 M1,请修改镜像为 image: mysql/mysql-server:8.0.21container_name: gva-mysqlcommand: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci #设置utf8字符集restart: alwaysports:- "13306:3306" # host物理直接映射端口为13306environment:#MYSQL_ROOT_PASSWORD: 'Aa@6447985' # root管理员用户密码MYSQL_DATABASE: 'qmPlus' # 初始化启动时要创建的数据库的名称MYSQL_USER: 'gva'MYSQL_PASSWORD: 'Aa@6447985'healthcheck:test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "gva", "-pAa@6447985"]interval: 10stimeout: 5sretries: 3volumes:- mysql:/var/lib/mysqlnetworks:network:ipv4_address: 177.7.0.13redis:image: redis:6.0.6container_name: gva-redis # 容器名restart: alwaysports:- '16379:6379'healthcheck:test: ["CMD-SHELL", "redis-cli ping | grep PONG || exit 1"]interval: 10stimeout: 5sretries: 3volumes:- redis:/datanetworks:network:ipv4_address: 177.7.0.14
最后,附上我的cicd脚本代码(测试ok,完全可用):
.github\workflows\ci-cd.yml
name: CI-CD Build and Deploy Frontendon:push:branches: [ main ]pull_request:branches: [ main ]jobs:build:runs-on: ubuntu-lateststrategy:matrix:node-version: [20.x]steps:- uses: actions/checkout@v4- name: set Node.js versionuses: actions/setup-node@v4with:node-version: ${{ matrix.node-version }}- name: cache Node.js moduleuses: actions/cache@v4with:path: ~/.npmkey: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}restore-keys: |${{ runner.os }}-node-- name: install dependenciesrun: npm install- name: Create build directoryrun: mkdir -p ./dist- name: Build projectrun: npm run build- name: upload Artifactuses: actions/upload-artifact@v4with:name: build resultpath: ./dist- name: Install SSH clientrun: sudo apt-get install -y openssh-client- name: Create a text file for testingrun: touch ./dist/text.txt- name: Set up SSH keysrun: |mkdir -p ~/.sshecho "$SSH_PRIVATE_KEY" | tr -d '\r' > ~/.ssh/id_ed25519chmod 600 ~/.ssh/id_ed25519ssh-keyscan -t ed25519 120.27.146.247 >> ~/.ssh/known_hostsenv:SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}- name: Deploy to Remote Serverrun: |scp -r ./dist root@120.27.146.247:/root/buildenv:SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
参考资料
- GitHub Actions
- Docker Compose
- SCP Action
注:文中提到的docker-compose.yaml内容,主要用于本地开发环境的构建和部署,可以按照实际需求进行调整。在CICD流程中,我们主要是利用Docker来构建前端项目的镜像,然后将构建好的静态文件通过SCP方式上传至部署服务器。
相关文章:
巧用GitHub的CICD功能免费打包部署前端项目
近年来,随着前端技术的发展,前端项目的构建和打包过程变得越来越复杂,占用的资源也越来越多。我有一台云服务器,原本打算使用Docker进行部署,以简化操作流程。然而,只要执行sudo docker-compose -f deploy/…...
【2】常用cmd命令大全、使用cmd运行和编译Java程序
文章目录 一、常用cmd命令大全文件和目录操作系统信息查看磁盘管理网络操作其他常用命令 二、使用cmd命令运行和编译Java程序 一、常用cmd命令大全 cmd的常用命令较多,java初学者只需了解这几个即可 dir:查看当前路径下的所有文件夹 cd:进入指…...
UniApp SelectorQuery 讲解
一、SelectorQuery简介 在UniApp中,SelectorQuery是一个非常强大的工具,它允许开发者查询节点信息。通过这个API,我们可以获取到页面元素的尺寸、位置、滚动条位置等信息。这在处理动态布局、动画效果或是用户交互时尤为重要。 二、基本使用…...
【行业解决方案篇十一】【DeepSeek零售分析:客流热力图生成系统】
开篇:当商店开始"思考" 你可能不知道,现在北京三里屯的优衣库旗舰店,每天要处理超过3000个顾客的移动轨迹数据。这些数据不是用来监控,而是让店铺自己"学会"把畅销款T恤摆在哪里最能促进销量。今天要讲的DeepSeek零售分析系统,就是这样一个能把"…...
车载DoIP协议 --- TCP详细解析
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活…...
C++关键字之mutable
1.介绍 在C中,mutable是一个关键字,用于修饰类的成员变量。它的主要作用是允许在常量成员函数或常量对象中修改被标记为mutable的成员变量。通常情况下,常量成员函数不能修改类的成员变量,但有些情况下,某些成员变量的…...
设计模式| 观察者模式 Observer Pattern详解
目录 一、概述1.1 动机1.2 核心思想1.3 别名 二、角色与实现原理2.1 角色2.2 实现原理2.3 类图 三、经典接口实现3.1 示例3.1.1 观察者接口3.1.2 目标接口3.1.3 具体被观察者3.1.4 具体观察者3.1.5 Client3.1.6 UML时序图 3.2 特点 四、其他实现方式4.1 委托与事件(…...
Git-速查
Git 安装 Git 之后,你可以… 配置全局用户信息(推荐) 全局设置,创建本地仓库时默认分支名称为 main(你需要什么名称就该什么名称)【推荐配置为 main 】 git config --global init.defaultBranch main全…...
Spring Boot嵌入式服务器深度解析:从配置到调优的全方位指南
文章目录 引言一、嵌入式服务器核心原理1.1 架构设计特点1.2 主流服务器对比 二、嵌入式服务器配置实战2.1 基础配置模板2.2 HTTPS安全配置 三、高级调优策略3.1 线程池优化(Tomcat示例)3.2 响应压缩配置3.3 访问日志配置 四、服务器切换实战4.1 切换至U…...
深入解析浏览器渲染全流程:从URL输入到页面渲染的底层原理与性能优化(附实战代码)
本文以https://example.com为例,逐层剖析浏览器从输入URL到页面渲染的完整链路,涵盖DNS解析、TCP/TLS握手、HTTP请求、DOM/CSSOM构建等核心阶段,结合代码示例与性能调优技巧,助你掌握浏览器底层运行机制。 一、导航阶段࿱…...
【网络安全】常见的web攻击
1、SQL注入攻击 定义: 攻击者在HTTP请求中注入恶意的SQL代码,当服务器利用参数构建SQL语句的时候,恶意的SQL代码被一起构建,并在数据库中执行。 示例: 用户登录: 输入用户名xx, 密码 or 1 …...
MySQL面试学习
MySQL 1.事务 事务的4大特性 事务4大特性:原子性、一致性、隔离性、持久性 原⼦性: 事务是最⼩的执⾏单位,不允许分割。事务的原⼦性确保动作要么全部完成,要么全不执行一致性: 执⾏事务前后,数据保持⼀…...
一文读懂Docker之Docker Compose
目录 一、Docker Compose简介 二、Docker Compose的安装和基本使用 1、Docker Compose的安装 步骤一、下载docker-compose 步骤二、新增可执行权限 步骤三、查看是否安装成功 2、Docker Compose的基本使用 (1)、docker-compose up (2)、docker-compose ps (3)、docke…...
escape SQL中用法
select * from tablename where username like %#%% escape # 这个的意思就是,escape指定字符#,#字符后面的第一个字符被认为是普通字符 查询示例2 查询username字段中包含[的数据也是一样,即: select * from tablename where us…...
Cherno C++ P57 Standard array处理静态数组
这篇文章当中我们讲一下如何使用C自带的standard array来处理静态数组。 首先什么是静态数组,静态数组通常指的是不会增长的数据,长度是已经确定了的。我们在定义数组的时候就必须确定好长度与类型。 其次C当中也确实给我们提供了一些可以用来处理静态…...
linux学习【7】Sourc Insight 4.0设置+操作
目录 1.Source Insight是什么?2.需要哪些配置?3.怎么新建项目4.一些问题的解决1.中文乱码问题 5.常规使用1. 在工程中打开文件2. 在文件中查看函数或变量的定义3. 查找函数或变量的引用4. 快捷键 按照这个设置就可以了,下面的设置会标明设置理…...
JDK、Hadoop下载地址
一、Oracle JDK https://www.oracle.com/java/technologies/downloads/ 刚进去是最新的版本,往下滑可以看到老版本 二、Open JDK的 Azul Zulu https://www.azul.com/downloads/ 直接可以选版本等选项卡 三、Hadoop Apache Download Mirrors...
【小白向超详细】使用 VSCode 远程连接 Linux 服务器详细教程
使用 VSCode 远程连接 Linux 服务器详细教程 前提条件 已安装 VSCode。已在 VSCode 中安装 Remote - SSH 插件。目标 Linux 服务器 开启了 SSH 服务,并可以通过 SSH 访问。本地电脑已安装 SSH 客户端(Linux 和 macOS 自带,Windows 用户可以…...
设计心得——解耦的实现技术
一、说明 在前面的“设计心得——解耦”中,对解耦进行了高层次的抽象说明。本篇则对在实践中常用的解耦技术进行逐一分析说明,以期为开发者能更从理论到实践搭建一个桥梁。至于大家能够如何更好的在自己的项目中进行解耦的实践,就需要不断的…...
计算机毕业设计SpringBoot+Vue.jst在线文档管理系统(源码+LW文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...
【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...
AI语音助手的Python实现
引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
UE5 音效系统
一.音效管理 音乐一般都是WAV,创建一个背景音乐类SoudClass,一个音效类SoundClass。所有的音乐都分为这两个类。再创建一个总音乐类,将上述两个作为它的子类。 接着我们创建一个音乐混合类SoundMix,将上述三个类翻入其中,通过它管理每个音乐…...
今日行情明日机会——20250609
上证指数放量上涨,接近3400点,个股涨多跌少。 深证放量上涨,但有个小上影线,相对上证走势更弱。 2025年6月9日涨停股主要行业方向分析(基于最新图片数据) 1. 医药(11家涨停) 代表标…...
后端下载限速(redis记录实时并发,bucket4j动态限速)
✅ 使用 Redis 记录 所有用户的实时并发下载数✅ 使用 Bucket4j 实现 全局下载速率限制(动态)✅ 支持 动态调整限速策略✅ 下载接口安全、稳定、可监控 🧩 整体架构概览 模块功能Redis存储全局并发数和带宽令牌桶状态Bucket4j Redis分布式限…...
Go 语言中的内置运算符
1. 算术运算符 注意: (自增)和--(自减)在 Go 语言中是单独的语句,并不是运算符。 package mainimport "fmt"func main() {fmt.Println("103", 103) // 13fmt.Println("10-3…...
