尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

Jenkins+GitLab自动化部署实战:Vue与Spring Boot项目CI/CD流水线搭建

Jenkins+GitLab自动化部署实战:Vue与Spring Boot项目CI/CD流水线搭建
📅 发布时间:2026/7/30 4:13:05

1. 项目概述与核心价值

最近在团队里折腾了好一阵子,终于把一套基于 Jenkins 和 GitLab 的前后端项目自动化构建部署流水线给彻底跑通了。这玩意儿听起来可能有点“老生常谈”,毕竟 CI/CD 的概念都火了好多年了。但说实话,真要把这套东西从零到一、从一到一百地落地,并且让它稳定、高效、符合自己团队的开发习惯,里面需要抠的细节和踩的坑,远比看几篇教程要多得多。我这次分享的,就是我们团队将一个典型的“前端Vue + 后端Spring Boot”项目,通过 Jenkins 和 GitLab 实现从代码提交到自动测试、构建、打包,最终部署到服务器的完整闭环。整个过程,我们追求的不是最炫酷的技术栈,而是稳定、可维护、能真正解放开发者双手的务实方案。

简单来说,这套流水线能帮你解决几个核心痛点:第一,告别手动登录服务器、执行一堆重复命令的“人肉部署”时代,减少人为失误。第二,实现代码质量门禁,每次合并请求(Merge Request)都能自动跑单元测试、代码扫描,确保合入主干的代码是健康的。第三,实现快速、可重复的部署,无论是开发环境、测试环境还是生产环境,点一下按钮或者推个标签就能完成发布,大大提升了交付效率和信心。如果你也在为团队协作效率、部署一致性头疼,或者想搭建一套属于自己的自动化流程,那么接下来的内容应该能给你不少直接的参考。

2. 整体架构设计与工具选型考量

在动手之前,先得把蓝图画清楚。我们采用的是一种经典且经过大量实践检验的架构模式:GitLab 作为代码仓库和 Merge Request 的协作中心,Jenkins 作为自动化任务的执行引擎,两者通过 Webhook 紧密联动。此外,还包括 Docker 用于构建环境与部署封装,以及一套自建的 Nexus 私服用于管理构建产物(如 Jar 包、NPM 包)。

2.1 为什么是 Jenkins + GitLab,而不是其他组合?

市面上 CI/CD 工具很多,比如 GitLab CI、GitHub Actions、Drone 等。我们选择 Jenkins + GitLab 主要基于以下几点现实考量:

  1. 历史与生态:Jenkins 作为老牌自动化服务器,插件生态极其丰富,几乎能对接任何你想到的工具(各种代码仓库、构建工具、测试框架、部署平台)。团队内部已有一定的 Jenkins 使用经验,学习曲线相对平缓。
  2. 灵活性与控制力:Jenkins 的 Pipeline-as-Code(使用 Jenkinsfile)能力非常强大,可以编写非常复杂、条件化的流水线逻辑。对于有特殊构建需求或复杂部署流程的项目,Jenkins 提供的控制粒度更细。
  3. GitLab 的强项:GitLab 在代码管理、权限控制、Merge Request 流程上做得非常出色,其自带的 CI/CD(GitLab CI)也很好,但对于一些需要重度定制或与现有 Jenkins 生态集成的场景,我们更倾向于让专业的人做专业的事——GitLab 管好代码和协作,Jenkins 管好构建和部署。
  4. 成本与可控性:这套方案的核心组件都可以在自己的服务器上部署,所有数据、流程自主可控,适合对安全性和定制化要求较高的团队。

2.2 核心组件与数据流

整个流程的数据流可以概括为以下几步:

  1. 触发:开发者在 GitLab 上创建特性分支,完成开发后,向主干分支(如main或master)发起 Merge Request (MR)。
  2. 通知:GitLab 通过配置好的 Webhook,将 MR 创建、推送等事件实时通知给 Jenkins。
  3. 构建与测试:Jenkins 收到通知后,根据预设的流水线脚本(Jenkinsfile),拉取对应分支代码,在独立的 Docker Agent 中执行环境准备、依赖安装、代码编译、单元测试、静态代码分析等任务。
  4. 门禁与反馈:测试和检查的结果会反馈回 GitLab MR 界面。只有所有检查通过,MR 才允许被合并。这构成了质量关卡。
  5. 合并后部署:MR 被合并到主干分支后,GitLab 会再次通过 Webhook 触发 Jenkins 的另一条流水线,执行构建、打包(生成 Docker 镜像或可执行文件),并自动部署到对应的环境(如测试环境)。
  6. 生产发布:对于生产环境,我们通常采用手动触发或基于 Git Tag 触发的方式,进行更严格的部署流程,可能包括人工确认、蓝绿部署等策略。

