前端 CI/CD 流程与自动化部署实践
常见误区
CI/CD 常被视为复杂流程,但配置不当反而增加风险。不同工具配置差异显著,需针对性调整。例如 Jenkins 配置文件较为复杂,GitLab CI 的 YAML 语法也需仔细编写。
核心价值
- 自动化部署:自动完成代码测试、构建和部署,减少手动操作,提高效率。
- 减少人为错误:避免手动部署时的人为失误,提升可靠性。
- :提交后立即测试构建,及时发现问题。
前端 CI/CD 流程通过自动化工具实现代码测试、构建和部署,减少人为错误并提高效率。文章对比了手动部署的弊端,详细展示了 GitHub Actions、GitLab CI 及 Jenkins 的配置方案,涵盖环境一致性、快速反馈等核心优势。同时指出过度配置的风险,强调根据项目规模合理设计流程,确保部署可靠且高效。
CI/CD 常被视为复杂流程,但配置不当反而增加风险。不同工具配置差异显著,需针对性调整。例如 Jenkins 配置文件较为复杂,GitLab CI 的 YAML 语法也需仔细编写。
# 典型手动部署流程
# 1. 手动运行测试
npm test
# 2. 手动构建项目
npm run build
# 3. 手动上传构建文件到服务器
scp -r build/* user@server:/var/www/html/
# 4. 手动重启服务
ssh user@server "sudo systemctl restart nginx"
问题:
# .github/workflows/deploy.yml
name: Deploy to Production
on:
push:
branches:
- main
jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '16'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build project
run: npm run build
- name: Deploy to server
uses: easingthemes/ssh-deploy@v2
with:
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
ARGS: '-rltgoDzvO --delete'
SOURCE: 'build/'
REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
REMOTE_USER: ${{ secrets.REMOTE_USER }}
TARGET: ${{ secrets.REMOTE_TARGET }}
- name: Restart server
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.REMOTE_HOST }}
username: ${{ secrets.REMOTE_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: sudo systemctl restart nginx
# .gitlab-ci.yml
stages:
- test
- build
- deploy
test:
stage: test
image: node:16
script:
- npm install
- npm test
only:
- main
build:
stage: build
image: node:16
script:
- npm install
- npm run build
artifacts:
paths:
- build/
only:
- main
deploy:
stage: deploy
image: alpine:latest
script:
- apk add --no-cache rsync openssh
- mkdir -p ~/.ssh
- echo "$SSH_PRIVATE_KEY" > ~/.ssh/id_rsa
- chmod 600 ~/.ssh/id_rsa
- ssh-keyscan -H $REMOTE_HOST >> ~/.ssh/known_hosts
- rsync -avz --delete build/ $REMOTE_USER@$REMOTE_HOST:$REMOTE_TARGET
- ssh $REMOTE_USER@$REMOTE_HOST "sudo systemctl restart nginx"
only:
- main
environment:
name: production
// Jenkinsfile
pipeline {
agent any
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Install Dependencies') {
steps {
sh 'npm install'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
stage('Build') {
steps {
sh 'npm run build'
}
}
stage('Deploy') {
steps {
sh '''
scp -r build/* user@server:/var/www/html/
ssh user@server "sudo systemctl restart nginx"
'''
}
}
}
post {
always {
echo 'Pipeline completed'
}
success {
echo 'Deployment successful'
}
failure {
echo 'Deployment failed'
}
}
}
# .env
REMOTE_HOST=your-server.com
REMOTE_USER=deploy
REMOTE_TARGET=/var/www/html/
# SSH 密钥请在 CI/CD 平台的 secrets 中配置,勿直接写入
CI/CD 能提高部署效率,但需避免滥用导致流程复杂化。配置耗时过长可能得不偿失,应调试配置而非盲目自动化。过度配置包含不必要步骤会延长部署时间,例如运行无关测试。大型项目必不可少,小型项目需权衡成本。CI/CD 目的是提高效率和可靠性,若配置导致更慢或不可靠则失去意义。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online