使用argo workflow 实现springboot 项目的CI、CD
文章目录
- 基础镜像制作
- 基础镜像
- 设置镜像源并安装工具git
- 下载和安装 Maven
- 设置环境变量
- 设置工作目录
- 默认命令
- 最终dockerfile
- 制作ci argo workflow 模版
- volumeClaimTemplates
- templates
- volumes
- 完整workflow文件
- 制作cd argo workflow 模版
- Workflow 结构
- Templates 定义
- 创建 Kubernetes 服务 (create-service)
- 启动 Spring Boot 容器 (springboot-container)
- 完整workflow内容
在实现 Spring Boot 项目的 CI/CD 流程时,可以使用 Argo Workflows 来自动化构建、测试和部署过程。Argo Workflows 是一个 Kubernetes 原生的工作流引擎,能够在 Kubernetes 集群中定义、运行、监控和管理复杂的工作流。
基础镜像制作
基础镜像
FROM openjdk:8-jdk-slim
这行指定了构建的基础镜像是 openjdk:8-jdk-slim
。这是一个包含了 Java 8 开发工具包(JDK)的精简版镜像,适用于 Java 开发和运行环境。
设置镜像源并安装工具git
RUN echo "deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list \&& apt-get update \&& apt-get install -y git wget tar \&& apt-get clean \&& rm -rf /var/lib/apt/lists/*
-
更改 apt 源:使用阿里云的 Debian 镜像源(bullseye),提高安装软件包时的速度和稳定性,尤其是在中国地区。
-
更新软件包索引:
apt-get update
更新包索引。 -
安装软件包:通过
apt-get install -y
安装 git(用于版本控制)、wget(用于下载文件)、和 tar(用于解压文件)。 -
清理缓存:使用
apt-get clean
清理下载缓存,减少镜像体积。然后,rm -rf /var/lib/apt/lists/*
删除 apt 包索引文件,进一步减小镜像体积。
下载和安装 Maven
RUN wget https://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.tar.gz -P /tmp || (echo "Maven download failed!" && exit 1)
- 下载 Maven:使用 wget 从阿里云镜像站点下载 Maven 3.8.6 的二进制压缩包。如果下载失败,将输出错误消息并终止构建。
RUN tar -xvzf /tmp/apache-maven-3.8.6-bin.tar.gz -C /usr/share/ \&& rm -f /tmp/apache-maven-3.8.6-bin.tar.gz \&& ln -s /usr/share/apache-maven-3.8.6/bin/mvn /usr/bin/mvn
-
解压 Maven:解压下载的 Maven 压缩包到
/usr/share/
目录。 -
清理临时文件:删除下载的压缩包。
-
创建符号链接:通过
ln -s
创建一个符号链接,将 Maven 的可执行文件 mvn 链接到/usr/bin/mvn
,使得 Maven 命令可以在任何地方使用。
设置环境变量
ENV MAVEN_HOME=/usr/share/apache-maven-3.8.6
ENV PATH=$MAVEN_HOME/bin:$PATH
MAVEN_HOME
:设置 Maven 的环境变量,指向解压后的 Maven 目录。更新 PATH
:将 Maven 的 bin 目录添加到 PATH 环境变量中,这样就可以直接在命令行使用 mvn 命令。
设置工作目录
WORKDIR /app
设置容器的工作目录为 /app
。所有后续的命令(如构建、运行程序)将会在该目录下执行。这个目录是你在容器中执行应用程序的默认位置。
默认命令
CMD ["bash"]
- 这个命令指定了容器启动时的默认命令是 bash。也就是说,如果你运行这个容器但没有指定其他命令,它将启动一个交互式的 bash shell。
最终dockerfile
FROM openjdk:8-jdk-slim# 使用 Debian 11 (bullseye) 的镜像源
RUN echo "deb https://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list \&& apt-get update \&& apt-get install -y git wget tar \&& apt-get clean \&& rm -rf /var/lib/apt/lists/*# 下载 Maven
RUN wget https://maven.aliyun.com/nexus/content/groups/public/org/apache/maven/apache-maven/3.8.6/apache-maven-3.8.6-bin.tar.gz -P /tmp || (echo "Maven download failed!" && exit 1)# 解压 Maven 并创建符号链接
RUN tar -xvzf /tmp/apache-maven-3.8.6-bin.tar.gz -C /usr/share/ \&& rm -f /tmp/apache-maven-3.8.6-bin.tar.gz \&& ln -s /usr/share/apache-maven-3.8.6/bin/mvn /usr/bin/mvn# 设置环境变量
ENV MAVEN_HOME=/usr/share/apache-maven-3.8.6
ENV PATH=$MAVEN_HOME/bin:$PATH# 设置工作目录
WORKDIR /app# 默认命令
CMD ["bash"]
执行构建:
docker build -t git-maven-base:v1 . -f Dockerfile
制作ci argo workflow 模版
volumeClaimTemplates
volumeClaimTemplates:- metadata:name: shared-workdirspec:accessModes: ["ReadWriteMany"]resources:requests:storage: 1Gi- metadata:name: maven-repo-cachespec:accessModes: [ "ReadWriteMany" ]resources:requests:storage: 2Gi
-
shared-workdir
: 这个 PVC 用于在工作流中的不同任务之间共享数据。它的存储请求为 1 GiB,并且支持ReadWriteMany
,意味着多个 pod 可以同时读写该存储。 -
maven-repo-cache
: 用于缓存 Maven 本地仓库的数据。它的存储请求为 2 GiB,同样支持ReadWriteMany
,可以在不同的 pod 之间共享缓存数据,避免每次构建时都重新下载依赖。
templates
在 templates 部分定义了多个步骤的模板,每个步骤会在不同的容器中执行。
main
模板
- name: maindag:tasks:- name: git-clonetemplate: git-clone- name: docker-buildtemplate: docker-builddependencies: [git-clone]
- dag:这里使用的是 DAG(有向无环图) 结构,
git-clone
任务是docker-build
的前置依赖(即 docker-build 需要在 git-clone 完成后才开始执行)。
git-clone
模板
- name: git-clonecontainer:image: git-maven-base:v1command: [sh, -c]args:- |git clone https://gitee.com/qfxcoffee/shield.git /srccd /src/arthas-study && mvn clean package -DskipTestscd /src/arthas-study/targetmv arthas-study.jar /src/arthas-study.jarmv /src/arthas-study/docker/Dockerfile /src/cp -r /src/. /mnt/ # 将文件复制到挂载的 PVC 中volumeMounts:- name: shared-workdirmountPath: /mnt # 挂载到容器的 /mnt 目录- name: maven-repo-cachemountPath: /root/.m2/repository # 挂载到 Maven 本地仓库路径
git-clone
任务使用一个 git-maven-base:v1 的镜像来执行 Git 克隆操作,并且使用 Maven 构建项目。
构建过程中,Maven 会将依赖缓存到 /root/.m2/repository
,并且将源码和构建产物(如 arthas-study.jar
和 Dockerfile
)复制到 /mnt
,这个路径会映射到共享的 PVC (shared-workdir),保证不同任务之间的数据共享。
docker-build
模板
- name: docker-buildcontainer:image: docker:19.03.12-dindcommand: [ "/bin/sh", "-c" ]args: ["docker info && cd /mnt && docker build -t my-image:v1 ."]volumeMounts:- name: shared-workdirmountPath: /mnt # 挂载到容器的 /mnt 目录- name: docker-socketmountPath: /var/run/docker.sock- name: maven-repo-cachemountPath: /root/.m2/repository # 挂载到 Maven 本地仓库路径
-
docker-build
任务使用docker:19.03.12-dind
镜像(Docker-in-Docker),这意味着可以在容器内执行 Docker 命令。它会进入挂载的 /mnt 目录,执行docker build
来构建 Docker 镜像。 -
挂载了
docker-socket
,这样容器可以与宿主机上的 Docker 服务进行通信,执行构建命令。
volumes
volumes:- name: docker-sockethostPath:path: /var/run/docker.socktype: Socket- name: maven-repo-cachehostPath:path: /root/.m2/repositorytype: Directory
-
docker-socket
: 宿主机上的 Docker 套接字 (/var/run/docker.sock
) 被挂载到容器中,使得容器能够访问宿主机的 Docker 引擎,从而执行 Docker 命令。 -
maven-repo-cache
: 这里挂载了宿主机上的/root/.m2/repository
目录到容器中,用于缓存 Maven 本地仓库。这意味着 Maven 任务在执行时会使用这个缓存,而不必每次都从远程仓库下载依赖,减少了构建时间。
hostPath
和 volumeClaimTemplates
中的 PVC 用法:
hostPath
通过指定宿主机上的目录或套接字,让容器能够访问宿主机的资源。
volumeClaimTemplates
则是在 Kubernetes
中动态创建 PVC
,并在 Pod
内部挂载这些 PVC
,使得多个任务之间可以共享文件和数据。
这两种挂载方式在某些场景下配合使用,可以提供灵活的数据共享和存储策略。
完整workflow文件
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:generateName: pvs-demo-
spec:entrypoint: mainvolumeClaimTemplates:- metadata:name: shared-workdir # 共享的 PVC 名称spec:accessModes: ["ReadWriteMany"] # 多个 Pod 可以同时读取和写入resources:requests:storage: 1Gi- metadata:name: maven-repo-cache # 用于缓存 Maven 本地仓库spec:accessModes: [ "ReadWriteMany" ]resources:requests:storage: 2Gitemplates:- name: maindag:tasks:- name: git-clonetemplate: git-clone- name: docker-buildtemplate: docker-builddependencies: [git-clone]- name: git-clonecontainer:image: git-maven-base:v1command: [sh, -c]args:- |git clone https://gitee.com/qfxcoffee/shield.git /srccd /src/arthas-study && mvn clean package -DskipTestscd /src/arthas-study/targetmv arthas-study.jar /src/arthas-study.jarmv /src/arthas-study/docker/Dockerfile /src/cp -r /src/. /mnt/ # 将文件复制到挂载的 PVC 中volumeMounts:- name: shared-workdir # 挂载 PVCmountPath: /mnt # 挂载到容器的 /mnt 目录- name: maven-repo-cachemountPath: /root/.m2/repository # 将 PVC 挂载到 Maven 本地仓库路径- name: docker-buildcontainer:image: docker:19.03.12-dindcommand: [ "/bin/sh", "-c" ]args: ["docker info && cd /mnt && docker build -t my-image:v1 ."]volumeMounts:- name: shared-workdir # 挂载共享 PVC,确保构建上下文可用mountPath: /mnt # 挂载到容器的 /mnt 目录- name: docker-socketmountPath: /var/run/docker.sock- name: maven-repo-cachemountPath: /root/.m2/repository # 将 PVC 挂载到 Maven 本地仓库路径volumes:- name: docker-sockethostPath:path: /var/run/docker.socktype: Socket- name: maven-repo-cachehostPath:path: /root/.m2/repository # 宿主机上的目录路径type: Directory # 可以是 Directory 或 File,取决于你的需求
可以看到maven构建及docker构建镜像成功
制作cd argo workflow 模版
Workflow 结构
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:generateName: springboot-service-workflow-
spec:entrypoint: springboot-workflow
-
apiVersion: argoproj.io/v1alpha1
和kind: Workflow
:这定义了这是一个Argo Workflow
类型的资源,表示这个文件用于定义一个工作流。 -
metadata.generateName: springboot-service-workflow-
:这个字段为工作流生成一个唯一的名称。generateName
表示Argo
会在每次创建工作流时,为该工作流添加一个随机的后缀,以确保工作流名称的唯一性。 -
spec.entrypoint: springboot-workflow
:指定工作流的入口点,即从哪个模板开始执行。在这个例子中,工作流会从springboot-workflow
模板开始执行。
Templates 定义
接下来的部分定义了工作流中的多个步骤 (steps),这些步骤会按顺序执行。
创建 Kubernetes 服务 (create-service)
- name: create-serviceresource:action: applymanifest: |apiVersion: v1kind: Servicemetadata:name: springboot-servicespec:selector:app: springboot-appports:- protocol: TCPport: 8080targetPort: 8080type: NodePort # 可以根据需要修改为 LoadBalancer 或 NodePort
- name: create-service:这个步骤的名称。
- resource:
- action: apply:表示使用 kubectl apply 命令应用 Kubernetes 资源,创建一个服务。
- manifest: 这是一个 Kubernetes Service 的 YAML 定义,描述了服务的配置。
- apiVersion: v1 和 kind: Service:表示这个资源是一个 Kubernetes 服务。
- metadata.name: springboot-service:服务的名称是 springboot-service。
- spec:
- selector: 用于选择应用的 Pod。这里的选择器选择标签为 app: springboot-app 的 Pod。
- ports: 定义服务的端口,服务监听 8080 端口,并将请求转发到目标端口 8080。
- type: NodePort:指定服务类型为 NodePort,这意味着服务将暴露在 Kubernetes 节点的一个端口上,便于从外部访问应用。你可以根据需要将其改为 LoadBalancer 或 ClusterIP,具体取决于你的网络需求。
- spec:
启动 Spring Boot 容器 (springboot-container)
- name: springboot-containercontainer:name: springboot-appimage: my-image:v1 # 替换成你的 Docker 镜像command: [ "java" ] # 显式指定命令为 `java`args: [ "-jar", "arthas-study.jar" ] # 显式指定 `arthas-study.jar` 文件作为参数ports:- containerPort: 8080env:- name: SPRING_PROFILES_ACTIVEvalue: "prod"metadata:labels:app: springboot-app
完整workflow内容
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:generateName: springboot-service-workflow-
spec:entrypoint: springboot-workflowtemplates:- name: springboot-workflowsteps:- - name: create-servicetemplate: create-service- - name: start-springboot-containertemplate: springboot-container- name: create-serviceresource:action: applymanifest: |apiVersion: v1kind: Servicemetadata:name: springboot-servicespec:selector:app: springboot-appports:- protocol: TCPport: 8080targetPort: 8080type: NodePort # 可以根据需要修改为 LoadBalancer 或 NodePort- name: springboot-containercontainer:name: springboot-appimage: my-image:v1 # 替换成你的 Docker 镜像command: [ "java" ] # 显式指定命令为 `java`args: [ "-jar", "arthas-study.jar" ] # 显式指定 `arthas-study.jar` 文件作为参数ports:- containerPort: 8080env:- name: SPRING_PROFILES_ACTIVEvalue: "prod"metadata:labels:app: springboot-app
可以看到springboot项目已经运行成功。
kubectl get svc -n argo
http://192.168.56.115:32356/user/1
相关文章:

使用argo workflow 实现springboot 项目的CI、CD
文章目录 基础镜像制作基础镜像设置镜像源并安装工具git下载和安装 Maven设置环境变量设置工作目录默认命令最终dockerfile 制作ci argo workflow 模版volumeClaimTemplatestemplatesvolumes完整workflow文件 制作cd argo workflow 模版Workflow 结构Templates 定义创建 Kubern…...

C++知识点总结(58):序列型动态规划
动态规划Ⅰ 一、基础1. 意义2. 序列 dp 解法 二、例题1. 最大子段和2. 删数最大子段和(数据强度:pro max)3. 最长上升子序列(数据强度:pro max)4. 3 或 5 的倍数序列5. 数码约数序列 一、基础 1. 意义 动…...

go interface(接口)使用
在 Go 语言中,接口(interface)是一种抽象类型,它定义了一组方法,但是不实现这些方法。接口指定了一个对象的行为,而不关心对象的具体实现。接口使得代码更加灵活和可扩展。 定义接口 接口使用 type 关键字…...

【docker】docker commit 命令 将当前容器的状态保存为一个新的镜像
在Docker容器中安装了许多软件,并希望将当前容器的状态保存为一个新的镜像,可以使用docker commit命令来创建一个新的镜像。以下是如何操作的步骤: 找到容器ID或名称: 首先,需要找到想要保存的容器的ID或名称。可以使用…...

使用 Java 中的 `String.format` 方法格式化字符串
前言 在编程过程中,我们经常需要创建格式化的字符串来满足特定的需求,比如生成用户友好的消息、构建报告或是输出调试信息。Java 提供了一个强大的工具——String.format 方法,它可以帮助我们轻松地完成这些任务。 String.format 方法简介 …...

图论最短路(floyed+ford)
Floyd 算法简介 Floyd 算法(也称为 Floyd-Warshall 算法)是一种动态规划算法,用于解决所有节点对之间的最短路径问题。它可以同时处理加权有向图和无向图,包括存在负权边的情况(只要没有负权环)。 核心思…...

BERT的中文问答系统39
实现当用户在GUI中输入问题(例如“刘邦”)且输出的答案被标记为不正确时,自动从百度百科中搜索相关内容并显示在GUI中的功能,我们需要对现有的代码进行一些修改。以下是完整的代码,包括对XihuaChatbotGUI类的修改以及新…...

从 Mac 远程控制 Windows:一站式配置与实践指南20241123
引言:跨平台操作的需求与挑战 随着办公场景的多样化,跨平台操作成为现代开发者和 IT 人员的刚需。从 Mac 系统远程控制 Windows,尤其是在同一局域网下,是一种高效解决方案。不仅能够灵活管理资源,还可以通过命令行简化…...

【Linux学习】【Ubuntu入门】1-5 ubuntu软件安装
1.使用sudo apt-get install vim:安装vim编辑器。 参考安装 安装时可能会遇到的问题 2.deb软件安装命令sudo dpkg -i xxx.deb 下载软件安装包时下载Linux版本,在Ubuntu中双击deb文件或者输入命令sudo dpkg -i xxx.deb,xxx.deb为安装包名称…...

如何自动下载和更新冰狐智能辅助?
冰狐智能辅助的版本更新非常快,如果设备多的话每次手工更新会非常麻烦,现在分享一种免费的自动下载和安装冰狐智能辅助的方法。 一、安装迅雷浏览器 安装迅雷浏览器1.19.0.4280版本,浏览器用于打开冰狐的官网,以便于从官网下载a…...

动态渲染页面爬取
我们可以直接使用模拟浏览器运行的方式来实现,这样就可以做到在浏览器中看到是什么样,抓取的源码就是什么样,也就是可见即可爬。这样我们就不用再去管网页内部的 JavaScript 用了什么算法渲染页面,不用管网页后台的 Ajax 接口到底…...

C++适配器模式之可插入适配器的实现模式和方法
可插入适配器与Adaptee的窄接口 在C适配器模式中,可插入适配器(Pluggable Adapter)是指适配器类的设计允许在运行时动态地插入不同的Adaptee对象,从而使适配器具有灵活性和可扩展性。这种设计使得适配器不仅限于适配一个特定的Ad…...

每日一练:【动态规划算法】斐波那契数列模型之第 N 个泰波那契数(easy)
1. 第 N 个泰波那契数(easy) 1. 题目链接:1137. 第 N 个泰波那契数 2. 题目描述 3.题目分析 这题我们要求第n个泰波那契Tn的值,很明显的使用动态规划算法。 4.动态规划算法流程 1. 状态表示: 根据题目的要求及公…...

Hash table类算法【leetcode】
哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素 那么哈希表能解决什么问题呢,一般哈希表都是用来快速判断一个元素是否出现集合里。 例如要查询一个名字是否在这所学校里。 要枚举的话时间复杂度是O(n),但如果使用哈希…...

windows实现VNC连接ubuntu22.04服务器
最近弄了一个700块钱的mini主机,刷了ubuntu22.04系统,然后想要在笔记本上通过VNC连接,这样就有了一个linux的开发环境。最后实现的过程为: 安装vnc服务器 安装 VNC 服务器软件: sudo apt update sudo apt install t…...

中国电信星辰大模型:软件工厂与文生视频技术的深度解析
在科技日新月异的今天,人工智能(AI)技术正以惊人的速度改变着我们的生活和工作方式。作为这一领域的领军企业之一,中国电信凭借其强大的研发实力和深厚的技术积累,推出了星辰大模型,旨在为用户带来更加智能、高效、便捷的服务体验。本文将重点介绍中国电信星辰大模型中的…...

项目实战:基于Vue3实现一个小相册
相册的示例效果图 注意看注释... 要实现图片的相册效果,图片命名可以像{img1.jpg,img2.jpg,img3.jpg}类似于这种的命名方式。 CSS部分: <style>/* 伪元素选择器,用于在具有clear_ele类的元素内部的末尾添加一个新的元素 */.clear_ele:…...

