各位听众,大家好!今天咱们来聊聊 Vue 项目的 CI/CD 流水线搭建,保证代码质量,提高部署效率,让你的项目像坐上火箭一样飞速上线。
咱们的目标是:
- 自动化测试:每次提交代码,自动跑一遍测试,确保没有引入新的 bug。
- 代码质量检查:代码风格一致,没有潜在的性能问题和安全漏洞。
- 多环境部署:轻松部署到开发、测试、生产环境。
准备好了吗?Let’s dive in!
第一部分:选择合适的 CI/CD 工具
市面上 CI/CD 工具琳琅满目,常见的有 Jenkins, GitLab CI, GitHub Actions, CircleCI, Travis CI 等。
- Jenkins: 老牌选手,功能强大,插件丰富,但配置比较复杂,需要自己搭建服务器。
- GitLab CI: GitLab 自带的 CI/CD,与 GitLab 集成紧密,配置简单,但依赖 GitLab 平台。
- GitHub Actions: GitHub 自带的 CI/CD,与 GitHub 集成紧密,配置简单,使用 YAML 文件定义流程。
- CircleCI: 云端 CI/CD,配置简单,支持多种语言和平台,但需要付费。
- Travis CI: 云端 CI/CD,配置简单,对开源项目免费,但对私有项目收费。
考虑到配置的简易性和与 GitHub 的集成度,咱们今天选择 GitHub Actions 作为演示工具。
第二部分:配置 GitHub Actions Workflow
在你的 Vue 项目根目录下创建一个 .github/workflows
目录,然后创建一个 YAML 文件,例如 main.yml
。
name: Vue CI/CD
on:
push:
branches: [ "main" ] # 当 main 分支有 push 时触发
pull_request:
branches: [ "main" ] # 当向 main 分支发起 pull request 时触发
jobs:
build:
runs-on: ubuntu-latest # 使用最新版本的 Ubuntu 系统
steps:
- uses: actions/checkout@v3 # 将代码检出到 runner
- name: Setup Node.js environment
uses: actions/setup-node@v3
with:
node-version: '16' # 使用 Node.js 16 版本
- name: Install dependencies
run: npm install # 安装依赖
- name: Run tests
run: npm run test:unit # 运行单元测试 (假设 package.json 中定义了 test:unit 命令)
- name: Run lint
run: npm run lint # 运行代码检查 (假设 package.json 中定义了 lint 命令)
- name: Build project
run: npm run build # 构建项目 (假设 package.json 中定义了 build 命令)
- name: Deploy to production # 部署到生产环境 (这里只是一个示例,需要根据你的实际情况修改)
if: github.ref == 'refs/heads/main' # 只有在 main 分支上才执行
run: |
echo "Deploying to production..."
# 在这里添加你的部署脚本,例如使用 ssh 登录服务器,然后上传构建好的文件
# 这是一个占位符,你需要替换成真正的部署命令
echo "Deployment completed."
解释一下关键部分:
name
: Workflow 的名称,会在 GitHub Actions 页面显示。on
: 触发 workflow 的事件,这里配置了push
和pull_request
事件,当main
分支有 push 或 pull request 时触发。jobs
: 定义 workflow 中的任务,每个任务会在一个独立的虚拟机中运行。build
: 任务的名称,可以自定义。runs-on
: 运行任务的操作系统,这里选择了ubuntu-latest
。steps
: 任务中的步骤,每个步骤会执行一个命令。uses
: 使用 GitHub Actions 提供的 actions,例如actions/checkout@v3
用于检出代码,actions/setup-node@v3
用于安装 Node.js 环境。run
: 运行自定义命令,例如npm install
安装依赖,npm run test:unit
运行单元测试。if
: 条件判断,只有满足条件才执行该步骤,这里限制了只有在main
分支上才执行部署操作。
第三部分:配置 package.json
确保你的 package.json
文件中定义了以下命令:
{
"scripts": {
"serve": "vue-cli-service serve",
"build": "vue-cli-service build",
"lint": "vue-cli-service lint",
"test:unit": "vue-cli-service test:unit"
},
"devDependencies": {
"@vue/cli-plugin-eslint": "~5.0.0",
"@vue/cli-plugin-unit-jest": "~5.0.0",
"@vue/cli-service": "~5.0.0",
"@vue/eslint-config-standard": "^6.1.0",
"@vue/test-utils": "^2.0.0-0",
"babel-jest": "^27.0.0",
"eslint": "^7.32.0",
"eslint-plugin-import": "^2.25.3",
"eslint-plugin-node": "^11.1.0",
"eslint-plugin-promise": "^5.1.0",
"eslint-plugin-vue": "^8.0.3",
"jest": "^27.0.0"
}
}
如果没有定义,需要安装相应的依赖并配置:
npm install --save-dev @vue/cli-plugin-eslint @vue/cli-plugin-unit-jest @vue/cli-service @vue/eslint-config-standard @vue/test-utils babel-jest eslint eslint-plugin-import eslint-plugin-node eslint-plugin-promise eslint-plugin-vue jest
第四部分:代码质量检查 (Linting)
代码质量检查可以帮助我们保持代码风格一致,避免潜在的错误。咱们使用 ESLint 作为代码检查工具。
首先,确保项目中已经安装了 ESLint:
npm install --save-dev eslint
然后,创建一个 ESLint 配置文件 .eslintrc.js
:
module.exports = {
root: true,
env: {
node: true
},
extends: [
'plugin:vue/essential',
'@vue/standard'
],
parserOptions: {
parser: '@babel/eslint-parser'
},
rules: {
'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off',
'vue/multi-word-component-names': 'off' // 关闭组件命名规则,根据项目需求调整
}
}
这个配置文件继承了 Vue 的推荐规则和标准规则,你可以根据自己的需求进行修改。
第五部分:自动化测试 (Unit Testing)
自动化测试可以帮助我们快速发现 bug,确保代码的正确性。咱们使用 Jest 作为单元测试框架。
首先,确保项目中已经安装了 Jest:
npm install --save-dev jest @vue/test-utils babel-jest
然后,创建一个 Jest 配置文件 jest.config.js
:
module.exports = {
preset: '@vue/cli-plugin-unit-jest'
}
编写你的单元测试用例,例如 src/components/HelloWorld.spec.js
:
import { shallowMount } from '@vue/test-utils'
import HelloWorld from '@/components/HelloWorld.vue'
describe('HelloWorld.vue', () => {
it('renders props.msg when passed', () => {
const msg = 'new message'
const wrapper = shallowMount(HelloWorld, {
props: { msg }
})
expect(wrapper.text()).toMatch(msg)
})
})
第六部分:多环境部署
多环境部署可以让我们在不同的环境中使用不同的配置,例如开发环境使用 mock 数据,生产环境使用真实数据。
咱们可以使用环境变量来实现多环境部署。
首先,在 .env
文件中定义不同的环境变量:
# .env.development
NODE_ENV=development
VUE_APP_API_URL=http://localhost:3000/api
# .env.production
NODE_ENV=production
VUE_APP_API_URL=https://api.example.com/api
然后在 vue.config.js
文件中配置环境变量:
module.exports = {
publicPath: process.env.NODE_ENV === 'production'
? '/your-project-name/' // 如果你的项目部署在子目录下,需要配置 publicPath
: '/',
devServer: {
proxy: {
'/api': {
target: process.env.VUE_APP_API_URL,
changeOrigin: true,
pathRewrite: {
'^/api': ''
}
}
}
}
}
在代码中使用环境变量:
<template>
<div>
<p>API URL: {{ apiUrl }}</p>
</div>
</template>
<script>
export default {
data() {
return {
apiUrl: process.env.VUE_APP_API_URL
}
}
}
</script>
在 GitHub Actions 中,你可以使用 secrets 来存储敏感信息,例如 API 密钥、数据库密码等。
在 GitHub 项目的 Settings -> Secrets -> Actions 中添加 secrets。
然后在 workflow 文件中使用 secrets:
name: Vue CI/CD
on:
push:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js environment
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm run test:unit
- name: Run lint
run: npm run lint
- name: Build project
run: npm run build
- name: Deploy to production
if: github.ref == 'refs/heads/main'
run: |
echo "Deploying to production..."
# 使用 secrets 中的 API 密钥
API_KEY=${{ secrets.API_KEY }}
echo "API Key: $API_KEY"
# 在这里添加你的部署脚本,例如使用 ssh 登录服务器,然后上传构建好的文件
# 这是一个占位符,你需要替换成真正的部署命令
echo "Deployment completed."
env: #定义环境变量
VUE_APP_API_URL: ${{ secrets.VUE_APP_API_URL }} #从GitHub Secrets中读取
第七部分:部署脚本示例 (简化版)
这里提供一个简化的部署脚本示例,你需要根据你的实际情况进行修改。
假设你的服务器可以通过 SSH 登录,并且已经安装了 Node.js 和 npm。
#!/bin/bash
# 服务器地址
SERVER_ADDRESS="your_server_address"
# 服务器用户名
SERVER_USERNAME="your_server_username"
# 服务器上的部署目录
DEPLOY_PATH="/var/www/your_project_name"
# 本地构建目录
BUILD_PATH="./dist"
# SSH 连接字符串
SSH_CONNECTION="$SERVER_USERNAME@$SERVER_ADDRESS"
# 停止服务器 (如果需要)
ssh $SSH_CONNECTION "pm2 stop your_project_name"
# 删除旧的部署文件
ssh $SSH_CONNECTION "rm -rf $DEPLOY_PATH/*"
# 上传构建好的文件
scp -r $BUILD_PATH/* $SSH_CONNECTION:$DEPLOY_PATH
# 安装依赖 (如果需要)
ssh $SSH_CONNECTION "cd $DEPLOY_PATH && npm install --production"
# 启动服务器 (如果需要)
ssh $SSH_CONNECTION "pm2 start npm --name your_project_name -- run serve"
echo "Deployment completed."
这个脚本做了以下事情:
- 停止服务器 (如果需要)。
- 删除旧的部署文件。
- 上传构建好的文件到服务器。
- 安装依赖 (如果需要)。
- 启动服务器 (如果需要)。
你需要将 your_server_address
, your_server_username
, your_project_name
替换成你的实际值。
完整的 YAML 示例:
name: Vue CI/CD
on:
push:
branches: [ "main" ]
pull_request:
branches: [ "main" ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup Node.js environment
uses: actions/setup-node@v3
with:
node-version: '16'
- name: Install dependencies
run: npm install
- name: Run tests
run: npm run test:unit
- name: Run lint
run: npm run lint
- name: Build project
run: npm run build
- name: Deploy to production
if: github.ref == 'refs/heads/main'
run: |
echo "Deploying to production..."
# 使用 secrets 中的 API 密钥
API_KEY=${{ secrets.API_KEY }}
echo "API Key: $API_KEY"
# 部署脚本
echo "#!/bin/bash" > deploy.sh
echo "" >> deploy.sh
echo "# 服务器地址" >> deploy.sh
echo "SERVER_ADDRESS="your_server_address"" >> deploy.sh
echo "" >> deploy.sh
echo "# 服务器用户名" >> deploy.sh
echo "SERVER_USERNAME="your_server_username"" >> deploy.sh
echo "" >> deploy.sh
echo "# 服务器上的部署目录" >> deploy.sh
echo "DEPLOY_PATH="/var/www/your_project_name"" >> deploy.sh
echo "" >> deploy.sh
echo "# 本地构建目录" >> deploy.sh
echo "BUILD_PATH="./dist"" >> deploy.sh
echo "" >> deploy.sh
echo "# SSH 连接字符串" >> deploy.sh
echo "SSH_CONNECTION="$SERVER_USERNAME@$SERVER_ADDRESS"" >> deploy.sh
echo "" >> deploy.sh
echo "# 停止服务器 (如果需要)" >> deploy.sh
echo "ssh $SSH_CONNECTION "pm2 stop your_project_name"" >> deploy.sh
echo "" >> deploy.sh
echo "# 删除旧的部署文件" >> deploy.sh
echo "ssh $SSH_CONNECTION "rm -rf $DEPLOY_PATH/*"" >> deploy.sh
echo "" >> deploy.sh
echo "# 上传构建好的文件" >> deploy.sh
echo "scp -r $BUILD_PATH/* $SSH_CONNECTION:$DEPLOY_PATH" >> deploy.sh
echo "" >> deploy.sh
echo "# 安装依赖 (如果需要)" >> deploy.sh
echo "ssh $SSH_CONNECTION "cd $DEPLOY_PATH && npm install --production"" >> deploy.sh
echo "" >> deploy.sh
echo "# 启动服务器 (如果需要)" >> deploy.sh
echo "ssh $SSH_CONNECTION "pm2 start npm --name your_project_name -- run serve"" >> deploy.sh
echo "" >> deploy.sh
echo "echo "Deployment completed."" >> deploy.sh
# 赋予执行权限
chmod +x deploy.sh
# 执行部署脚本
./deploy.sh
echo "Deployment completed."
env: #定义环境变量
VUE_APP_API_URL: ${{ secrets.VUE_APP_API_URL }} #从GitHub Secrets中读取
别忘了将 your_server_address
,your_server_username
,your_project_name
替换成你的实际值。
注意事项:
- 确保你的服务器已经配置了 SSH 密钥登录,避免在 workflow 文件中存储密码。
- 根据你的实际情况修改部署脚本,例如使用不同的部署工具、不同的服务器配置等。
- 可以添加更多的测试步骤,例如端到端测试、性能测试等。
- 可以添加更多的代码质量检查步骤,例如代码复杂度分析、安全漏洞扫描等。
- 可以使用 Docker 来简化部署过程。
总结
通过配置 GitHub Actions Workflow,我们可以实现 Vue 项目的自动化测试、代码质量检查和多环境部署。这可以帮助我们提高开发效率,减少 bug,保证代码质量,让你的项目更加稳定可靠。
当然,这只是一个简单的示例,你可以根据你的实际需求进行修改和扩展。
希望今天的讲解对你有所帮助!祝大家编程愉快!