无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成
在 DevOps 领域,自动化是主要目标之一。这包括自动化软件部署方式。与其依赖某人在部署软件的机器上进行 rsync/FTP/编写软件,不如使用 CI/CD 的概念。
CI,即持续集成,是通过代码提交创建工件的步骤。这可以是 Docker 镜像,使用 Git 仓库主分支中的提交进行部署。
CD,即持续部署/交付,是部署工件的步骤。这可以是任何操作,例如在机器上运行 docker pull 和 docker run 的部署系统,指示 AWS Lambda 将代码更新到 S3 存储桶中的最新代码,或者指示 Kubernetes 集群更新现有部署以使用新镜像。
在本文中,我将快速介绍如何设置触发 ArgoCD 的 Jenkins 流水线。ArgoCD 是一个基于 Git 仓库中的清单更新 Kubernetes 集群的 CD 工具。它可以部署标准 Kubernetes 清单,并使用 Kustomize 更新清单或 Helm 图表。
先决条件
要将 Jenkins 与 ArgoCD 结合使用,您需要执行以下操作:-
- 在 Jenkins 工作器/运行器上安装 argocd-cli
- 在 ArgoCD 中创建一个 Jenkins 部署角色,该角色有权更新应用程序
- 在基于 Git 的版本控制系统中,ArgoCD 可以访问一个或多个代码库(例如 GitHub、Gitlab、Gitea 或无前端的 Git)
- Jenkins 工作器/运行器需要能够通过 API 访问 ArgoCD,因此请确保设置了正确的防火墙规则
安装ArgoCD CLI
我们使用 Packer 为 Jenkins 工作器配置/准备镜像。因此,添加其他工具非常简单。但是,如果您运行的是静态工作器,则只需确保 argocd 二进制文件安装在 Jenkins 用户可运行的位置即可。例如:
$ pwd
/home/jenkins## Download the tool
$ curl -LO https://github.com/argoproj/argo-cd/releases/download/v1.2.0/argocd-linux-amd64 ## Move it to the /usr/local/bin
$ sudo mv argocd-linux-amd64 /usr/local/bin/argocd## Ensure it is exectutable
$ sudo chmod 755 /usr/local/bin/argocd## Check it works
$ argocd version
argocd: v1.2.0+674978cBuildDate: 2019-09-04T21:26:04ZGitCommit: 674978cd587701b39e81fce6d5c960b6d76d5882GitTreeState: cleanGoVersion: go1.12.6Compiler: gcPlatform: linux/amd64
argocd-server: v1.2.0+674978cBuildDate: 2019-09-04T21:27:17ZGitCommit: 674978cd587701b39e81fce6d5c960b6d76d5882GitTreeState: cleanGoVersion: go1.12.6Compiler: gcPlatform: linux/amd64Ksonnet Version: 0.13.1
ArgoCD Jenkins 部署角色
要在 ArgoCD 中创建部署角色,请转到 ArgoCD 仪表板,点击侧边栏上的齿轮图标(进入设置),然后转到“项目”。
在“项目中”,选择您的应用程序正在运行的项目。如果您尚未创建任何项目,则默认为“默认”。
在项目中,转到“角色”,然后点击“添加角色”。
在角色中,您可以为角色指定您想要的名称和描述,以便将来更容易理解其用途。您可以在此处应用细粒度的策略来定义 Jenkins 可以执行的操作(例如,仅创建、仅更新、仅同步现有应用程序)。或者,您可以授予其完全访问权限,但显然在生产环境中不建议这样做。)
完成上述所有操作后,您需要创建一个 JWT(JSON Web Token)。它用于对用户进行身份验证,确保只有客户端(在本例中为 Jenkins)才能承担此角色并使用其权限。这可以在 Web UI 中完成,也可以通过 CLI 完成。
要从 CLI 创建 JWT,您需要执行 argocd proj role create-token {PROJECT-NAME} {PROJECT-ROLE} 命令,示例如下:
$ argocd proj role create-token default jenkins-deploy-role
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpYXQiOjE1Njg3MjEyMjEsImlzcyI6ImFyZ29jZCIsIm5iZiI6MTU2ODcyMTIyMSwic3ViIjoicHJvajpkZWZhdWx0OmplbmtpbnMtZGVwbG95LXJvbGUifQ.UyXNZtdbDyllzGl7PbLPhMgqNMFE1oJqONaLHV8RK-k
将令牌添加到 Jenkins
要将令牌添加到 Jenkins 本身(以便在流水线中使用),首先转到您的 Jenkins 实例,然后在侧边栏上找到“凭据”,然后选择“系统”,再选择“全局凭据”。点击添加凭据,如下图所示。
允许ArgoCD 访问代码库
ArgoCD 需要访问的代码库是托管 Kubernetes 清单的代码库。您可以将清单与代码放在同一个代码库中,也可以将它们放在一个完全独立的代码库中。
您可以通过多种方式进行设置。您可以使用 SSH 或 HTTPS 连接到您的版本控制系统。我选择了 SSH。
再次转到 ArgoCD 的“设置”页面,但不要点击“项目”,而是点击“代码库”。在这里,点击“使用 SSH 连接代码库”。
ninjamac@192 ~ % ssh-keygen -o -f argocd-deploy -C "argocd@example.com"
Generating public/private ed25519 key pair.
Enter passphrase for "argocd-deploy" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in argocd-deploy
Your public key has been saved in argocd-deploy.pub
The key fingerprint is:
SHA256:nAuYAjALq9QIGII14J1vtjZfEboOQE4+Q985bu5BjuU argocd@example.com
The key's randomart image is:
+--[ED25519 256]--+
|@+o |
|O++.. |
|++ B . |
|o.* oo..o.. |
|. .*o=.BS. |
| .* O.o.. |
| * E.. |
| . B o |
| .= |
+----[SHA256]-----+
获取私钥(在本例中为 argocd-deploy)的内容,并将其粘贴到 ArgoCD 的 SSH 私钥数据字段中。提供 Kubernetes 清单所在仓库的 URL(如果您使用 HTTPS 连接,则为 HTTPS URL;如果使用 SSH 连接,则为 SSH URL)。
您需要公钥(在本例中为 argocd-deploy.pub)来在您选择的 Git 服务器中设置部署密钥。
防火墙规则
您的 Jenkins 工作器/运行器需要能够访问 ArgoCD API。我们将其暴露在 TCP:443 端口(即标准 HTTPS)上,因此您需要确保您的防火墙允许其通过。
Kubernetes 清单
如上所述,您可以使用标准 Kubernetes 清单、Kustomize 和/或 Helm 图表来部署您的应用程序。我使用 Kustomize 来更新 Kubernetes 部署中使用的 Docker 镜像哈希值。如果没有 Kustomize,即使您的 Docker 镜像仓库(私有或公共)中有新的镜像可用,部署也不会更新。
这是因为 Kubernetes API 认为部署没有发生变化。标签与以前相同,因此它不知道需要执行任何操作。
从 Kubernetes v1.15 版本开始,它们现在支持滚动重启。与 ImagePullPolicy: Always 结合使用,这将强制部署获取新镜像。
在 Kubernetes v1.15 之前的版本中,Deployment 永远不会更新。使用 :latest 并非最佳实践,因此引用实际哈希值可能是一个好主意。
清单示例
我最基本的 Kubernetes 清单如下:-
## ------------------- Debian Deployment ------------------- #kind: Deployment
apiVersion: apps/v1
metadata:labels:k8s-app: debian-testname: debian-test
spec:replicas: 1revisionHistoryLimit: 10selector:matchLabels:k8s-app: debian-testtemplate:metadata:labels:k8s-app: debian-testspec:containers:- name: debian-testimage: docker.io/rockwang415/k8s-debian-test:latest imagePullPolicy: Alwaysresources:requests:memory: "64Mi"cpu: "250m"limits:memory: "128Mi"cpu: "500m"ports:- containerPort: 80protocol: TCPlivenessProbe:httpGet:scheme: HTTPpath: /port: 80initialDelaySeconds: 30timeoutSeconds: 30---
## ------------------- Debian Service ------------------- #kind: Service
apiVersion: v1
metadata:labels:k8s-app: debian-testname: debian-test
spec:ports:- port: 80targetPort: 80type: NodePortselector:k8s-app: debian-test
我们使用 Docker 镜像仓库来存放镜像。如您所见,上面的镜像标签为 :latest。不过,我们也使用 Kustomize 来根据部署情况进行更改。我们的 kustomization.yaml 文件非常简单:-
resources:
- debian-test.yaml
从 v1.2.0 开始,ArgoCD 可以原生地利用 Kustomize(如果您指定了正确的参数),因此无需在此 YAML 文件中添加任何其他内容。
Jenkins Pipeline
现在所有先决条件都已满足,您已将 ArgoCD 连接到您的仓库并创建了清单,接下来您可以创建一个 Jenkinsfile 来部署应用程序。
pipeline {agent {node {label 'testing'}}stages { stage('Prepare') {steps {checkout([$class: 'GitSCM',branches: [[name: "origin/master"]],doGenerateSubmoduleConfigurations: false,submoduleCfg: [],userRemoteConfigs: [[url: 'ssh://git@git.example.com/argocd-test/argocd-test.git']]])}}stage('Docker_Build') {steps {// Build the Docker imagesh '''# Login to Docker registrydocker login -u <docker-username> -p <docker-password> <docker-registry-url># Build the imagedocker build . -t k8s-debian-test'''}}stage('Deploy_K8S') {steps {withCredentials([string(credentialsId: "jenkins-argocd-deploy", variable: 'ARGOCD_AUTH_TOKEN')]) {sh '''ARGOCD_SERVER="argocd-prod.example.com"APP_NAME="debian-test-k8s"CONTAINER="k8s-debian-test"REGION="eu-west-1"# Tag the docker imagedocker tag $CONTAINER:latest <docker-registry-url>/$CONTAINER:latest# Push the image to Docker registrydocker push <docker-registry-url>/$CONTAINER:latestIMAGE_DIGEST=$(docker image inspect <docker-registry-url>/$CONTAINER:latest -f '{{join .RepoDigests ","}}')# Customize image ARGOCD_SERVER=$ARGOCD_SERVER argocd --grpc-web app set $APP_NAME --kustomize-image $IMAGE_DIGEST# Deploy to ArgoCDARGOCD_SERVER=$ARGOCD_SERVER argocd --grpc-web app sync $APP_NAME --forceARGOCD_SERVER=$ARGOCD_SERVER argocd --grpc-web app wait $APP_NAME --timeout 600'''}}}}
}
docker hub 登录
这用于登录 docker hub,检索 Docker 镜像(例如,基础 Debian 镜像),然后根据我们的 Dockerfile 进行标记和推送。如果您使用的是标准镜像或您自己的私有镜像仓库,则可以忽略这些部分。
镜像摘要
由于某种原因,Docker 镜像摘要并不总是显示在 docker images --digests 中。相反,我们会检查最新推送到 docker hub的镜像,并检索 .RepoDigests 标签。这将提供以下内容:
ninjamac@192 ~ % docker image inspect rockwang415/k8s-debian-test -f '{{join .RepoDigests ","}}'
rockwang415/k8s-debian-test@sha256:b662d828445b39ac0a659ec77b629a75d1b298a6c76afdf5296cff64806fc638
ArgoCD
由于我们的 ArgoCD API 和仪表板位于 AWS 应用负载均衡器前端,我们目前在所有 ArgoCD 命令前都添加了 --grpc-web 前缀,例如 argocd --grpc-web app sync TEST --force。这是因为 AWS 应用负载均衡器默认不支持 GRPC。如果您在 ArgoCD 前端的负载均衡器/入口支持 GRPC,请从所有命令中移除该前缀。
自定义镜像
ARGOCD_SERVER=$ARGOCD_SERVER argocd --grpc-web app set $APP_NAME --kustomize-image $IMAGE_DIGEST
上述命令将 Kubernetes 清单中的镜像设置为生成的镜像摘要变量。由于 ArgoCD 默认支持 Kustomize,它可以自行操作清单。这意味着我们不会因为镜像标签始终不变而导致 Deployment 始终不更新。
这是一个非常棒的功能,意味着我们不需要像 ArgoCD 一样在 Jenkins 工作进程中同时运行 Kustomize 二进制文件。
同步应用程序
ARGOCD_SERVER=$ARGOCD_SERVER argocd --grpc-web app sync $APP_NAME --force
ARGOCD_SERVER=$ARGOCD_SERVER argocd --grpc-web app wait $APP_NAME --timeout 600
上述代码只是要求 ArgoCD 触发 Kubernetes 部署应用程序。在 ArgoCD 中,这将使用 Git 仓库中的 Manifest 文件,该文件已通过 Kustomize 更新以使用新的镜像标签。然后,它将根据 Jenkins 生成的镜像部署应用程序的新版本。
运行Jenkins Pipeline
下面是运行后的结果
Kubernetes Output
Pre-ArgoCD Run
kubectl get pods
NAME READY STATUS RESTARTS AGE
debian-test-8648f969ff-hrsvp 1/1 Running 0 4d22h
Post-ArgoCD Run
kubectl get pods
NAME READY STATUS RESTARTS AGE
debian-test-7664c648bb-sq6h7 1/1 Running 0 22s
Jenkins Console Output - ArgoCD
+ ARGOCD_SERVER=argocd-prod.example.com argocd \ --grpc-web app set debian-test-k8s \ --kustomize-image rockwang415/k8s-debian-test@sha256:###SHA256-IMAGE-HASH###+ ARGOCD_SERVER=argocd-prod.example.com argocd --grpc-web app sync debian-test-k8s --force
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
2025-05-017T13:05:27+00:00 apps Deployment default debian-test Synced Healthy
2025-05-017T13:05:27+00:00 Service default debian-test Synced Healthy
2025-05-017T13:05:27+00:00 apps Deployment default debian-test OutOfSync Healthy Name: debian-test-k8s
Project: default
Server: https://kubernetes.default.svc
Namespace: default
URL: https://argocd-prod.example.com/applications/debian-test-k8s
Repo: git@git.example.com:yeti/argocd-test.git
Target: HEAD
Path: yaml
Sync Policy: <none>
Sync Status: Synced to HEAD (f5f91ad)
Health Status: ProgressingOperation: Sync
Sync Revision: f5f91ad16296ecab90f337e5dbf3f4f927b61799
Phase: Succeeded
Start: 2025-05-01 13:05:27 +0000 UTC
Finished: 2025-05-01 13:05:29 +0000 UTC
Duration: 2s
Message: successfully synced (all tasks run)GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGEService default debian-test Synced Healthy service/debian-test unchanged
apps Deployment default debian-test Synced Progressing deployment.apps/debian-test configured
+ ARGOCD_SERVER=argocd-prod.example.com argocd --grpc-web app wait debian-test-k8s --timeout 600
TIMESTAMP GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGE
2025-05-01T13:05:29+00:00 Service default debian-test Synced Healthy service/debian-test unchanged
2025-05-01T13:05:29+00:00 apps Deployment default debian-test Synced Progressing deployment.apps/debian-test configuredName: debian-test-k8s
Project: default
Server: https://kubernetes.default.svc
Namespace: default
URL: https://argocd-prod.example.com/applications/debian-test-k8s
Repo: git@git.example.com:yetiops/argocd-test.git
Target: HEAD
Path: yaml
Sync Policy: <none>
Sync Status: Synced to HEAD (f5f91ad)
Health Status: HealthyOperation: Sync
Sync Revision: f5f91ad16296ecab90f337e5dbf3f4f927b61799
Phase: Succeeded
Start: 2025-05-01 13:05:27 +0000 UTC
Finished: 2025-05-01 13:05:29 +0000 UTC
Duration: 2s
Message: successfully synced (all tasks run)GROUP KIND NAMESPACE NAME STATUS HEALTH HOOK MESSAGEService default debian-test Synced Healthy service/debian-test unchanged
apps Deployment default debian-test Synced Healthy deployment.apps/debian-test configured
ArgoCD Dashboard
总结
我们为什么要使用 Jenkins 和 ArgoCD?Jenkins 非常擅长构建工件、整合代码提交,并接受来自 GitHub 或 GitLab 等平台的 Webhook 来启动作业。然而,ArgoCD 能够更好地控制镜像的部署方式,因为所有内容都可以在原生 Kubernetes 清单中描述。
这消除了将 Kubernetes 直接暴露给 Jenkins 的需要,也无需操作 kubectl 命令来部署(或使用额外的插件)。
ArgoCD 还为我们提供了部署进度的实时视图,以及在需要时可以回滚到的位置。它还以 Kubernetes 为中心(即部署和服务如何关联)的方式展示它们,因此开发人员和运维团队可以更轻松地了解所有内容是如何关联的。
相关文章:
无缝部署您的应用程序:将 Jenkins Pipelines 与 ArgoCD 集成
在 DevOps 领域,自动化是主要目标之一。这包括自动化软件部署方式。与其依赖某人在部署软件的机器上进行 rsync/FTP/编写软件,不如使用 CI/CD 的概念。 CI,即持续集成,是通过代码提交创建工件的步骤。这可以是 Docker 镜像&#…...
网络安全-等级保护(等保) 2-5-1 GB/T 25070—2019 附录B (资料性附录)第三级系统安全保护环境设计示例
################################################################################ 文档标记说明: 淡蓝色:时间顺序标记。 橙色:为网络安全标准要点。 引用斜体:为非本文件内容,个人注解说明。 加粗标记:…...
精准掌控张力动态,重构卷对卷工艺设计
一、MapleSim Web Handling Library仿真和虚拟调试解决方案 在柔性材料加工领域,卷对卷(Roll-to-Roll)工艺的效率与质量直接决定了产品竞争力。如何在高动态生产场景中实现张力稳定、减少断裂风险、优化加工速度,是行业长期面临的…...
怎么使用python进行PostgreSQL 数据库连接?
使用Python连接PostgreSQL数据库 在Python中连接PostgreSQL数据库,最常用的库是psycopg2。以下是详细的使用指南: 安装psycopg2 首先需要安装psycopg2库: pip install psycopg2 # 或者使用二进制版本(安装更快) pi…...
SQL Server权限设置的几种方法
SQL Server 的权限设置是数据库安全管理的核心,正确配置权限可以有效防止数据泄露、误操作和恶意篡改。下面详细介绍 SQL Server 权限设置的方法,涵盖从登录名创建到用户授权的完整流程。 一、权限设置的基本概念 SQL Server 的权限体系主要包括以下几…...
Neo4j(一) - Neo4j安装教程(Windows)
文章目录 前言一、JDK与Neo4j版本对应关系二、JDK11安装及配置1. JDK11下载2. 解压3. 配置环境变量3.1 打开系统属性设置3.2 新建系统环境变量3.3 编辑 PATH 环境变量3.4 验证环境变量是否配置成功 三、Neo4j安装(Windows)1. 下载并解压Neo4j安装包1.1 下…...
idea启用lombok
有lombok的项目在用idea打开的时候会提示启用lombok,但是。。。不小心就落下了...
uniapp婚纱预约小程序
uniapp婚纱预约小程序,这套设计bug很多,是一个半成品,一个客户让我修改,很多问题,页面显示不了,评论不能用,注册不能用,缺少表,最后稍微改一下,但是也有小问题…...
基于OpenCV的SIFT特征匹配指纹识别
文章目录 引言一、概述二、关键代码解析1. SIFT特征提取与匹配2. 指纹身份识别3. 姓名映射 三、使用示例四、技术分析五、完整代码六、总结 引言 指纹识别是生物特征识别技术中最常用的方法之一。本文将介绍如何使用Python和OpenCV实现一个简单的指纹识别系统,该系…...
Vue3 加快页面加载速度 使用CDN外部库的加载 提升页面打开速度 服务器分发
介绍 CDN(内容分发网络)通过全球分布的边缘节点,让用户从最近的服务器获取资源,减少网络延迟,显著提升JS、CSS等静态文件的加载速度。公共库(如Vue、React、Axios)托管在CDN上,减少…...
C++23:ranges::iota、ranges::shift_left和ranges::shift_right详解
文章目录 引言ranges::iota定义与功能使用场景代码示例 ranges::shift_left定义与功能使用场景代码示例 ranges::shift_right定义与功能使用场景代码示例 总结 引言 C23作为C编程语言的一个重要版本,为开发者带来了许多新的特性和改进。其中,ranges::io…...
Spring 框架中适配器模式的五大典型应用场景
Spring 框架中适配器模式的应用场景 在 Spring 框架中,适配器模式(Adapter Pattern)被广泛应用于将不同组件的接口转化为统一接口,从而实现组件间的无缝协作。以下是几个典型的应用场景: 1. HandlerAdapter - MVC 请…...
【Unity】 HTFramework框架(六十五)ScrollList滚动数据列表
更新日期:2025年5月16日。 Github 仓库:https://github.com/SaiTingHu/HTFramework Gitee 仓库:https://gitee.com/SaiTingHu/HTFramework 索引 一、ScrollList滚动数据列表二、使用ScrollList1.快捷创建ScrollList2.ScrollList的属性3.自定义…...
Android SwitchButton 使用详解:一个实际项目的完美实践
Android SwitchButton 使用详解:一个实际项目的完美实践 引言 在最近开发的 Android 项目中,我遇到了一个需要自定义样式开关控件的需求。经过多方比较,最终选择了功能强大且高度可定制的 SwitchButton 控件。本文将基于实际项目中的使用案…...
【C++ 基础数论】质数判断
质数判断 质数:对于所有大于 1 的自然数而言,如果该数除 1 和自身以外没有其它因数 / 约数,则该数被称为为质数,质数也叫素数。 如何判定一个数是否为质数呢? 一个简单的方法是 试除法 : 对于一个数 n&…...
【数据结构】手撕AVL树(万字详解)
目录 AVL树的概念为啥要有AVL树?概念 AVL树节点的定义AVL树的插入AVL树的旋转左单旋右单旋左右双旋右左双旋 AVL树的查找AVL树的验证end AVL树的概念 为啥要有AVL树? 在上一章节的二叉搜索树中,我们在插入节点的操作中。有可能一直往一边插…...
Chrome代理IP配置教程常见方式附问题解答
在网络隐私保护和跨境业务场景中,为浏览器配置代理IP已成为刚需。无论是访问地域限制内容、保障数据安全,还是管理多账号业务,掌握Chrome代理配置技巧都至关重要。本文详解三种主流代理设置方式,助你快速实现精准流量管控。 方式一…...
SpringBoot + Shiro + JWT 实现认证与授权完整方案实现
SpringBoot Shiro JWT 实现认证与授权完整方案 下面博主将详细介绍如何使用 SpringBoot 整合 Shiro 和 JWT 实现安全的认证授权系统,包含核心代码实现和最佳实践。 一、技术栈组成 技术组件- 作用版本要求SpringBoot基础框架2.7.xApache Shiro认证和授权核心1.…...
深入解析VPN技术原理:安全网络的护航者
在当今信息化迅速发展的时代,虚拟私人网络(VPN)技术成为了我们在互联网时代保护隐私和数据安全的重要工具。VPN通过为用户与网络之间建立一条加密的安全通道,确保了通讯的私密性与完整性。本文将深入解析VPN的技术原理、工作机制以…...
OceanBase 的系统变量、配置项和用户变量有何差异
在继续阅读本文之前,大家不妨先思考一下,数据库中“系统变量”、“用户变量”以及“配置项”这三者之间有何不同。如果感到有些模糊,那么本文将是您理清这些概念的好帮手。 很多用户在使用OceanBase数据库中的“配置项”和“系统变量”&#…...
ReinboT:通过强化学习增强机器人视觉-语言操控能力
25年5月来自浙大和西湖大学的论文“ReinboT: Amplifying Robot Visual-Language Manipulation with Reinforcement Learning”。 视觉-语言-动作 (VLA) 模型通过模仿学习在一般机器人决策任务中展现出巨大潜力。然而,训练数据的质量参差不齐通常会限制这些模型的性…...
MySQL联表查询:多表关联与嵌套查询指南
引言 各位数据库爱好者们好!今天我们要挑战MySQL查询技能的高阶关卡——复杂查询 🚀。在真实业务场景中,数据往往分散在多个表中,就像拼图的各个碎片,只有掌握了多表查询的"拼图技巧",才能将它们…...
QBasic 一款古老的编程语言在现代学习中的价值(附程序)
QBasic(Quick Beginner’s All-purpose Symbolic Instruction Code)是微软公司于 1991 年推出的一款简单易学的编程语言,作为BASIC语言的变种,它曾广泛应用于教育领域和初学者编程入门。尽管在当今Python、Java等现代编程语言主导…...
基于Backtrader库的均线策略实现与回测
本文将通过Python语言和强大的Backtrader库,详细介绍如何实现一个基于均线的简单交易策略,并进行历史数据的回测。将一步步构建这个策略,从数据获取、策略定义到回测结果分析,帮助你深入理解并掌握这一过程。 一、环境配置与库安装 1.1 安装必要的Python库 确保你已经安…...
Elasticsearch 分词与字段类型(keyword vs. text)面试题
Elasticsearch 分词与字段类型(keyword vs. text)面试题 🔍 目录 基础概念底层存储查询影响多字段聚合与排序分词器实战排查总结基础概念 💡 问题1:Elasticsearch 中的 keyword 和 text 类型有什么区别? 👉 查看参考答案 对比项keywordtext分词(Analysis)❌ 不进…...
Java 后端给前端传Long值,精度丢失的问题与解决
为什么后端 Long 类型 ID 要转为 String? 在前后端分离的开发中,Java 后端通常使用 Long 类型作为主键 ID(如雪花算法生成的 ID)。但如果直接将 Long 返回给前端,可能会导致前端精度丢失的问题,特别是在 J…...
【C++】 —— 笔试刷题day_29
一、排序子序列 题目解析 一个数组的连续子序列,如果这个子序列是非递增或者非递减的;这个连续的子序列就是排序子序列。 现在给定一个数组,然后然我们判断这个子序列可以划分成多少个排序子序列。 例如:1 2 3 2 2 1 可以划分成 …...
高光谱遥感图像处理之数据分类的fcm算法
基于模糊C均值聚类(FCM)的高光谱遥感图像分类MATLAB实现示例 %% FCM高光谱图像分类示例 clc; clear; close all;%% 数据加载与预处理 % 加载示例数据(此处使用公开数据集Indian Pines的简化版) load(indian_pines.mat); % 包含变…...
衡量 5G 和未来网络的安全性
大家读完觉得有帮助记得关注和点赞!!! 抽象 在当今日益互联和快节奏的数字生态系统中,移动网络(如 5G)和未来几代(如 6G)发挥着关键作用,必须被视为关键基础设施。确保其…...
【Vite】前端开发服务器的配置
定义一些开发服务器的行为和代理规则 服务器的基本配置 server: {host: true, // 监听所有网络地址port: 8081, // 使用8081端口open: true, // 启动时自动打开浏览器cors: true // 启用CORS跨域支持 } 代理配置 proxy: {/api: {target: https://…...
文章记单词 | 第85篇(六级)
一,单词释义 verb /vɜːrb/- n. 动词wave /weɪv/- v. 挥手;波动;挥舞 /n. 波浪;波;挥手add /d/- v. 增加;添加;补充说liberal /ˈlɪbərəl/- adj. 自由的;开明的;慷…...
通过实例讲解螺旋模型
目录 一、螺旋模型的核心概念 二、螺旋模型在电子商城系统开发中的应用示例 第 1 次螺旋:项目启动与风险初探...
(面试)Android各版本新特性
Android 6.0 (Marshmallow, API 23) 运行时权限管理:用户可在应用运行时动态授予或拒绝权限,取代安装时统一授权4。Doze模式与应用待机:优化后台耗电,延长设备续航5。指纹识别支持:原生API支持指纹身份验证。 Android…...
如何有效的开展接口自动化测试?
🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 一、简介 接口自动化测试是指使用自动化测试工具和脚本对软件系统中的接口进行测试的过程。其目的是在软件开发过程中,通过对接口的自动化测试来提高测…...
当 PyIceberg 和 DuckDB 遇见 AWS S3 Tables:打造 Serverless 数据湖“开源梦幻组合”
引言 在一些大数据分析场景比如电商大数据营销中,我们需要快速分析存储海量用户行为数据(如浏览、加购、下单),以进行用户行为分析,优化营销策略。传统方法依赖 Spark/Presto 集群或 Redshift 查询 S3 上的 Parquet/O…...
泰迪杯特等奖案例深度解析:基于MSER-CNN的商品图片字符检测与识别系统设计
(第四届泰迪杯数据挖掘挑战赛特等奖案例全流程拆解) 一、案例背景与核心挑战 1.1 行业痛点与场景需求 在电商平台中,商品图片常包含促销文字(如“3折起”“限时秒杀”),但部分商家采用隐蔽文字误导消费者(如“起”字极小或位于边角)。传统人工审核效率低(日均处理量…...
开发工具指南
后端运维场用工具 工具文档简介1panel安装指南运维管理面板网盘功能介绍网盘jenkins可以通过1panel 进行安装jpom辅助安装文档后端项目发布工具...
将 Element UI 表格元素导出为 Excel 文件(处理了多级表头和固定列导出的问题)
import { saveAs } from file-saver import XLSX from xlsx /*** 将 Element UI 表格元素导出为 Excel 文件* param {HTMLElement} el - 要导出的 Element UI 表格的 DOM 元素* param {string} filename - 导出的 Excel 文件的文件名(不包含扩展名)*/ ex…...
图像对比度调整(局域拉普拉斯滤波)
一、背景介绍 之前刷对比度相关调整算法,找到效果不错,使用局域拉普拉斯做图像对比度调整,尝试复现和整理了下相关代码。 二、实现流程 1、基本原理 对输入图像进行高斯金字塔拆分,对每层的每个像素都针对性处理,生产…...
【控制波形如何COPY并无痛使用】
控制波形如何COPY并无痛使用 波形分析思路概况记录波形 波形分析 通过逻辑分析仪可以解析到设备的控制波形,在一些对于电机控制类的设备上显得尤为重要。通过分析不同波形,将PWM的波形存储到程序中得以实现,并建立合理的数据结构。 思路概…...
CSDN-2024《AGP-Net: Adaptive Graph Prior Network for Image Denoising》
推荐深蓝学院的《深度神经网络加速:cuDNN 与 TensorRT》,课程面向就业,细致讲解CUDA运算的理论支撑与实践,学完可以系统化掌握CUDA基础编程知识以及TensorRT实战,并且能够利用GPU开发高性能、高并发的软件系统…...
使用IDEA开发Spark Maven应用程序【超详细教程】
一、创建项目 创建maven项目 二、修改pom.xml文件 创建好项目后,在pom.xml中改为: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w…...
深入探索MCP通信:构建高效的MCP Client
在现代软件开发中,高效的通信机制是构建复杂系统的关键。MCP(Model-Controller-Proxy)架构作为一种新兴的开发模式,提供了强大的工具来实现客户端与服务器之间的高效通信。本文将通过实际代码示例,详细探讨如何使用MCP…...
【第76例】IPD流程实战:华为业务流程架构BPA进化的4个阶段
目录 简介 第一个阶段,业务流程架构BPA1.0 第二个阶段,业务流程架构BPA2.0 BPA3.0、4.0 作者简介 简介 不管业务是复杂还是简单,企业内外的所有事情、所有业务都最终会归于流程。 甚至是大家经常说的所谓的各种方法论,具体的落脚点还是在流程上。 比如把大象放进冰…...
25-05-16计算机网络学习笔记Day1
深入剖析计算机网络:今日学习笔记总结 本系列博客源自作者在大二期末复习计算机网络时所记录笔记,看的视频资料是B站湖科大教书匠的计算机网络微课堂,每篇博客结尾附书写笔记(字丑见谅哈哈) 视频链接地址 一、计算机网络基础概念 …...
车道线检测----CLRNet
继续更新本系列,本文CLRNet,文章主要目的是弄懂论文关键部分,希望对文章细节有一个深刻的理解,有帮助的话,请收藏支持。 CLRNet:用于车道检测的跨层精炼网络 摘要 车道在智能车辆的视觉导航系统中至关重要…...
maven和npm区别是什么
这是一个很容易搞糊涂新手的问题,反正我刚开始从课堂的知识转向项目网站开发时,被这些问题弄得晕头转向,摸不着头脑,学的糊里糊涂,所以,写了这么久代码,也总结一下,为后来者传授下经…...
【SpringBoot】从零开始全面解析SpringMVC (二)
本篇博客给大家带来的是SpringBoot的知识点, 本篇是SpringBoot入门, 介绍SpringMVC相关知识. 🐎文章专栏: JavaEE进阶 🚀若有问题 评论区见 👉gitee链接: 薯条不要番茄酱 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条…...
Python连接redis
第一步安装redis Releases microsoftarchive/redis 安装时勾上所有能勾上的选项下一步即可 在CMD中pip install redis 安装redis pip install redis -i https://pypi.tuna.tsinghua.edu.cn/simple 配置redis 在redis安装目录下找到 修改 line 57 bind 0.0.0.0 line…...
Unity3D Overdraw性能优化详解
前端 在 Unity3D 开发中,Overdraw(过度绘制) 是一个常见的性能问题,尤其在移动端设备上可能导致严重的帧率下降。以下是关于 Overdraw 的详细解析和优化方法: 对惹,这里有一个游戏开发交流小组࿰…...