macOS安装nvm node
macOS安装nvm macOS安装nvm创建 nvm 工作目录配置环境变量使用 nvm查看可用的 Node.js 版本安装特定版本 macOS安装nvm brew install nvm创建 nvm 工作目录 mkdir ~/.nvm配置环境变量 vim ~/.zshrc# nvm export NVM_DIR"$HOME/.nvm" [ -s "/opt/homebrew/opt…...

解决整合Django与Jinja2兼容性的问题
提问 解决整合Django与Jinja2时遇到了一些兼容性问题。已经按照常规步骤在我的settings.py中配置了Jinja2作为模板引擎,同时保留了Django默认的模板设置。然而尝试同时使用Django和Jinja2时,系统报错提示我没有指定模板。如果我尝试移除Django的默认模板…...

Elasticsearch面试内容整理-高级特性
Elasticsearch 提供了一系列高级特性,这些特性可以极大地增强其搜索、分析和管理能力,使得它在大数据场景中表现出色。以下是 Elasticsearch 的一些重要高级特性: 近实时搜索(Near Real-Time Search) Elasticsearch 的一个关键特性是 近实时搜索(NRT),这意味着数据写入…...

linux通过手工删除文件卸载oracle 11g rac的具体步骤
在linux操作系统中,有些时候我们自己学习和测试会临时搭建的oracle rac。事情完成后,我们想回收资源,需要去卸载oracle rac。为了快速卸载oracle rac,今天我们介绍下如何通过手工删除文件的方式来完成工作(操作都需要在…...

【ArcGISPro】根据yaml构建原始Pro的conda环境
使用场景 我们不小心把原始arcgispro-py3的conda环境破坏了,我们就可以使用以下方法进行修复 查找文件 在arcgis目录下找到yaml文件 如果没找到请复制以下内容到新的yaml文件 channels: - esri - defaults dependencies: - anyio=4.2.0=py311haa95532_0 - appdirs=1.4.4=p…...

刷题笔记15
问题描述 小M和小F在玩飞行棋。游戏结束后,他们需要将桌上的飞行棋棋子分组整理好。现在有 N 个棋子,每个棋子上有一个数字序号。小M的目标是将这些棋子分成 M 组,每组恰好5个,并且组内棋子的序号相同。小M希望知道是否可以按照这…...

【LeetCode热题100】队列+宽搜
这篇博客是关于队列宽搜的几道题,主要包括N叉树的层序遍历、二叉树的锯齿形层序遍历、二叉树最大宽度、在每个数行中找最大值。 class Solution { public:vector<vector<int>> levelOrder(Node* root) {vector<vector<int>> ret;if(!root) …...

【阵列信号处理】相干信号和非相干信号生成
文章目录 一、总结二、知识点相干(coherent)和非相干(incoherent)信号相干信号生成代码 相关信号(correlated signal)相关信号生成代码 正交信号定义 本文记录博主的科研日记。如果对博主的其他文章感兴趣&…...

React 组件生命周期
React 组件生命周期 React 组件生命周期是React框架中一个核心概念,它描述了一个组件从创建到销毁的过程。理解组件生命周期对于高效开发React应用至关重要,因为它允许开发者在一个组件的不同阶段执行特定的逻辑。本文将详细介绍React组件的生命周期方法,并解释它们在组件的…...

Kylin Server V10 下基于Sentinel(哨兵)实现Redis高可用集群
一、什么是哨兵模式 Redis Sentinel 是一个分布式系统,为 Redis 提供高可用性解决方案。可以在一个架构中运行多个 Sentinel 进程(progress)这些进程使用流言协议(gossip protocols)来接收关于主服务器是否下线信息,并使用投票协议(agreement protocols)来决定是否执行…...

07-Making a Bar Chart with D3.js and SVG
课程链接 Curran的课程,通过 D3.js 的 scaleLinear, max, scaleBand, axisLeft, axisBottom,根据 .csv 文件生成一个横向柱状图。 【注】如果想造csv数据,可以使用通义千问,关于LinearScale与BandScale不懂的地方也可以在通义千…...

硅谷甄选前端项目环境配置笔记
此教程来自于尚硅谷 文章目录 **此教程来自于尚硅谷**硅谷甄选运营平台一、搭建后台管理系统模板1.1项目初始化1.1.1环境准备1.1.2初始化项目 1.2项目配置一、eslint配置1.1vue3环境代码校验插件1.2修改.eslintrc.cjs配置文件1.3.eslintignore忽略文件1.4运行脚本 二、配置**pr…...

6.7机器学习期末复习题
空间 样本空间 就是属性的所有可能情况,包括了一切可能出现或不可能出现的所有样本情况 版本空间&假设空间 假设空间就是在样本空间的基础上,给所有属性都加了一个通配符,表示任意即可;以及加上了一个空集,表示…...