Jenkins Docker构建代理:标准化CI/CD环境与容器化实践指南

news2026/4/30 18:07:09
1. 项目概述容器化构建代理的基石如果你在持续集成/持续交付CI/CD领域摸爬滚打过一段时间尤其是在使用 Jenkins 作为核心引擎那么你一定对构建代理Agent这个概念又爱又恨。爱的是它让 Jenkins 的分布式构建能力变得无比强大可以同时在多台机器上执行任务恨的是管理这些代理节点从环境准备、软件安装到版本维护每一步都可能是个“坑”。尤其是在需要多种构建环境比如不同版本的 JDK、Node.js、Python、Go 等的场景下维护一个“全能”的代理节点几乎是不可能的任务而维护多个专用节点又带来了巨大的运维成本。这就是jenkinsci/docker-agents项目诞生的背景。它不是一个独立的工具而是一个由 Jenkins 官方维护的 Docker 镜像集合。简单来说它预先打包了 Jenkins 构建代理所需的核心组件主要是 Java 环境和agent.jar并在此基础上衍生出了一系列针对不同编程语言和工具的“基础镜像”。你可以把它理解为一个“乐高积木”的底板基于这个底板你可以快速、标准化地搭建出各种你需要的构建环境。它的核心价值在于“标准化”和“声明式”。过去你可能需要写一长串的 Shell 脚本在代理节点上安装 JDK、Maven、Docker-in-DockerDinD等现在你只需要在 Jenkins Pipeline 的agent部分指定一个镜像标签比如jenkins/agent:latest-jdk11Jenkins 就会自动拉取这个镜像启动一个容器并在容器内执行你的构建步骤。所有的环境依赖都封装在镜像里确保了每次构建的环境都是一致的彻底告别了“在我机器上是好的”这类问题。这个项目主要面向几类人Jenkins 管理员他们希望简化代理节点的管理和供应CI/CD 流水线开发者他们需要快速、可靠地定义构建环境以及任何希望提升构建环境可移植性和可复现性的团队。接下来我们就深入拆解这个项目的设计思路、核心镜像以及如何在实际工作中用好它。2. 核心镜像家族与选型指南jenkinsci/docker-agents项目在 Docker Hub 上的组织是jenkins/agent。不要被jenkinsci这个 GitHub 组织名迷惑在 Docker Hub 上它的仓库名就是jenkins/agent。这个镜像家族有几个关键的“分支”理解它们的区别是正确选型的第一步。2.1 基础镜像jenkins/agent这是所有变体镜像的根基。它的核心使命只有一个提供一个能运行 Jenkins 构建代理即agent.jar或agent.js的最小化环境。它基于 Alpine Linux 或 Debian 等轻量级发行版预装了 OpenJDK因为 Jenkins 控制器和代理之间的通信需要 JNLP 协议而 JNLP 客户端是 Java 写的以及必要的工具如curl,git等。jenkins/agent:latest: 通常指向基于 Alpine Linux 的最新稳定版。体积小是大多数情况下的默认选择。jenkins/agent:alpine: 明确指定 Alpine 版本追求极致镜像体积。jenkins/agent:debian: 基于 Debian如果构建脚本中某些工具对 GNU libc 有强依赖或者 Alpine 的musl libc带来兼容性问题可以选择这个版本。jenkins/agent:jdk11,jenkins/agent:jdk17: 这些标签指明了镜像内预装的 OpenJDK 主版本。这一点至关重要即使你的构建任务不用 Java代理与 Jenkins 控制器的通信也需要 Java 运行时。选择与你的 Jenkins 控制器版本兼容的 JDK 版本是一个好习惯可以避免潜在的连接或序列化问题。注意jenkins/agent镜像本身不包含Maven、Gradle、Node.js、Python 等具体的构建工具。它只是一个“通信底座”。2.2 语言/工具特化镜像这才是docker-agents项目的威力所在。官方基于jenkins/agent镜像构建了一系列包含了常见开发栈的镜像。jenkins/agent:latest-jdk11: 这是最常用的标签之一。它在jenkins/agent:jdk11的基础上额外安装了 JDK 11。注意是 JDK包含编译工具javac而不仅仅是 JRE。如果你的流水线需要编译 Java 代码就应该选择带jdk标签的镜像。jenkins/agent:latest-jdk17: 同理基于 JDK 17。jenkins/agent:latest-python: 在基础代理镜像上安装了 Python。这对于需要运行 Python 脚本、进行 Ansible 部署或是一些 DevOps 工具链的流水线非常有用。其他变体社区还可能维护其他变体如包含 Node.js、Go 等。你需要查看 Docker Hub 上jenkins/agent仓库的标签列表来获取最新信息。选型决策流程确定通信基础你的 Jenkins 控制器版本是多少如果控制器是 2.4xx 且使用较新的 Remoting 协议选择jdk11或jdk17系列通常更安全。如果不确定选择latest或alpine-jdk11是稳妥的起点。确定构建环境你的构建步骤需要什么如果只是执行 Shell 脚本、调用 Docker那么基础镜像jenkins/agent:alpine就够了。如果需要编译 Java就选-jdk11。如果需要 Python 做脚本控制就选-python。考虑镜像体积与拉取速度Alpine 版本通常比 Debian 版本小几十 MB 到上百 MB。在云环境或网络带宽有限的情况下这个差异会影响流水线启动速度。在能满足兼容性的前提下优先选择 Alpine。考虑自定义扩展如果你需要的环境官方镜像没有提供比如需要特定版本的 Node.js 和 Chrome 来做前端测试那么最好的做法是以官方的jenkins/agent镜像作为基础镜像编写你自己的 Dockerfile 来构建定制镜像。这是标准且推荐的做法。2.3 镜像标签的“套娃”理解理解镜像的层次关系很重要。例如jenkins/agent:latest-jdk11的 Dockerfile 可能大致是这样的结构FROM jenkins/agent:jdk11 # 安装其他工具...而jenkins/agent:jdk11又是FROM openjdk:11-jdk-alpine # 安装 curl, git, 以及 jenkins agent 的启动脚本和 jar 包...所以当你使用latest-jdk11时你获得的是一个层层继承的标准化环境。这种设计保证了镜像构建的可维护性和一致性。3. 在流水线中声明与使用 Docker 代理理论说再多不如一行代码。在 Jenkins Pipeline声明式语法中使用这些镜像非常简单。核心就是在agent部分指定docker和对应的镜像标签。3.1 基础用法示例假设我们有一个简单的 Java Maven 项目需要在 JDK 11 环境下编译。pipeline { agent { docker { image jenkins/agent:latest-jdk11 // 可以指定额外的参数如运行用户、挂载卷等 args -u root:root // 通常不推荐直接使用 root这里仅为示例 } } stages { stage(Build) { steps { sh java -version sh mvn --version // 注意这个镜像默认没有安装 Maven } } } }运行这个流水线Jenkins 会执行以下操作检查工作节点可以是物理机、虚拟机或 Kubernetes Pod上是否有 Docker 环境。从 Docker Hub或配置的私有仓库拉取jenkins/agent:latest-jdk11镜像。启动一个基于该镜像的容器。将 Jenkins 的工作空间目录挂载到容器内的/home/jenkins/agent默认路径下。在容器内部启动 Jenkins 代理进程并连接到控制器。所有stage中的steps都将在这个容器内执行。这里暴露了一个关键问题上面的sh mvn --version命令会失败因为jenkins/agent:latest-jdk11镜像只包含了 JDK并没有包含 Maven。这引出了使用 Docker 代理的第一个最佳实践分清“环境提供者”和“工具执行者”。3.2 进阶用法工具安装与缓存策略官方镜像只提供最通用的语言运行时。像 Maven、Gradle、npm、pip 这些具体的构建工具通常需要在流水线中动态安装或者通过自定义镜像来预置。方案一在流水线步骤中安装适合工具版本多变或轻量级工具pipeline { agent { docker { image jenkins/agent:latest-jdk11 // 将宿主机的 Maven 仓库目录挂载到容器内避免重复下载依赖 args -v $HOME/.m2:/home/jenkins/.m2 } } stages { stage(Prepare Tools) { steps { // 在容器内安装 Maven sh wget https://archive.apache.org/dist/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz -P /tmp tar -xzf /tmp/apache-maven-3.8.8-bin.tar.gz -C /opt ln -s /opt/apache-maven-3.8.8 /opt/maven // 将 Maven 加入 PATH使其在后续步骤中生效 sh echo export PATH/opt/maven/bin:\\$PATH $HOME/.profile } } stage(Build) { steps { // 现在可以调用 mvn 命令了依赖包会缓存到挂载的宿主机目录中 sh mvn clean compile } } } }这种方式的优点是灵活可以精确控制每一条流水线使用的工具版本。缺点是每次构建都可能要经历下载和安装工具的过程即使有缓存解压和配置也会增加构建时间。方案二构建自定义 Docker 镜像推荐用于稳定、通用的环境这是更专业和高效的做法。你创建一个专属的 Dockerfile# 以官方代理镜像为基础 FROM jenkins/agent:latest-jdk11 # 以 root 用户安装软件 USER root # 安装 Maven RUN wget https://archive.apache.org/dist/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz -P /tmp \ tar -xzf /tmp/apache-maven-3.8.8-bin.tar.gz -C /opt \ ln -s /opt/apache-maven-3.8.8 /opt/maven \ rm /tmp/apache-maven-3.8.8-bin.tar.gz # 安装 Node.js (示例) RUN curl -fsSL https://deb.nodesource.com/setup_18.x | bash - \ apt-get install -y nodejs # 注意这是Debian系的命令Alpine需用apk # 配置环境变量 ENV MAVEN_HOME/opt/maven ENV PATH$MAVEN_HOME/bin:$PATH # 切换回 Jenkins 默认的非 root 用户重要 USER jenkins然后构建并推送到你的私有镜像仓库my-registry.com/my-team/maven-jdk11-agent:latest。在流水线中直接使用这个自定义镜像agent { docker { image my-registry.com/my-team/maven-jdk11-agent:latest args -v $HOME/.m2:/home/jenkins/.m2 -v $HOME/.npm:/home/jenkins/.npm } }这样一来流水线启动即拥有所有需要的工具构建速度最快环境也最一致。维护 Dockerfile 的责任从流水线开发者转移到了基础设施团队实现了关注点分离。3.3 关键参数与配置解析在docker指令的args字段中可以传递任何docker run支持的参数这提供了极大的灵活性。挂载卷 (-v): 这是最重要的参数之一。用于在容器和宿主机之间共享数据。-v $HOME/.m2:/home/jenkins/.m2缓存 Maven 依赖加速后续构建。-v /var/run/docker.sock:/var/run/docker.sock这就是著名的 Docker-outside-of-Docker (DooD) 模式让容器内的命令可以调用宿主机的 Docker 守护进程来构建或运行其他镜像。有安全风险需在受信环境使用。-v /usr/bin/docker:/usr/bin/docker配合上一条将宿主机 Docker CLI 也挂载进去。环境变量 (-e): 向容器内传递配置。args -e MAVEN_OPTS\-Xmx512m\为 Maven 设置 JVM 参数。用户 (-u): 指定容器内执行命令的用户。官方jenkins/agent镜像创建了一个jenkins用户UID 1000。为了文件权限一致通常建议保持使用这个用户。如果挂载了宿主机目录需要确保宿主机上该目录对 UID 1000 有读写权限。工作目录 (-w): 可以覆盖容器内的工作目录但通常不需要Jenkins 会自动处理好。网络 (--network): 例如args --network host让容器使用宿主机网络在某些需要访问本地服务的场景下有用。4. 架构深入Docker Agent 如何与 Jenkins 协同工作要玩转 Docker Agent不能只停留在配置层面还需要理解其背后的工作原理。这能帮助你在出现问题时快速定位。4.1 连接模式JNLP vs Sidecar当你在流水线中声明agent { docker { ... } }时Jenkins 主要采用两种方式让容器内的代理与控制器建立连接JNLP 容器连接传统方式Jenkins 控制器通过 Docker API 在指定的节点需安装 Docker 并配置了 Cloud上启动一个容器。控制器生成一个一次性的 JNLPJava Web Start连接密钥。容器启动时会执行一个入口点脚本通常是jenkins-agent该脚本会使用这个密钥通过 TCP 连接回 Jenkins 控制器。这种方式下容器是作为 Jenkins 的一个“常驻”代理节点在运行直到流水线结束才会被销毁。它需要网络能够从容器的内部访问到 Jenkins 控制器的 TCP 端口默认 50000。Sidecar 容器连接在 Kubernetes 或 Docker Pipeline 插件中常见这种方式更多用于kubernetes类型的 agent。它会启动两个容器一个是你指定的jenkins/agent镜像称为 Sidecar另一个是真正的“工作容器”jnlp容器。jnlp容器负责与 Jenkins 控制器建立连接而你的构建步骤则在 Sidecar 容器中执行。两个容器共享一个 Pod或工作空间卷。对于纯 Docker 场景我们通常接触的是第一种 JNLP 连接。理解这个连接过程很重要如果流水线卡在Waiting for next available executor或者Agent is connecting...很可能就是网络问题导致容器内的代理无法连接到 Jenkins 控制器。你需要检查 Jenkins 控制器的“代理 TCP 端口”是否开放以及运行 Docker 容器的宿主机防火墙规则。4.2 文件系统与工作空间Jenkins 默认会将工作空间workspace目录挂载到容器内的/home/jenkins/agent目录。所有你的checkout scm和生成的文件都位于这个挂载的目录下。这意味着数据持久化当容器销毁后工作空间的内容仍然保留在 Jenkins 节点上。速度因为使用的是宿主机文件系统I/O 速度通常比容器内层叠的文件系统要快。权限务必确保容器内执行命令的用户默认jenkins UID 1000对这个挂载的目录有读写权限。如果流水线步骤中创建了文件但后续步骤或另一个容器无法读取多半是权限问题。在args中使用-u root可以粗暴解决但违背了最小权限原则。更好的做法是在构建脚本内妥善处理文件权限或者确保宿主机上工作空间目录的属主是 UID 1000。4.3 资源限制与调度在args中你也可以使用 Docker 的资源限制参数agent { docker { image jenkins/agent:latest-jdk11 args --cpus 2 --memory 4g --memory-swap 4g } }这能防止单个构建任务消耗掉整个节点的资源对于共享的 Jenkins 环境尤为重要。你需要根据构建任务的实际需求如编译大型项目、运行集成测试来合理设置这些限制。5. 实战避坑与高级技巧纸上得来终觉浅绝知此事要躬行。下面分享一些我在大规模使用 Docker Agent 过程中积累的实战经验和踩过的坑。5.1 镜像拉取慢与优化策略流水线启动时拉取镜像可能是最耗时的环节尤其是首次使用或镜像较大时。使用私有镜像仓库并配置镜像缓存在 Jenkins 节点所在的机器上部署一个私有镜像仓库如 Harbor, Nexus Repository并配置 Docker Daemon 的registry-mirrors。让节点优先从内网拉取镜像。对于jenkins/agent这类基础镜像可以在内网仓库中定期同步。构建精简的自定义镜像在自定义 Dockerfile 中遵循最佳实践合并RUN指令减少镜像层。及时清理 apt 或 apk 的缓存文件rm -rf /var/lib/apt/lists/*。使用.dockerignore文件避免将不必要的上下文文件发送到 Docker 守护进程。考虑使用多阶段构建只将运行时必要的文件复制到最终镜像。在节点上预拉取镜像通过定时任务或初始化脚本在 Jenkins 节点启动时预先拉取常用的基础镜像如jenkins/agent:alpine-jdk11,maven:3.8-openjdk-11等。5.2 常见问题排查实录问题一流水线启动失败报错Cannot connect to the Docker daemon...现象在日志中看到 Docker 命令执行失败。排查确认运行流水线的 Jenkins 节点或执行者上安装了 Docker 引擎。确认运行 Jenkins 进程的用户通常是jenkins有权限访问 Docker 守护进程的 Unix Socket/var/run/docker.sock。通常需要将jenkins用户加入docker用户组sudo usermod -aG docker jenkins并重启 Jenkins 服务。如果 Jenkins 本身运行在容器中即 Jenkins in Docker那么需要将宿主机的 Docker Socket 挂载到 Jenkins 容器内并且 Jenkins 容器内的用户 ID 需要有权访问它。这是一个更复杂的设置。问题二构建步骤中无法访问网络如下载依赖失败现象npm install或go get超时失败但宿主机网络正常。排查Docker 容器默认使用桥接网络。检查容器的 DNS 配置是否正常。可以在流水线中加一个sh cat /etc/resolv.conf步骤看看。如果公司有网络代理需要在启动 Docker 容器时通过-e参数传入代理环境变量例如args -e HTTP_PROXYhttp://proxy.company.com:8080 -e HTTPS_PROXYhttp://proxy.company.com:8080。也可以直接在自定义的 Dockerfile 中配置代理。问题三容器内生成的文件在流水线结束后无法归档现象使用archiveArtifacts步骤时找不到在容器内生成的文件。排查确保文件生成在 Jenkins 的工作空间内。工作空间被挂载到容器内的/home/jenkins/agent或$WORKSPACE环境变量指向的路径。所有需要持久化的构建产物都必须放在这个目录或它的子目录下。使用绝对路径或相对于$WORKSPACE的路径来指定归档模式例如archiveArtifacts artifacts: target/*.jar, fingerprint: true。问题四docker build命令在 Docker Agent 中执行缓慢现象在流水线中使用sh docker build .构建镜像速度极慢。原因与解决这通常是因为你使用了 Docker-outside-of-Docker (DooD) 模式挂载了/var/run/docker.sock。Docker 构建的上下文通常是整个工作空间需要从容器内通过挂载的 Socket 传输给宿主机 Docker 守护进程产生额外开销。方案A推荐使用docker buildx或 Kaniko 等无需 Docker 守护进程的镜像构建工具。它们可以直接在容器内运行性能更好安全性更高。方案B如果必须用 DooD尽量使用.dockerignore文件来减少构建上下文的大小。5.3 安全最佳实践避免使用 root 用户官方jenkins/agent镜像默认使用jenkins用户非 root。在你的自定义 Dockerfile 和流水线args中尽量保持使用这个用户。如果某些安装步骤需要 root 权限可以在 Dockerfile 中用USER root切换在安装完成后务必再USER jenkins切换回来。谨慎挂载 Docker Socket-v /var/run/docker.sock:/var/run/docker.sock赋予了容器几乎与宿主机同等的权限。仅在对 Jenkins 流水线和节点有完全控制权的可信环境中使用。考虑使用更安全的替代方案如前面提到的docker buildx、Kaniko或为 Docker Daemon 配置 TLS 认证。定期更新基础镜像定期重建你的自定义镜像以获取jenkins/agent基础镜像中的安全更新。可以在 Dockerfile 中使用固定版本标签而非latest以便于控制更新节奏。扫描镜像漏洞将自定义的构建代理镜像纳入公司的容器安全扫描流程定期检查其中的已知漏洞。6. 从 Docker Agent 到 Kubernetes自然的演进当你熟悉了 Docker Agent 之后你会发现它的模式在 Kubernetes 上得到了更原生、更强大的实现。Jenkins 的 Kubernetes 插件允许你直接将 Pod 模板定义为构建代理。在 Pod 模板中你可以指定多个容器Sidecar每个容器可以是一个不同的 Docker 镜像比如一个容器跑 Java 构建另一个容器跑数据库做集成测试。此时jenkins/agent镜像的角色就变成了 Kubernetes Pod 中的那个“JNLP”容器负责连接 Jenkins而你的构建任务则在同一个 Pod 里的其他特化容器中执行。这种架构提供了极致的资源利用率和环境隔离性。因此掌握jenkinsci/docker-agents不仅是用好 Jenkins Docker 插件的关键也是未来向云原生 CI/CD 架构基于 Kubernetes迈进的一块重要基石。它教会你如何用容器来定义和封装构建环境这是一种思想而不仅仅是某个工具的使用技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2554747.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…