注意:将构建环境(如 Node.js、JDK、Maven)封装在 Docker 容器中是关键一步。这保证了每次构建的环境绝对一致,避免了“在我机器上是好的”这类问题。我们为前端和后端分别准备了包含所需工具链的 Docker 镜像。

3. 环境准备与核心配置详解

“工欲善其事,必先利其器”。在编写第一行流水线脚本之前,扎实的基础环境配置是成功的一半。这里我会详细说明我们服务器的配置以及几个关键插件的安装。

3.1 服务器基础环境规划

我们使用一台单独的 Linux 服务器(Ubuntu 20.04 LTS)来承载 Jenkins。之所以独立部署,是为了避免资源竞争和相互影响。

  • 硬件:建议至少 4核 CPU,8GB 内存,50GB 存储。如果项目多、构建频繁,资源需要相应增加。
  • 软件:
    • Docker & Docker Compose:这是现代 CI/CD 的基石。Jenkins 本身以及构建 Agent 我们都通过 Docker 来运行和管理,非常方便。
    • Java:Jenkins 是基于 Java 的,需要安装 JDK(我们用的是 OpenJDK 11)。
    • Git:必备工具。
    • (可选)Nexus 3:用于搭建私有 Maven 仓库和 Docker 镜像仓库。我们将其部署在同一台服务器的另一个 Docker 容器中。

我们使用 Docker Compose 来管理 Jenkins 服务,下面是我们的docker-compose.yml核心部分:

version: '3.8' services: jenkins: image: jenkins/jenkins:lts-jdk11 container_name: jenkins user: root ports: - "8080:8080" - "50000:50000" volumes: - ./jenkins_home:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/bin/docker environment: - JAVA_OPTS=-Djenkins.install.runSetupWizard=false restart: unless-stopped

关键点解析:

  1. volumes映射:
    • ./jenkins_home:/var/jenkins_home:将 Jenkins 的数据目录挂载到宿主机,方便备份和迁移。
    • /var/run/docker.sock:/var/run/docker.sock和/usr/bin/docker:/usr/bin/docker:这是让 Jenkins 容器能够调用宿主机 Docker 命令的关键。这样,Jenkins 的 Pipeline 就可以在宿主机上启动 Docker 容器作为构建代理(Agent),也就是常说的 “Docker-out-of-Docker” (DooD) 模式。
  2. user: root:为了避免权限问题,我们直接以 root 用户运行容器。在生产环境中,可能需要更精细的权限控制。
  3. 首次启动后,需要进入容器执行docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword获取初始密码完成安装。

3.2 Jenkins 必备插件安装

Jenkins 初始化后,需要安装一些核心插件来支持我们的流水线。可以通过 Jenkins 管理界面中的“插件管理”来安装。

  • GitLab Plugin:用于接收 GitLab 的 Webhook 和触发构建,以及将构建状态回传到 GitLab。
  • Pipeline:提供 Pipeline 和 Jenkinsfile 支持。
  • Docker Pipeline:在 Pipeline 脚本中方便地使用 Docker 相关命令。
  • Blue Ocean(可选但推荐):提供更现代、可视化的流水线编辑和查看界面。
  • Role-based Authorization Strategy:如果需要复杂的用户权限管理。

3.3 GitLab Webhook 与 Jenkins 项目配置

这是连接两个系统的桥梁。配置顺序通常是:先在 Jenkins 创建项目并生成一个 token,然后在 GitLab 项目设置中配置 Webhook。

