使用GitHub Actions构建CI/CD流程
GitHub Actions 简介
GitHub Actions 是一种自动化软件开发工作流的方式,与 GitHub.com 深度集成。开发人员可以通过配置 GitHub Actions 来实现基于事件触发的自动工作流,比如,当有任意用户向 master
分支提交代码时,自动执行一遍完整的单元测试流程等。在本文中,我们展示如何通过配置 GitHub Actions 实现 CI/CD 流程。
来自 GitHub Docs 的插图,展示了 GitHub Actions 是基于事件(Event)触发的自动化工作流的抽象
CI/CD,即持续集成(Continuous Integration)、持续部署(Continuous Deployment)与持续交付(Continuous Delivery),是一种更好地交付高质量软件的工作流程。尤其对于个人和小型开发者而言,从项目初期开始即注重软件的交付方式和质量,对于提升开发者本身以及用户的体验而言帮助甚大。
Why not Jenkins:基于一般习惯,我们可能更愿意使用 Jenkins 等工具协助搭建 CI/CD 流程。但在使用体验 GitHub Actions 的过程中,我们发现无论是从配置文件的简明程度以及部署和使用的易用性来说,我们更愿意推荐 GitHub Actions 作为在 GitHub.com 上托管项目的 CI/CD 框架。
明确需求
本文中,我们计划使用 GitHub Actions 搭建具有如下特性的自动工作流程:
- 在每个分支提交代码时,均对代码执行一遍预先定义好的单元测试
- 提供一个“发布到”按钮,以将主分支(
master
)上的代码部署到测试/生产环境 - 代码部署在本地私有服务器(而非 GitHub.com 上的服务器)执行
我们的示例代码位于:https://github.com/DGideas/github-actions-cicd-example
.github/workflows
要使用 GitHub Actions,我们需要在项目的 .github/workflows
文件夹中通过添加描述文件的方式定义相关的工作流程。GitHub Actions 使用 .yaml
格式的描述文件。简言之,每个工作流程通过如下方式进行描述:
- 在何时触发?
- 每当有代码提交时(
push
)、新的 Pull Request 创建时(pull_request
)、当其他用户星标项目时(star
),或者单纯是每隔一段时间(schedule
)等 - 完整的可供触发的时间列表可以在这里看到
- 每当有代码提交时(
- 在哪里执行?
- 是在 GitHub.com 提供的临时虚拟环境里执行,还是在自己本地的私有服务器上执行代码
- 做什么事情?
- 通过
.yaml
描述文件的方式,指示当任意事件发生时要完成的事情是什么:运行单元测试,或者给某个邮箱发一封电子邮件
- 通过
比如,在任意用户为项目提交代码时,一个基于 Python 的项目的自动执行单元测试配置可能是这样的:
name: CI
on: pushjobs:ci:runs-on: ubuntu-lateststeps:- name: Checkout reporun: |rm -rf ${{github.event.repository.name}}git clone https://${{github.repository_owner}}:${{github.token}}@github.com/${{github.repository}}git -C "${{github.workspace}}/${{github.event.repository.name}}" checkout ${{github.ref}}- name: Python unittestrun: |python3 -m venv venvsource venv/bin/activatecd ${{github.event.repository.name}}pip3 install -r requirements.txtpre-commit run -apython3 -m unittest discover -v- name: Cleanuprun: |rm -rf venvrm -rf ${{github.event.repository.name}}
我们将上述文件提交到项目 .github/workflows/ci.yml
中。
在上述示例中,每当用户向项目的任意分支推送代码时,GitHub Actions 会创建一个运行最新稳定发行版的 Ubuntu 系统的虚拟机,然后在其上运行我们预定义好的操作:检出(checkout
)代码、运行单元测试并进行清理操作。清理操作不是必要的,因为由 GitHub.com 托管的虚拟机会在每次执行完任务后自动销毁,但是如果我们在自己托管的本地服务器上运行代码,则每次执行完毕后的清理是有必要的。
配置好 GitHub Actions 后,每个提交后都会附带 GitHub Actions 脚本的执行状态
点击 “Details” 按钮,还可以看到定义的工作流的具体执行情况:
GitHub Actions 页面显示每一次工作流的具体执行情况。如果某个提交为单元测试带来了问题,则可以从这个页面看到具体发生的问题
GitHub Actions 通过获取执行命令的返回值来判断任务是否成功,特别地,在执行命令期间,GitHub Actions 会设置一系列系统环境变量(如 CI
),一些开发组件可能依赖这些环境变量,以执行不同的行为。
GitHub Actions 接受的完整配置文件语法请见此处。
自己托管主机
在上述示例中,我们使用了来自 GitHub.com 托管的执行器执行 GitHub Actions,但在诸如“将代码发布到服务器”这种场景中,我们需要在自己的主机上执行相应代码。这需要我们将自己的主机添加到 GitHub Actions 中:
- 在项目“设置”(Settings)中,点选左侧“Actions”,然后选择“Runners”
- 点击右上角的“New self-hosted runner”,然后选择操作系统,按照提示安装 GitHub Actions Runner 到本地服务器上
- 安装过程中,我们需要为本地服务器上的 Runner 进行命名,并添加一系列可选的标签(Labels)。这些标签描述了一组具有相似特征的服务器(如生产环境服务器集群)。
对上述示例(ci.yml
)中的配置文件稍作修改,我们即可在自己托管的服务器集群上运行单元测试用例:
# ...
jobs:ci:strategy:matrix:servers: [ubuntu-latest, macos-latest]runs-on: ${{matrix.servers}}steps:
# ...
我们使用 matrix
配置项指示上述 Actions 将在多个服务器上同时执行。这些自我托管的服务器可能安装有不同的操作系统,或具有不同的软件环境,以在多种不同的系统环境下运行单元测试代码。
来自 GitHub.com 的一张截图,展示了在多个主机上同时执行脚本的方法
接收用户输入
有时我们需要用户主动触发一个脚本,并输入一些执行关键信息。比如,用户可能需要将某个特定分支的代码部署到指定服务器上。我们可以通过 inputs
配置项创建输入表单:
name: 线上部署代码
on:workflow_dispatch:inputs:branchname:description: '请输入要部署的分支名称:'required: truedefault: 'release'
jobs:
# ...
workflow_dispatch
触发器当且仅当用户通过 GitHub.com 的项目页面进入 Actions 控制面板后,手动运行某个任务时触发:
通过手动方式运行 GitHub Actions 的方式,在运行特定任务时,可以要求用户通过表单输入任务关键信息
在 .yaml
配置文件中,可以通过 ${{github.event.inputs.branchname}}
的方式在任何位置使用用户对于 branchname
配置项的输入值:
# ...
run: |git -C "${{github.workspace}}/${{github.event.repository.name}}" checkout ${{github.event.inputs.branchname}}
# ...
我们同样提供了一个“持续发布”配置文件示例,可以在此处查看。
需要注意的一点是,由于 GitHub Actions Runner 在本地服务器中以独立的用户运行,如果需要更改服务器中的其他文件,可能需要为这些文件或文件夹赋予适当的访问权限,并且可能使用到诸如 setfacl
等命令。
管理秘密变量
在上述 deployment.yml
示例中,每当用户部署成功代码后,我们都会在 Actions 中调用 dawidd6/action-send-mail@v3
以发送电子邮件:
# ...- name: Send mailuses: dawidd6/action-send-mail@v3with:server_address: smtp.example.comserver_port: 587username: ${{secrets.MAIL_USERNAME}}password: ${{secrets.MAIL_PASSWORD}}
# ...
在 Actions 的每一个执行步骤中使用 uses
而非 run
,可以直接复用他人编写的 Actions 而无需重复编写类似命令。如在此示例中,我们使用了 @dawidd6
编写的邮件发送脚本发送电子邮件。我们将发送电子邮件所需的参数通过 with
子句的方式传入到 Actions 中。
细心的读者可能会发现,诸如电子邮箱用户名与密码等信息属于敏感信息,不应该出现在 git 代码库的提交中。GitHub Actions 通过引入**秘密变量(Secrets)**的概念解决该问题:将不适合提交到代码库中的配置项以秘密变量的形式代替,而将这些变量的真实值通过环境配置的方式写入到项目配置中。用户可以在仓库的“设置”(Settings)中进入“Secrets”查看并设置这些秘密变量,以便在 Actions 中使用。
一旦设置秘密变量,便无法在页面中查看该变量的值。在 Actions 的运行日志中,包含秘密变量在内的敏感字段的值也会被隐去。不推荐将秘密变量的值直接当作参数传入要执行的 shell 命令中,因为此时秘密变量的值会被 ps
命令以及安全审计事件机制等获取。需要使用 stdin
输入或者使用目标进程提供的其他安全机制。
无论是在 GitHub.com 托管的环境运行 Actions,还是在本地私有服务器中运行 Actions,请时刻遵循基本的安全原则。GitHub 提供了一系列 GitHub Actions 常见安全注意事项总结,敬请多加留意。
总结
在本文中,我们介绍了将 GitHub Actions 作为 CI/CD 集成时的用例。通过 GitHub Actions 可以实现各种有意思的应用,如有些用户的个人用户页中甚至嵌入了一个网页版口袋妖怪模拟器,允许访客通过点击按键的方式触发 Actions,推动游戏运行。
另一些 CI/CD 配置时所需的功能,比如“部署审核”——一位用户申请执行某些 Actions 时,需要另一位具有相应权限的用户审核通过后才可执行——属于 GitHub Enterprise 中的高级功能,需要配置相应产品后才可使用。
GitHub Actions 官方文档对于 Actions 的各种详尽配置支持比本文介绍的要多得多,感兴趣的读者可以通过下方的参考资料了解更多信息。
参考资料
- RedHat 的知识库文章《What is CI/CD?》
- GitHub Actions 的官方文档
- 本文给出的 GitHub Actions 示例仓库
以上内容已按照 Markdown 格式排版,标题、列表、代码块、链接和插图占位符均已妥善处理,确保结构清晰、易于阅读。插图位置使用 ![插图X]()
表示,具体图片需用户自行替换。
相关文章:
使用GitHub Actions构建CI/CD流程
GitHub Actions 简介 GitHub Actions 是一种自动化软件开发工作流的方式,与 GitHub.com 深度集成。开发人员可以通过配置 GitHub Actions 来实现基于事件触发的自动工作流,比如,当有任意用户向 master 分支提交代码时,自动执行一…...
Ubuntu服务器 无法正常启动redis
当我们在阿里云服务器上启动redis服务 运行下述命令时 service redis-server start 会出现如下报错 Failed to start redis-server.service: Unit redis-server.service not found. 如图: 解决方案: 通过以下命令重新安装Redis: sudo apt…...
MySQL 索引原理
一、索引基础概念 1. 索引是什么? 定义:索引是帮助MySQL高效获取数据的有序数据结构,类似书籍的目录。核心作用:减少磁盘I/O次数,提升查询速度(以空间换时间)。 2. 索引的优缺点 优点缺点加…...
前端快速入门学习3——CSS介绍与选择器
1.概述 CSS全名是cascading style sheets,中文名层叠样式表。 用于定义网页样式和布局的样式表语言。 通过 CSS,你可以指定页面中各个元素的颜色、字体、大小、间距、边框、背景等样式,从而实现更精确的页面设计。 HTML与CSS的关系:HTML相当…...
WPF 免费UI 控件HandyControl
示例效果和代码 直接可以用 Button 按钮 | HandyOrg 1.安装 , 输入 HandyControl 2.<!--配置HandyControl--> <!--配置HandyControl--> <ResourceDictionary Source"pack://application:,,,/HandyControl;component/Themes/SkinDefault.xaml"/> …...
【代码艺廊】pyside6桌面应用范例:homemade-toolset
在研发测试日常工作中,通常会遇到很多琐碎的事情,占用我们工作的时间和精力,从而导致我们不能把大部分的注意力放在主要的工作上面。为了解决这个问题,除了加人之外,我们通常会开发一些日常用的效率工具,比…...
Hive 常见面试 300 问
一、Hive 基础概念 什么是 Hive?它的主要用途是什么? Hive 与传统关系型数据库有什么区别? 简述 Hive 的架构,各个组件的作用是什么? 解释 Hive 中的元数据,它存储在哪里? Hive 支持哪些数据格式?各自的特点是什么? 什么是 Hive 表的分区?为什么要使用分区? 什么是 …...
OpenMinus 源码深度解析:从 React 模式到多智能体架构实现
OpenMinus 源码深度解析:从 React 模式到多智能体架构实现 本文基于 2024 年 3 月 9 日最新代码版本解析,完整代码已上传至 GitHub(附项目地址https://github.com/mannaandpoem/OpenManus) 一、项目背景与核心价值 1.1 项目定位 …...
【Linux网络与网络编程】04.TCP Socket编程
一、TCP Socket编程接口 // 创建套接字 int socket(int domain, int type, int protocol); // 参数: // domain:域(协议家族),这里使用 AF_INET 表示进行网络编程 // type:网络通信传输的类型࿰…...
初识数据结构——算法效率的“两面性”:时间与空间复杂度全解析
📊 算法效率的“两面性”:时间与空间复杂度全解析 1️⃣ 如何衡量算法好坏? 举个栗子🌰:斐波那契数列的递归实现 public static long Fib(int N) {if(N < 3) return 1;return Fib(N-1) Fib(N-2); }问题…...
CCF GESP C++编程 八级认证真题 2025年3月
C 八级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 答案 B C B A D D D 一、单选题 第 1 题 国家“以旧换新”政策仍在继续,小杨家决定在家里旧的冰箱、电视、洗衣机、微波炉中选两种换新。其中,冰箱有4种型号可选,电视有6种型号可选,…...
React: hook相当于函数吗?
一、Hook 是一个函数,但不仅仅是函数 函数的本质 Hook 确实是一个 JavaScript 函数,例如 useState、useEffect 或自定义 Hook 都是函数。它们可以接受参数(如初始状态值或依赖项数组),并返回结果(如状态值和…...
Git 从入门到精通(开源协作特别版)
🧠 Git 从入门到精通(开源协作特别版) ✅ 基础命令 🧰 高级用法 🛠️ 开源实战技巧 🌍 GitHub 社区协作 适合:从0开始 → 熟练开发者 → 参与/维护开源项目 🔰 第1章:…...
《探索边缘计算:重塑未来智能物联网的关键技术》
最近研学过程中发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击链接跳转到网站人工智能及编程语言学习教程。读者们可以通过里面的文章详细了解一下人工智能及其编程等教程和学习方法。下面开始对正文内容的…...
什么是缓存穿透、缓存雪崩、缓存击穿?
什么是缓存? 缓存就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 怎么防止缓存穿透? 缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到…...
洛谷题单3-P4956 [COCI 2017 2018 #6] Davor-python-流程图重构
题目描述 在征服南极之后,Davor 开始了一项新的挑战。下一步是在西伯利亚、格林兰、挪威的北极圈远征。 他将在 2018 年 12 月 31 日开始出发,在这之前需要一共筹集 n 元钱。 他打算在每个星期一筹集 x 元,星期二筹集 xk 元,……...
解决浏览器报错Mixed Content
前端代码写死了访问后端的请求为:http://service.xxx.com:8080/api/,前端代码中混合内容(Mixed Content) 导致的。浏览器使用https访问站点时,这个请求会被拦截,并且浏览器打印 login.vue:151 Mixed Conten…...
HCIP【BGP协议(详解)】
目录 1 BGP协议产生背景 2 BGP协议特性 2.1 自治系统间路由传播 2.2 路由矢量协议 2.3 防环机制 2.4 基于TCP传输 2.5 路由更新机制 2.6 丰富的路由属性 2.7 支持CIDR和路由聚合 2.8 路由过滤和策略控制 2.9 动态对等体功能 3 BGP基本术语 4 BGP规划问题 4.1 路…...
集合与容器:List、HashMap(II)
一、ArrayList 是集合框架中最核心的动态数组实现,高频使用的容器之一。 1. 核心数据结构 基于数组实现,维护elementData数组存储元素: transient修饰的elementData不会被默认序列化(通过自定义序列化逻辑优化存储)…...
mac 安装MySQL
1、打开官网,点击Downloads 2、在downloads页面选择MySQL Community Server 3、选择对应的设备和版本,点击下载 4、下载选择 5、下载完成后,点击安装 6、next 到Configguration 时要输入密码(千万别忘记) 7.最后输…...
Pascal语言的软件开发工具
使用Pascal语言的软件开发工具 引言 随着计算机科学的发展,编程语言层出不穷,程序员们在开发时可以选择多种多样的工具。而Pascal语言作为一种历史悠久的程序设计语言,尽管在当今编程语言的生态中已不再是主流,但其优雅的语法和…...
vue组件开发:什么是VUE组件?
什么是VUE组件 在我们实际开发过程中你也许会发现有很多代码是重复的,它们可能是一个按钮、一个表单、一个列表等等,其中最为显著的应该是列表。 以CSDN的首页为例: 上述截图中的文章列表可能会在多处出现,比如此截图是精选博客…...
如何在Springboot的Mapper中轻松添加新的SQL语句呀?
在如今的软件开发界,Spring Boot可是非常受欢迎的框架哦,尤其是在微服务和RESTful API的构建上,真的是让人爱不释手!今天,我们就来聊聊如何为Spring Boot项目中的Mapper添加新的SQL语句吧!说起来࿰…...
微服务架构: SpringCloud服务注册与发现详解
# 微服务架构: SpringCloud服务注册与发现详解 一、什么是微服务架构 微服务架构简介 微服务架构(Microservices Architecture)是一种以一组小型服务应用程序构建系统的软件架构风格。每个服务运行在自己的进程中,通过精简的HTTP API进行通信…...
现代简约杂志海报包装网页设计无衬线英文字体安装包 Seriusans – Condensed Sans Display Font
Seriusans 是一种 Condensed Sans Display 字体,将现代简约与大胆融为一体。其狭窄而醒目的字体营造出强大的存在感,使其成为有影响力设计的绝佳选择,例如海报、杂志标题、品牌、包装、网页设计、运动图形、社论布局、广告活动、企业演示&…...
C/C++的条件编译
一、什么是条件编译? 条件编译是指在编译阶段根据某些条件来决定是否编译某段代码。这通常通过预处理指令来实现,比如 #if、#ifdef、#ifndef、#else、#elif 和 #endif。 二、为什么使用条件编译? 跨平台开发:不同的操作…...
视野,,地面覆盖,重叠需求,FPS,飞行速度等的计算公式
一、计算相机视野与重叠需求 1. 相机参数 IDS UI-5280CP: 分辨率:2456x2054 像素。传感器:假设为 1/1.8" CMOS(常见型号),尺寸约 6.78 mm(宽) 5.67 mm(高…...
ARXML文件解析-1
目录 1 摘要2 ARXML文件2.1 作用及典型应用场景2.2 **ARXML文件的结构树**2.3 TAG(XML元素)2.4 ARXML文件关键元素解析2.4.1 XML声明与处理指令2.4.2 XML注释2.4.3 ADMIN-DATA元素2.4.3 语言相关元素2.4.5 AR-PACKAGE体系结构2.4.6. 数据转换框架2.4.7 S…...
传统开发者视角:智能合约与区块链数据库探秘
前言 在上一篇文章:探秘区块链开发:智能合约在 DApp 中的地位及与传统开发差异中我为大家从传统开发者的角度讲解了一下什么是智能合约。 简单的来说智能合约对于传统前端开发者可以说是API接口,而后端开发者则可以说是负责接口逻辑的程序。 然而从传统的开发意识跳跃到D…...
游戏引擎学习第204天
回顾并为今天的内容做铺垫 好,现在开始这一集。今天我们将进行一些用户界面编程,觉得这是一个展示如何编写这类代码的好时机。很多人对如何做用户界面代码都很好奇,所以展示一下如何编写是非常有意义的。 我之所以在现在的这个地方做这些工…...
蓝桥杯2024年第十五届省赛真题-R 格式
题目链接: 思路: 通过数组模拟d的每一位,逐位进行计算,从而实现对d的精确处理。 代码: #include<bits/stdc.h> #define int long long using namespace std; const int N 2020;int n; string s; vector<i…...
Haskell语言的区块链安全
Haskell语言在区块链安全中的应用 引言 随着区块链技术的发展,它已经成为金融、供应链管理、身份认证等多个领域的重要基础设施。然而,区块链的安全性问题一直是行业关注的焦点。为了确保区块链的安全性,开发者需要选择合适的编程语言来编写…...
BUUCTF-web刷题篇(11)
20.admin 这道题很可能用admin或者伪造admin进行登录,用admin进行登录,随便填写密码进不去,发现页面有register、login,用admin注册提示已经被注册。 方法一:(burp爆破) 进入登陆界面&#x…...
TensorFlow
TensorFlow 是一个由 Google 开发并开源的机器学习和深度学习库,被广泛应用于各类机器学习项目。以下为你详细介绍: 概述 TensorFlow 最初是为了满足 Google 内部大规模机器学习需求而研发,后于 2015 年开源。它提供了一个强大且灵活的生态…...
分子生成的深层次层次变分自编码器 - DrugHIVE 测评
一、背景介绍 DrugHIVE 来源于南加州大学定量与计算生物学系的 Remo Rohs 为通讯作者的文章:《Structure-Based Drug Design with a Deep Hierarchical Generative Model》。文章链接:https://pubs.acs.org/doi/10.1021/acs.jcim.4c01193。该文章在 202…...
54.大学生心理健康管理系统(基于springboot项目)
目录 1.系统的受众说明 2.相关技术 2.1 B/S结构 2.2 MySQL数据库 3.系统分析 3.1可行性分析 3.1.1时间可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.1.4 技术可行性 3.1.5 法律可行性 3.2系统流程分析 3.3系统功能需求分析 3.4 系统非功能需求分析 4.系统设计…...
Linux文件特殊权限管理及进程和线程
acl 权限优先级 拥有者 > 特殊指定用户 > 权限多的组 >权限少的组 > 其他 mask阈值 mask是能够赋予指定用户权限的最大阀值 当设定完毕文件的acl列表之后用chmod缩小了文件拥有组的权力 mask会发生变化 恢复: setfacl -m m: 权限 :rwx 文件/…...
Vue2+Vue3 45-90集学习笔记
Vue2Vue3 45-90集学习笔记 小兔鲜首页 页面开发思路: 分析页面,按模块拆分组件,搭架子(局部注册或全局注册) 局部注册:App.js中 导入(import),注册(compon…...
【Web 服务器】的工作原理
🌐 Web 服务器的工作原理 Web 服务器的主要作用是 接收客户端请求(通常是浏览器发出的 HTTP/HTTPS 请求),处理请求,并返回相应的数据(如网页、图片、API 响应等)。 📌 工作流程 1️…...
LeetCode 5 -- 区间DP | 中心拓展算法
题目描述 最长回文子串 数据规模为 5e5,必须 manacher 算法 1. DP 由于 r e v e r s e ( ) reverse() reverse() 的时间复杂度是 O ( N ) O(N) O(N),因此暴力肯定是不行的。 d p dp dp 的思路:如果 s [ l . . r ] s[l..r] s[l..r] 是一个…...
IntelliJ IDEA中Spring Boot 3.4.x+集成Redis 7.x:最新配置与实战指南
前言 Spring Boot 3.4.x作为当前最新稳定版本,全面支持Java 17与Jakarta EE 10规范。本文以Spring Boot 3.4.1和Redis 7.x为例,详解如何在IDEA中快速接入Redis,涵盖最新依赖配置、数据序列化优化、缓存注解及高…...
数仓建模中计算累计销量
在数仓建模中计算累计销量,通常需要结合时间维度和业务逻辑设计合理的模型与计算逻辑。以下是分步骤的实现思路和示例: 1. 模型设计 累计销量的计算通常基于星型模型或雪花模型,核心结构包括: 事实表:记录每一笔销售…...
(多看) CExercise_05_1函数_1.2计算base的exponent次幂
题目: 键盘录入两个整数:底(base)和幂指数(exponent),计算base的exponent次幂,并打印输出对应的结果。(注意底和幂指数都可能是负数) 提示:求幂运算时,基础的思路就是先无脑把指数转…...
Pollard‘s Rho 算法
Pollard’s Rho 算法:一场数学与计算机科学的巧妙结合 在现代计算机科学中,素数分解、整数因子化问题有着广泛的应用,尤其是在密码学领域。然而,当面对一个大合数时,寻找其因子仍然是一个非常复杂的问题。我们常常依赖…...
8款分形长虹玻璃科幻渐变海报设计JPG背景素材 The Gradient Backgrounds Pack
天空从未如此美好 — 直到有人将日落洒在您的屏幕上。这些渐变是带有心跳的液体颜色,从熔化的金色转变为深紫色,就像地平线一样。 8 个背景中的每一个都以 45003000 像素和 300dpi 的速度脉冲,清晰到足以让您感觉自己可以直接踏入光芒中。但这…...
AIGC9——AIGC时代的用户体验革命:智能交互与隐私保护的平衡术
引言:当AI成为交互主角 2024年,淘宝AI客服"阿里小蜜"日均处理20亿次咨询,日本虚拟偶像"初音未来"演唱会门票3秒售罄——这些现象标志着AIGC已深度融入人机交互场景。但与此同时,过度个性化的推荐引发"信…...
vm虚拟机虚拟出网卡并ping通外网
在 Linux 和 Windows 系统中,即使不使用网络命名空间(namespace),也能实现虚拟网卡上网。以下是不同场景下的实现方法: 一、Linux 系统(不使用网络命名空间) 1. 直接创建虚拟网卡对(…...
基于时间卷积网络TCN实现电力负荷多变量时序预测(PyTorch版)
前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对…...
ESXi8的部署过程
目录 一、系统安装 二、ESXI8的序列号 三、挂载硬盘和新建VMFS数据分区 四、通过数据存储浏览器上传下载文件 五、Windows远程桌面端口隐射 六、导出虚机 一、系统安装 1、使用UtrIOS系统制作ESXI8的启动盘; 2、服务器启动F8按键进入Popup启动选项,选择U盘启动; 3、安…...
IntelliJ IDEA 2020~2024 创建SpringBoot项目编辑报错: 程序包org.springframework.boot不存在
目录 前奏解决结尾 前奏 哈!今天在处理我的SpringBoot项目时,突然遇到了一些让人摸不着头脑的错误提示: java: 程序包org.junit不存在 java: 程序包org.junit.runner不存在 java: 程序包org.springframework.boot.test.context不存在 java:…...