别再手动传代码了!用GitLab Runner + Shell执行器,5分钟搞定前端项目自动化部署
每次手动上传代码到服务器时,那些重复的scp和rsync命令是不是已经让你感到厌倦?特别是当项目需要频繁更新时,这种机械操作不仅浪费时间,还容易出错。今天我要分享的这套方案,能让你的前端项目在代码推送后自动完成构建和部署,整个过程完全无需人工干预。
Shell执行器可能是GitLab Runner中最被低估的配置方式。相比Docker执行器需要维护镜像的麻烦,Shell执行器直接利用服务器现有环境,特别适合资源有限的中小团队或个人开发者。我曾为一个Vue项目配置这套系统,从零开始到全自动部署只用了不到半小时,之后每次代码推送都能在3分钟内完成全流程。
1. 为什么选择Shell执行器?
在自动化部署领域,Docker执行器确实占据主流,但Shell执行器有它独特的优势。最近为一个客户部署内部系统时,他们的CentOS服务器只有2GB内存,跑Docker都吃力,而用Shell方案轻松实现了每小时数十次的自动部署。
Shell与Docker执行器的核心差异:
| 特性 | Shell执行器 | Docker执行器 |
|---|---|---|
| 启动速度 | 即时启动(毫秒级) | 需要拉取/启动容器(秒级) |
| 资源占用 | 直接使用宿主机资源 | 需要额外分配容器资源 |
| 环境隔离 | 弱隔离(共享宿主机环境) | 强隔离(独立容器环境) |
| 依赖管理 | 需手动维护服务器环境 | 通过Dockerfile固化环境 |
| 适用场景 | 简单项目/资源受限环境 | 复杂环境/多版本共存需求 |
Shell执行器特别适合以下情况:
- 服务器配置较低(内存<4GB)
- 项目依赖相对固定(如长期使用相同Node.js版本)
- 需要直接访问宿主机资源(如特定硬件设备)
- 追求极简部署流程
提示:如果你的项目需要多版本Node.js环境切换,Docker执行器仍是更好选择。但对大多数前端项目来说,Shell方案已经足够。
2. 服务器环境准备
在开始配置前,我们需要确保服务器具备基本运行环境。以Ubuntu 20.04为例,这些命令能帮你快速搭建基础环境:
# 安装Node.js(LTS版本) curl -fsSL https://deb.nodesource.com/setup_lts.x | sudo -E bash - sudo apt-get install -y nodejs # 验证安装 node -v # 应输出v16.x或更高 npm -v # 应输出8.x或更高 # 安装Git(如果尚未安装) sudo apt-get install -y git常见问题排查:
如果
npm install时报权限错误,可以:# 修正npm全局安装权限 mkdir ~/.npm-global npm config set prefix '~/.npm-global' echo 'export PATH=~/.npm-global/bin:$PATH' >> ~/.bashrc source ~/.bashrc部署目录权限问题(特别是使用www-data用户时):
# 假设部署目录是/var/www/my-project sudo mkdir -p /var/www/my-project sudo chown -R $USER:www-data /var/www/my-project sudo chmod -R 775 /var/www/my-project
3. GitLab Runner安装与配置
现在来到核心环节。我们将使用官方推荐的方式安装GitLab Runner:
# 添加官方仓库 curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash # 安装Runner sudo apt-get install gitlab-runner # 将当前用户加入docker组(如需要) sudo usermod -aG gitlab-runner $USER注册Runner时,这几个参数需要特别注意:
sudo gitlab-runner register- 输入GitLab实例URL:
https://gitlab.com(或你的私有实例地址) - 输入注册令牌(从项目Settings > CI/CD > Runners获取)
- 输入描述:
shell-executor-for-frontend - 输入标签:
shell,frontend - 选择执行器:
shell
注册完成后,检查配置文件/etc/gitlab-runner/config.toml,确保看到类似内容:
[[runners]] name = "shell-executor-for-frontend" url = "https://gitlab.com" token = "xxxxxxxxxxxxxx" executor = "shell" [runners.custom_build_dir] [runners.cache] [runners.cache.s3] [runners.cache.gcs]注意:如果Runner没有立即出现在GitLab界面,尝试重启服务:
sudo gitlab-runner restart
4. 定制前端专属CI配置
这是我为Vue项目优化的.gitlab-ci.yml模板,同样适用于React项目:
variables: PROJECT_NAME: "my-vue-app" # 修改为你的项目名 DEPLOY_DIR: "/var/www/$PROJECT_NAME" stages: - build - deploy cache: key: "$CI_COMMIT_REF_SLUG" paths: - node_modules/ build_job: stage: build script: - echo "安装依赖..." - npm ci --prefer-offline - echo "构建项目..." - npm run build - echo "准备部署文件..." - mkdir -p deploy - cp -r dist/* deploy/ artifacts: paths: - deploy/ expire_in: 1 hour tags: - shell deploy_job: stage: deploy script: - echo "清空部署目录..." - rm -rf $DEPLOY_DIR/* - echo "复制新文件..." - cp -r deploy/* $DEPLOY_DIR/ - echo "部署完成!访问地址:http://your-domain.com" only: - main tags: - shell关键优化点解析:
- 使用
npm ci替代npm install,确保依赖版本与lock文件严格一致 - 通过
cache机制加速后续构建,特别是node_modules目录 - 将构建产物(
dist)单独存放在deploy目录,避免污染构建环境 - 部署阶段使用原子性操作(先清空目录再复制),避免文件残留问题
5. 高级技巧与故障排查
当你在实际使用中遇到问题时,这些技巧可能会帮到你:
环境变量管理:
# 在服务器上设置全局环境变量 echo 'export NODE_ENV=production' | sudo tee -a /etc/profile source /etc/profile # 或者在.gitlab-ci.yml中定义 variables: NODE_ENV: "production"多项目共存方案:
- 为每个项目创建独立系统用户:
sudo adduser deploy-myapp --disabled-password sudo usermod -aG www-data deploy-myapp - 在config.toml中配置不同Runner:
[[runners]] name = "runner-for-project-a" executor = "shell" [runners.custom_build_dir] [[runners]] name = "runner-for-project-b" executor = "shell" [runners.custom_build_dir]
性能监控命令:
# 查看Runner资源占用 top -p $(pgrep -f gitlab-runner) # 清理旧的构建缓存 sudo gitlab-runner prune --help最近一次项目迁移中,我发现当构建产物超过1GB时,默认配置可能会失败。这时需要调整Runner的builds_dir配置:
[[runners]] builds_dir = "/mnt/big-disk/builds" # 指向有足够空间的分区这套方案已经在5个不同规模的前端项目中验证过,从简单的静态网站到复杂的SPA应用都能完美支持。一个特别有意思的案例是:有个团队原本每次发布需要20分钟手动操作,改用这套自动化流程后,不仅发布时间缩短到3分钟,而且凌晨三点的紧急修复也不再需要全员起床了。