在 Jenkins 端:

  1. 创建一个新的“流水线”类型项目,命名为类似your-project-frontend-pipeline。
  2. 在“构建触发器”部分,勾选“Build when a change is pushed to GitLab...”。此时 Jenkins 会提供一个 URL(如http://your-jenkins-server:8080/project/your-project-frontend-pipeline)和一个随机生成的 token。
  3. 记录下这个 URL 和 token。

在 GitLab 端:

  1. 进入你的项目 -> Settings -> Webhooks。
  2. URL 填入上一步 Jenkins 提供的地址。
  3. Secret Token 填入上一步 Jenkins 生成的 token。
  4. 触发事件(Trigger)至少勾选:
    • Push events:代码推送时触发。
    • Merge request events:MR 创建、更新时触发。这是实现 MR 门禁的关键。
    • (可选)Tag push events:打标签时触发,常用于生产发布。
  5. 点击“Add webhook”,并可以点击“Test”进行测试,确保连接通畅。

实操心得:Webhook 配置失败最常见的原因是网络不通或 SSL 证书问题。如果 Jenkins 在内网,GitLab 在公网(如 GitLab.com),需要确保 GitLab 能访问到你的 Jenkins 服务器地址。对于 HTTPS 的 Jenkins,如果使用自签名证书,需要在 GitLab 的 Webhook 设置中暂时取消“Enable SSL verification”。在生产环境,建议使用有效的 SSL 证书。

4. 前后端项目 Jenkinsfile 实战编写

流水线的核心逻辑都定义在项目根目录的Jenkinsfile中。这个文件会被提交到代码仓库,实现“Pipeline as Code”。下面我将分别展示一个简化但完整的前端(Vue.js)和后端(Spring Boot)项目的 Jenkinsfile。

4.1 前端 Vue.js 项目流水线

前端流水线主要分为代码检查、构建打包、产物归档几个阶段。我们使用 Docker 提供纯净的 Node.js 环境。

pipeline { agent any // 初始代理,用于调度 triggers { // 由 GitLab webhook 触发,这里可以留空或定义定时触发 } environment { // 定义一些环境变量,如镜像仓库地址 DOCKER_REGISTRY = 'your-nexus-server:8083' PROJECT_NAME = 'your-frontend-app' DOCKER_IMAGE = "${DOCKER_REGISTRY}/${PROJECT_NAME}:${env.BRANCH_NAME}-${env.BUILD_NUMBER}" } stages { stage('代码检出') { steps { checkout scm // 检出 GitLab 触发构建时指定的分支和提交 } } stage('代码质量检查') { agent { docker { image 'node:16-alpine' // 使用轻量级 Node 镜像 args '-v $HOME/.npm:/root/.npm' // 缓存 npm 包,加速后续构建 reuseNode true } } steps { sh 'node --version' sh 'npm --version' // 安装依赖,利用缓存 sh 'npm ci --prefer-offline' // 运行 ESLint 代码检查 sh 'npm run lint' // 运行单元测试并生成覆盖率报告 sh 'npm run test:unit -- --coverage' // 可选:集成测试 // sh 'npm run test:e2e' } post { always { // 无论成功失败,都归档测试报告 junit '**/test-results/**/*.xml' publishHTML(target: [ reportDir: 'coverage', reportFiles: 'index.html', reportName: '单元测试覆盖率报告' ]) } } } stage('构建与打包') { agent { docker { image 'node:16-alpine' args '-v $HOME/.npm:/root/.npm' reuseNode true } } steps { // 执行构建,生成 dist 目录 sh 'npm run build' // 将构建产物暂存 stash name: 'dist-files', includes: 'dist/**/*' } } stage('构建 Docker 镜像') { agent any steps { // 取回构建产物 unstash 'dist-files' // 假设项目根目录有 Dockerfile script { docker.build("${DOCKER_IMAGE}") } } } stage('推送镜像') { agent any steps { script { // 登录私有镜像仓库 docker.withRegistry("http://${DOCKER_REGISTRY}", 'nexus-credentials') { docker.image("${DOCKER_IMAGE}").push() } } } } stage('部署到测试环境') { // 此阶段通常只在合并到主干分支后触发 when { branch 'main' // 或 master } agent any steps { script { // 使用 SSH 或 kubectl 等工具,在目标服务器上拉取新镜像并重启服务 // 例如:ssh user@test-server "docker pull ${DOCKER_IMAGE} && docker-compose up -d" echo "模拟部署到测试环境: ${DOCKER_IMAGE}" } } } } post { success { // 构建成功后,更新 GitLab Commit Status updateGitlabCommitStatus name: 'jenkins/build', state: 'success' } failure { updateGitlabCommitStatus name: 'jenkins/build', state: 'failed' } } }

关键点与避坑指南:

  1. npm civsnpm install:在 CI 环境中,强烈推荐使用npm ci。它严格根据package-lock.json安装依赖,能确保每次安装的版本完全一致,速度也更快。
  2. 缓存策略:通过-v $HOME/.npm:/root/.npm将 npm 全局缓存目录挂载到宿主机,可以极大加速依赖安装。对于 Docker,也可以使用--cache-from和--cache-to来缓存构建层。
  3. 环境变量管理:像镜像仓库密码、服务器 SSH 密钥等敏感信息,绝对不要硬编码在 Jenkinsfile 或代码中。务必使用 Jenkins 的“凭据管理”功能,在 Pipeline 中通过withCredentials绑定使用。
  4. 条件部署:使用when { branch 'main' }来控制部署阶段只在特定分支触发,避免每次特性分支构建都进行部署。

4.2 后端 Spring Boot 项目流水线

后端流水线更侧重于编译、单元测试、集成测试、打包和容器化。

pipeline { agent any environment { DOCKER_REGISTRY = 'your-nexus-server:8083' PROJECT_NAME = 'your-backend-service' // 使用 Maven 的版本号和构建号作为镜像标签的一部分 ARTIFACT_VERSION = sh(script: 'mvn help:evaluate -Dexpression=project.version -q -DforceStdout', returnStdout: true).trim() DOCKER_IMAGE = "${DOCKER_REGISTRY}/${PROJECT_NAME}:${ARTIFACT_VERSION}-${env.BUILD_NUMBER}" } stages { stage('代码检出') { steps { checkout scm } } stage('Maven 构建与测试') { agent { docker { image 'maven:3.8.6-openjdk-11-slim' args '-v $HOME/.m2:/root/.m2' // 缓存 Maven 仓库 reuseNode true } } steps { sh 'mvn --version' // 清理、编译、运行单元测试、打包 // -B 批处理模式, -DskipTests=false 确保运行测试 sh 'mvn clean compile test package -B' } post { always { // 归档单元测试报告 junit '**/target/surefire-reports/*.xml' // 归档 JaCoCo 代码覆盖率报告 jacoco( execPattern: '**/target/jacoco.exec', classPattern: '**/target/classes', sourcePattern: '**/src/main/java' ) } } } stage('静态代码分析 (SonarQube)') { agent { docker { image 'maven:3.8.6-openjdk-11-slim' args '-v $HOME/.m2:/root/.m2' reuseNode true } } steps { // 假设已配置 SonarQube Scanner for Maven withSonarQubeEnv('your-sonar-server') { // 在 Jenkins 中配置的 SonarQube 服务器名称 sh 'mvn sonar:sonar' } } } stage('构建 Docker 镜像') { agent any steps { script { // 使用项目中的 Dockerfile 构建镜像 // Dockerfile 通常需要将 target/*.jar 复制到镜像中 docker.build("${DOCKER_IMAGE}") } } } stage('推送镜像') { agent any steps { script { docker.withRegistry("http://${DOCKER_REGISTRY}", 'nexus-credentials') { docker.image("${DOCKER_IMAGE}").push() } } } } stage('部署到测试环境') { when { branch 'main' } agent any steps { script { // 示例:使用 SSH 在测试服务器上执行部署脚本 sshagent(['test-server-ssh-key']) { sh """ ssh -o StrictHostKeyChecking=no deploy-user@test-server \ "cd /opt/apps/${PROJECT_NAME} && \ docker-compose pull && \ docker-compose up -d" """ } } } } } post { // 质量门禁:等待 SonarQube 分析完成并检查质量状态 failure { updateGitlabCommitStatus name: 'jenkins/build', state: 'failed' } success { script { // 这是一个简化的示例,实际中可能需要使用 waitForQualityGate 步骤 def qg = waitForQualityGate() if (qg.status != 'OK') { error "SonarQube 质量门禁未通过: ${qg.status}" } updateGitlabCommitStatus name: 'jenkins/build', state: 'success' } } } }

后端流水线特别注意事项:

  1. Maven 缓存:-v $HOME/.m2:/root/.m2挂载 Maven 本地仓库至关重要,否则每次构建都会从中央仓库下载所有依赖,极其缓慢。
  2. 版本管理:我们通过 Maven 命令动态获取pom.xml中的项目版本号,并将其作为 Docker 镜像标签的一部分,实现了构建产物与代码版本的一一对应。
  3. 集成测试:对于需要数据库、消息队列等外部服务的集成测试,建议使用docker-compose在流水线中启动一个临时的、隔离的测试环境,运行测试后再销毁。这比依赖一个共享的、不稳定的测试环境要可靠得多。
  4. SonarQube 集成:静态代码分析是提升代码质量的有效手段。将其作为流水线的一个强制关卡,可以防止糟糕的代码合入主干。

5. 高级策略与优化实践

当基础流水线跑通后,可以考虑引入一些更高级的策略来提升流程的健壮性和效率。

5.1 多分支流水线与并行构建

对于拥有大量特性分支的团队,为每个分支手动创建 Jenkins 项目是不现实的。Jenkins 的Multibranch Pipeline项目类型可以自动为仓库中的每个分支或 Pull/Merge Request 创建一条流水线。

  1. 在 Jenkins 中创建“多分支流水线”项目。
  2. 配置源代码源为你的 GitLab 仓库。
  3. Jenkins 会自动扫描仓库的所有分支,并为每个有Jenkinsfile的分支创建独立的流水线任务。
  4. 对于 MR,Jenkins 会创建一个以PR-<编号>命名的临时分支流水线,非常适合做代码审查前的自动化验证。

并行构建优化:如果流水线中有多个独立的任务(例如,前端单元测试和后端单元测试之间没有依赖),可以使用parallel指令让它们同时执行,缩短整体反馈时间。

stage('并行测试') { parallel { stage('前端单元测试') { agent { docker { image 'node:16-alpine' } } steps { sh 'npm run test:unit' } } stage('后端单元测试') { agent { docker { image 'maven:3.8.6-openjdk-11-slim' } } steps { sh 'mvn test' } } } }

5.2 基于 Git Tag 的自动化生产发布

生产环境的部署我们通常希望更谨慎。一种常见的模式是基于 Git 标签(Tag)来触发。

  1. 在 Jenkinsfile 中添加一个阶段,用when { tag 'release-*' }或when { tag pattern: /^v\\d+\\.\\d+\\.\\d+$/, comparator: 'REGEXP' }来匹配特定的标签模式。
  2. 在 GitLab 中配置 Webhook,触发事件包含“Tag push events”。
  3. 开发流程:当代码经过测试环境验证,准备发布生产时,维护者在主干分支上打上一个符合规则的标签(如v1.2.0)。
  4. 自动触发:推送标签到 GitLab 后,Webhook 触发 Jenkins,执行专门的生产部署流水线。这个流水线可能包括:从 Nexus 拉取对应版本的镜像、执行数据库迁移脚本、切换负载均衡流量(蓝绿部署)、健康检查等。

5.3 构建缓存与性能调优

随着项目增大,构建时间会变长。优化缓存是提升效率的关键。

  • Docker 层缓存:确保 Dockerfile 编写合理,将不经常变动的层(如依赖安装)放在前面,经常变动的层(如复制源代码)放在后面。在 Jenkins 中,可以配置 Docker 构建使用--cache-from参数引用上一次构建的镜像作为缓存源。
  • 依赖缓存:如前所述,将~/.npm、~/.m2目录挂载到宿主机进行持久化。
  • 使用更快的镜像源:在 Dockerfile 或构建脚本中替换为国内的镜像源(如阿里云、腾讯云镜像),加速软件包下载。
  • 资源分配:确保 Jenkins Agent(尤其是 Docker 容器)有足够的 CPU 和内存。构建任务可以分配更多的资源。

6. 常见问题排查与维护心得

在落地过程中,我们遇到了不少问题,这里总结几个典型的和解决方法。

6.1 Webhook 触发失败

  • 症状:GitLab 上显示 Webhook 测试失败(如Failed to connect to server)。
  • 排查:
    1. 网络连通性:从 GitLab 服务器(或你的网络)尝试curlJenkins 的 Webhook URL,看是否能通。
    2. 防火墙:检查 Jenkins 服务器的防火墙是否开放了 8080 端口(或你配置的端口)。
    3. Jenkins 安全设置:检查 Jenkins 的“全局安全配置”,确保“匿名用户”具有“读取”权限,或者已正确配置 GitLab 的认证方式(如使用 GitLab API Token)。
    4. 反向代理:如果 Jenkins 前面有 Nginx 等反向代理,检查代理配置是否正确。

6.2 Docker 命令权限问题

  • 症状:Pipeline 中执行docker.build或docker.withRegistry时失败,报错Cannot connect to the Docker daemon。
  • 原因:Jenkins 容器内的用户(通常是jenkins)没有权限访问宿主机的 Docker 守护进程。
  • 解决:
    1. 如我们之前的docker-compose.yml所示,将宿主机的/var/run/docker.sock和/usr/bin/docker挂载到容器内。
    2. 确保 Jenkins 容器以root用户运行(最简单),或者将宿主机的docker用户组 ID 映射到容器内,并将 Jenkins 用户加入该组。

6.3 Pipeline 脚本在特定分支不执行

  • 症状:为main分支编写的部署阶段,在合并后没有触发。
  • 排查:
    1. 检查when { branch 'main' }条件是否写对。分支名是大小写敏感的。
    2. 检查触发这次构建的 Webhook 事件。合并事件后,GitLab 触发 Jenkins 时,携带的分支信息是main吗?可以在 Jenkins 的构建日志中查看env.BRANCH_NAME变量的值。
    3. 如果是多分支流水线,确保main分支的配置是正确的。

6.4 构建产物(镜像)版本管理混乱

  • 问题:每次构建都生成类似project:latest的镜像,无法追溯。
  • 最佳实践:
    • 永远不要使用latest标签用于生产环境。
    • 使用包含构建信息的标签,如${git commit hash 短码}、${项目版本}-${构建号}、${分支名}-${日期}。我们后端示例中使用的ARTIFACT_VERSION-${env.BUILD_NUMBER}就是一种好方法。
    • 在部署脚本中,明确指定要拉取和运行的镜像标签。

6.5 Jenkins 磁盘空间被占满

  • 原因:Jenkins 默认会保留每一次构建的工作空间和日志,Docker 构建也会产生大量中间镜像层。
  • 解决方案:
    1. 配置构建保留策略:在 Jenkins 项目配置中,设置“丢弃旧的构建”,例如只保留最近10次成功的构建和5次失败的构建。
    2. 定期清理 Docker:在 Jenkins 服务器上设置定时任务(Cron Job),定期执行docker system prune -f清理无用的镜像、容器和卷。注意:此命令会清理所有未被使用的资源,执行前请确认。
    3. 监控与告警:监控 Jenkins 服务器和 Docker 存储目录的磁盘使用率,设置告警阈值。

维护这套自动化系统本身也需要投入精力。我的建议是,将 Jenkins 的配置(包括插件列表、系统设置)也纳入版本控制(可以使用 Jenkins Configuration as Code 插件)。对于关键的 Pipeline 脚本(Jenkinsfile),一定要进行代码审查。定期回顾流水线的执行效率和稳定性,持续优化。自动化不是为了取代人,而是为了让开发者能更专注于创造性的工作,把重复、易错的任务交给机器。当看到代码提交后,一系列测试、构建、部署任务自动、有序地执行并成功完成时,那种确定性和顺畅感,就是对投入的最佳回报。

相关新闻

  • 2026年7月浙江无纺布袋批发/浙江无纺布袋行业靠谱厂家_华昊无纺布有限公司 - 行业平台推荐
  • Topit:终极macOS窗口置顶工具,彻底解决多窗口遮挡难题
  • 2026年7月上海瓦楞包装彩盒定制批发/上海礼品包装彩盒定制批发厂家推荐名单_上海纳物包装材料有限公司 - 品牌宣传支持者

最新新闻

  • 树莓派串口登录全攻略:硬件连接、系统配置与深度排错
  • 【awinic inside】触摸感知 视觉防抖 | 艾为全套方案助力心言巴布温情陪伴机器人!
  • 北京华恒智信破解建设国企权责错位推诿扯皮难题
  • AI开题报告工具测评与选择参考
  • LLM+RAG技术构建企业智能知识库实战
  • 2026 年 7 月新发布:茂县知名的不锈钢管销售厂家选哪家,用它装自来水30年不生锈?别再被建材店老板忽悠了!-万德金属制品 - 企业推荐管【认证】

日新闻

  • 终极TeamSpeak3音乐机器人搭建指南:5分钟实现语音聊天室音频播放
  • 广州海珠区内搬家攻略,平价靠谱搬家服务商推荐,专业打包搬运省心避坑全流程指南 - 厚道搬家
  • 大语言模型入门指南:从零到精通掌握AI核心技术的5大步骤

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号