Jenkinsfile流水线构建教程
前言
Jenkins 是目前使用非常广泛的自动化流程的执行工具, 我们目前的一些自动化编译, 自动化测试都允许在 Jenkins 上面. 在 Jenkins 的术语里面, 一些自动化工作联合起来称之为流水线, 比如拉取代码, 编译, 运行自动化测试等.
本文的主要目的是引导你快速熟悉 Jenkinsfile 结构和语义, 让你读完之后可以自己写出一个 Jenkinsfile.
Jenkins 流水线分为脚本式的和声明式的. 脚本式流水线比较灵活, 可以嵌入一些 groovy 语言编程,功能比较强大, 但是对于新手而言上手比较困难, 有一定的学习门槛. 声明式流水线更具结构化, 简单直白, 减少了对 groovy 语言的依赖, 对新用户更友好.
Jenkinsfile 是什么
在 Jenkins 2 中, 流水线配置可以从 Jenkins 中分离出来. Jenkinsfile 允许你将配置文件和执行步骤以代码的形式保存, 这样就可以做到像管理 源代码一样管理 Jenkins 任务, 支持历史追溯, 差异对比等.
Jenkins2 推荐使用名为 'Jenkinsfile’的文件保存任务配置和流水线信息, 不同的项目和分支都有自己 的 Jenkinsfile, 其内容各不相同.
Jenkinsfile 基本功能
让我们先从一个简单的 Jenkinsfile 开始, 逐步了解 Jenkinsfile 的功能和用法.
Jenkinsfile Hello world
pipeline {agent anystages {stage('Source') {steps {echo 'hello world'}}}
}
- 第 1 行声明这是一个流水线.
- 第 2 行指定了执行该流水线的
agent
,agent
可以理解为一个执行环境, 可以是docker
,k8s
, 也可以是当前机器环境 - 第 4 行指定了执行该流水线所需要的步骤,
stages
里面可以保护多个stage
- 第 5 行指定了一个名字叫做
'Source'
的stage
- 第 6 行指定了该
stage
内需要执行的steps
- 第 7 行调用
echo
内置函数打印了一句'hello world'
执行 shell 脚本
在 steps 块中使用sh
来执行. 多行命令可以用"""
(三个双引号) 或者 "'
(三个单引号). 区别在于双引号里面引用 的变量会被计算展开. 例如:
steps {// 单行shell命令sh 'echo "Hello world"'// 多行shell命令, 以连续的三个'或者"包围sh '''#!/bin/bash# multi line shell scriptcd projectmkdir build && cd buildcmake .. && cmake --build .'''
}
指定工作目录
dir
指令的功能是设定命令执行时的工作目录, 如果该目录不存在则创建它.
steps {dir('project/build') {sh "echo `pwd`"}
}
拉取 GitHub/Bitbucket 代码
声明式流水线的 git 检出代码非常简单直白. 如下:
steps {dir('code_repo') {git credentialsId: "${BITBUCKET_CREDENTIALS_ID}",url: 'ssh://git@git.company.com/code_repo.git',branch: 'master'}
}
需要说明几点:
git
指令会检出到当前的目录. 如果你需要检出到子目录则需要使用dir
指令.credentialsId
这块引用了一个环境变量, 该变量保存着仓库服务器的credential
. 定义环境变量的方法见后.branch
指定使用该仓库的哪个分支, 如果是master
那可以省略.
定义环境变量
环境变量在 pipeline 的environment
块中定义.
pipeline {agent noneenvironment {// credentials for other service, you can find it atBITBUCKET_CREDENTIALS_ID = 'bitbucket.company.com'REGISTRY_CREDENTIALS_ID = 'jenkins-harbor'}
}
使用 docker 容器
这里有两种办法.
docker 插件提供的方法
在 agent 中指定 docker 环境. 这种方法适合安装了 docker 的 Jenkins.
stage ('SetupEnv') {agent {docker {alwaysPull trueimage 'hub.company.com/jenkins/ubuntu:24_04'registryCredentialsId "${REGISTRY_CREDENTIALS_ID}"registryUrl 'https://hub.company.com'reuseNode true}}steps {// 这里的代码运行在上面的docker container环境sh '''#!/bin/bashset -xeucd code_repo./setup_env.sh 64'''}
}
此时 steps
块中的命令都是在 docker 环境中执行的.
Docker Template
本方法适用于在 k8s 集群上面部署的 Jenkins, 并且已经设置了全局的 Docker Template 文件. 如果想使用 自己设定的 yaml 文件, 请参考下一节. label
是指定 k8s 有相应标签属性的 pod, 而container
则是指定选取特定的 docker images.
pipeline {agent {kubernetes {label 'jenkins-streaming'}}stages {stage('stage1') {steps{container('ubuntu'){sh 'lsb_release -a'}}}}
}
指定自己的 k8s yaml 文件
本方法适用于 k8s 环境下部署的 Jenkins. 特点在于可以由使用者配置 Docker Template.
pipeline {agent {kubernetes {yaml libraryResource('co/company/project_pod.yaml')}}stages {stage('show') {steps{container('ubuntu'){sh 'lsb_release -a'}}}}
}
yaml 文件如果在本地仓库, 则可以使用
yamlFile 'path/to/local/pod/file.yaml'
指定 agent
一个 pipeline 可以指定一个或者多个agent
. 指定一个全局通用 agent 的方法是在 pipeline 开始的地方指定.
pipeline {agent any
}pipeline {agent {docker {// docker images settings}}
}pipeline {agent {kubernetes {// k8s settings}}
}
如果需要在不同的 stage 使用不同的 agent, 则在开始处指定为none
, 然后在各个 stage 分别指定.
pipeline {agent nonestages {stage('Source') {agent any}stage('Compile') {agent {image: 'hub.company.com/jenkins/ubuntu:2404'}}}
}
Artifactory 上传下载
中间产物文件需要上传到 Artifactory 的, 可以参考下面步骤:
stage ('Upload Files to Artifactory') {steps {rtUpload (serverId: "${ARTIFACTORY_SERVER_ID}",spec: """{"files": [{"pattern": "/build/library.a","target": "your_repo","props": "gcc_version=4.8;branch=your_branch_name"},{"pattern": "/build/executable.a","target": "your_repo","props": "gcc_version=4.8;branch=your_branch_name"}]}""")}
}
关于 spec
的详细信息可以参考: Upload
SonarQube 集成
SonarQube 提供了代码审计, 漏洞检查的功能. 目前可以集成 clang-tidy, cppcheck 静态检查结果, 以及 gcov 的覆盖率分析结果.
同时能提供新增代码的质量检查, 确保新 merge 的代码符合质量要求.
stage('Analysis') {steps {withSonarQubeEnv('SonarQubeServerID') {container("sonar-scanner-image") {sh '''#!/bin/bashset -eucd your/projectsonar-scanner -X \-Dsonar.projectKey=ProjectName'''}}}
}
一般而言, 我们会在执行 sonar-scanner 的目录里面存放一个名为sonar-project.properties
的文件, 用以指定更多的 sonar 配置. 示例的配置如下:
sonar.projectVersion=3.0.0
sonar.language=c++
# 指定源文件目录
sonar.sources=.
sonar.sourceEncoding=UTF-8
# 指定排除的文件/目录
sonar.exclusions=\build/** \doc/** \script/** \libs/** \test/**
# 指定排除覆盖率的文件
sonar.coverage.exclusions=**/*_test.cpp
# cppcheck 报告文件
sonar.cxx.cppcheck.reportPath=./cppcheck_report.xml
# clang tidy报告文件
sonar.cxx.clangtidy.reportPath=./clang-tidy-report.txt
sonar.cxx.coverage.reportPath=./bullseye_report.xml
总结
在这篇文章中, 我们深入探讨了 Jenkinsfile 的基础与高级用法, 从最简单的"Hello World"示例到复杂的 Docker 容器集成, Kubernetes 部署, Artifactory 上传下载以及 SonarQube 代码质量检查. 通过这些内容的学习, 可以帮你掌握如何创建一个基本的流水线, 并且了解了如何扩展这个基础以适应更复杂的需求.
参考资料
Jenkins 2: Up and Running
相关文章:
Jenkinsfile流水线构建教程
前言 Jenkins 是目前使用非常广泛的自动化流程的执行工具, 我们目前的一些自动化编译, 自动化测试都允许在 Jenkins 上面. 在 Jenkins 的术语里面, 一些自动化工作联合起来称之为流水线, 比如拉取代码, 编译, 运行自动化测试等. 本文的主要目的是引导你快速熟悉 Jenkinsfile …...
比创达电子科技-EMC干货之防静电技术
EMC干货之防静电技术 什么是静电放电 两个具有不同静电电位的物体,由于直接接触或静电场感应引起两物体间的静电电荷的转移,静电电场的能量达到一定程度后,击穿其间介质而进行放电的现象就是静电放电,简称为ESD(Electro Static Discharge)。 静电产生的原…...
PDF扫描档智能方向识别:多模型投票机制的实践测试 救活古典书籍
2025-02-22 20:10物联全栈123 尊敬的诸位!我是一名物联网工程师。关注我,持续分享最新物联网与AI资讯和开发实战。期望与您携手探寻物联网与 AI 的无尽可能 RAG知识库搭建的过程中,扫描档pdf的支持和准确率一直是个大家都不愿主动提起的事情…...
算法教程:岛的最大面积
算法教程:岛的最大面积 我们将首先讨论问题和解决方案,然后使用可视化工具(上一篇博客中进行了介绍)来更好地理解搜索过程。 问题描述 我们将要演练的具体问题是问题 Leetcode:岛屿的最大面积。在 Leetcode 上找到的直接问题描述是: 给你一个 m x n 二进制矩阵网格。岛…...
18439二维前缀和
18439二维前缀和 ⭐️难度:中等 📖 📚 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int n scanner.nextInt();int m scanner.nextInt();int q s…...
information_schema.processlist 表详解
information_schema.processlist 表(或 SHOW PROCESSLIST; 命令)用于查看 MySQL 当前所有的连接进程,帮助管理员监控数据库活动并排查性能问题。以下是该表的字段及其具体含义: 🔹 information_schema.processlist 字段…...
数字化转型数据自动采集统计分析发那科(FANUC)数据采集
针对各类数控机床,特别是FANUC系列的数据自动采集需求,以下是一个综合性的解决方案,并详细说明了如何采集FANUC系列机床的各类数据。 一、数据采集方案概述 协议支持: 以适应不同数控机床的通信需求。 针对FANUC系列机床…...
olmOCR:使用VLM解析PDF
在PDF解析中,目前主流的开源工具包括Minuer、GOT OCR等。主要都是通过飞桨等OCR套件组装的一套pipeline,或者直接通过VLM解析图像。 #一、 olmOCR是使用VLM进行的端到端的PDF文档解析 二、document-anchoring 与上述的不同在于,olmOCR使用…...
【自学嵌入式(11)闪存文件系统的应用】
闪存文件系统的应用 闪存文件插件程序的配置上传程序实例一上传程序实例二——上传文件到ESP8266的程序 上篇文章简要了解了闪存文件系统的概念,相关头文件、类以及方法。但我们只尝试了向开发板中传输文本数据,对于更加复杂的内容(如一个界面、一个互动…...
Spring Cloud——路由网关Zuul
??? 哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!??? 【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。 【一心同学】博客…...
ShenNiusModularity项目源码学习(14:ShenNius.Infrastructure项目分析)
ShenNius.Infrastructure项目用于定义ShenNius.Admin.Mvc项目和ShenNius.Admin.API项目共用的特性类、数据操作接口实现类、上下文类、通讯类,主要文件的用途如下: Attributes文件夹保存特性类或过滤器类定义,主要包括: …...
【博资考4】网安学院-硕转博考试内容
【博资考4】硕转博考试内容 - 网络安全与基础理论 写在最前面一. **21年硕转博面试内容回顾**网络、逆向、操作系统、攻防、漏洞1. **网络安全常见攻击方式及其防范措施**1.1 **DDoS攻击(分布式拒绝服务)**1.2 **SQL注入攻击**1.3 **XSS攻击(…...
web前端初学Angular由浅入深上手开发项目
Angular 是一个功能强大的前端框架,适合构建复杂的企业级应用。作为初学者,通过由浅入深的学习路径,可以快速上手并开发项目。以下是逐步学习 Angular 的指导: 1. 基础知识 (1) 了解 Angular Angular 是什么? Angul…...
5.10 P-Tuning v2:多层级提示编码的微调革新
P-Tuning v2:多层级提示编码的微调革新 一、技术架构解析 #mermaid-svg-4Wy6vkXZi67hY9PZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-4Wy6vkXZi67hY9PZ .error-icon{fill:#552222;}#mermaid-svg-4Wy6vkXZi67h…...
RuntimeWarning: invalid value encountered in scalar power在进行标量的幂运算时遇到了无效值
year_profit ((profit / initial_cash) ** (1 / yy) - 1) * 100 RuntimeWarning: invalid value encountered in scalar power 这个警告表示在执行标量幂运算 ((profit / initial_cash) ** (1 / yy) - 1) * 100 时遇到了无效值。常见的引发原因及解决办法如下: ###…...
LabVIEW同步数据采集功能
VI通过使用数据采集(DAQ)硬件系统,进行多通道同步采集,实时获取模拟信号数据。它利用外部时钟信号触发数据采集,支持连续采样模式,并将采集到的数据实时显示在波形图上,方便用户进行数据监控和分…...
(21)从strerror到strtok:解码C语言字符函数的“生存指南2”
❤个人主页:折枝寄北的博客 ❤专栏位置:简单入手C语言专栏 目录 前言1. 错误信息报告1.1 strerror 2. 字符操作2.1 字符分类函数2.2 字符转换函数 3. 内存操作函数3.1 memcpy3.2 memmove3.2memset3.3 memcmp 感谢您的阅读 前言 当你写下strcpy(dest, s…...
【Azure 架构师学习笔记】- Azure Databricks (12) -- Medallion Architecture简介
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (11) – UC搭建 前言 使用ADB 或者数据湖,基本上绕不开一个架构“Medallion”, 它使得数据管理更为简单有效。ADB 通过…...
Golang——内存(内存管理、内存逃逸、垃圾回收 (GC) 机制)
大家好,这里是编程Cookbook。本文详细介绍Go内存相关的内容,包括内存管理、内存逃逸、垃圾回收 (GC) 机制的三色标记,写屏障。 文章目录 Go 的内存管理mspan && arenasarenasmspan mcachemcentralmheap内存分配逻辑内存回收逻辑优势内…...
关系型数据库的技术思路
一、网络协议 需要根据TCP协议设计一个客户端和服务器之间的命令响应协议。 1、服务端回复声明 2、客户端发送登录包 3、服务端返回登录结果 4、登录成功后进入命令阶段,否则退出。 二、每个连接用一个线程 服务器为每个客户端连接开启一个线程。 三、需要文件的随机…...
web安全——分析应用程序
文章目录 一、确定用户输入入口点二、确定服务端技术三、解析受攻击面 一、确定用户输入入口点 在检查枚举应用程序功能时生成的HTTP请求的过程中,用户输入入口点包括: URL文件路径 通常,在查询字符?之前的URL部分并不视为用户输入入口&am…...
数据库事务的基本要素(ACID)
数据库事务的基本要素(ACID) 在数据库管理系统(DBMS)中,事务(Transaction)是一个或多个数据库操作的集合,这些操作要么全部成功,要么全部失败。事务的目标是保证数据的一…...
server.servlet.session.timeout: 12h(HTTP 会话的超时时间为 12 小时)
从你提供的配置文件(应该是 Spring Boot 的 application.yml 或 application.properties 文件)来看,以下部分与会话超时时间相关: server:servlet:session:timeout: 12h # timeout: 30cookie:name: VENDER_SID会话超时时间的…...
Docker数据卷容器实战
数据卷容器 数据共享 上面讲述的是主机和容器之间共享数据,那么如何实现容器和容器之间的共享数据呢?那就是创建 创建数据卷容器。 命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载…...
基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南
基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南 基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南 基于LangChain4j调用火山引擎DeepSeek R1搭建RAG知识库实战指南一、注册火山引擎账号二、RAG技术核心原理三、环境与工具准备1. 核心组件2. 依赖配…...
Java内存的堆(堆内、堆外)、栈含义理解笔记
一、核心概念区分 1. 内存中的堆(Heap)与栈(Stack) 栈内存 ▸ 用途:存储方法调用、局部变量、基本类型数据(如 int a 1) ▸ 特点: 线程私有,每个线程独立分配栈空间。…...
2.7 大模型RAG内容安全合规检查-大模型ACP模拟题-真题
单选题 在RAG应用中,输入内容合规检查的正确顺序是? A. 先处理模型生成,后检查用户输入 B. 先检查用户输入,后处理模型生成 ✅ C. 仅检查用户输入 D. 仅检查模型输出 解析:合规流程应优先过滤用户输入风险࿰…...
C#从入门到精通(35)—如何防止winform程序因为误操作被关闭
前言: 大家好,我是上位机马工,硕士毕业4年年入40万,目前在一家自动化公司担任软件经理,从事C#上位机软件开发8年以上!我们在开发的上位机软件运行起来以后,一般在右上角都有一个关闭按钮,正常情况下点击关闭按钮就能关闭软件,但是不排除我们不想关闭软件,但是因为不…...
特斯拉 FSD 算法深度剖析:软件层面全解读
一、引言 特斯拉的 FSD(Full Self-Driving)系统作为自动驾驶领域的前沿成果,其软件层面的算法设计至关重要。本文将从软件的角度,深入探讨特斯拉 FSD 所采用的算法,包括感知、规划、控制等多个方面,以期为…...
中央一号文件里的三维革命:数字孪生如何重构智慧乡村生态?
2024年中央一号文件提出"建设宜居宜业和美乡村",这一目标背后离不开数字技术的支撑。在浙江某数字乡村试点,凡拓数创通过三维建模还原整村风貌,路灯能耗、垃圾分类、古建保护等数据在虚拟空间中实时跳动。管理人员坦言:…...
DeepSeek 助力 Vue3 开发:打造丝滑的页眉(Header)
前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…...
一个原教旨的多路径 TCP
前面提到过 ECMP 和 TCP 之间的互不友好,pacing 收益和中断开销的互斥,在事实上阻碍了 packet-based LB 的部署,也限制了交换机,服务器的并发性能,同时潜在增加了 bufferbloat 的概率,而适用 packet-based …...
DDD 架构之领域驱动设计【通俗易懂】
文章目录 1. 前言2. MVC 对比 DDD3. DDD 分层架构4. 完整业务流程 1. 前言 官方回答:DDD是一种应对复杂业务系统的设计方法,通过将软件设计与业务领域紧密结合,帮助开发人员构建清晰、可维护的领域模型。在复杂的业务系统中,它能…...
蓝桥杯15届JavaB组6题
一开始用的dfs,但是好像是因为数据量太大,数据错误,而且会超时,然后使用bfs dfs的代码(自留): import java.util.*;public class F15 {public static void main(String[] args) {Scanner sc n…...
Python 爬虫与网络安全有什么关系
Python爬虫和网络安全之间存在密切的关系。爬虫是一种用于自动化从网络上获取信息的程序,而网络安全是保护计算机网络和系统免受未经授权的访问、攻击和数据泄露的实践。本文将探讨Python爬虫与网络安全之间的关系以及如何在爬虫开发中注意网络安全。 爬虫的作用和…...
如何判断数据是否使用AES加密以及如何使用AES解密
在现代软件开发中,数据加密是保护敏感信息的重要手段。AES(Advanced Encryption Standard)是一种广泛使用的对称加密算法,因其安全性和高效性而被广泛应用。本文将介绍如何判断数据是否使用AES加密,并详细讲解如何使用…...
C++ Primer 泛型算法结构
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
java给钉钉邮箱发送邮件
1.开通POP和IMAP 2.引入pom <dependency><groupId>javax.mail</groupId><artifactId>mail</artifactId><version>1.4.7</version> </dependency>3.逻辑 String host "smtp.qiye.aliyun.com"; String port "…...
交安ABC-公路水运工程企业安全员ABC如何报名?报名要哪些条件?
交安ABC的报名方式及报名条件如下: 报名方式 1. 企业注册:企业要进入交通运输部公路水运工程施工主要负责人和安全生产管理人员信息管理系统,注册企业账户,提交企业相关信息,填写企业资料。 2. 发送审核ÿ…...
软件测试丨Docker与虚拟机架构对比分析
Docker 与虚拟机(VM)在架构上有显著区别,主要体现在资源利用、性能、隔离性和启动时间等方面。以下是两者的主要架构区别: 1. 架构层次 Docker: 主机操作系统:Docker 直接运行在宿主机的操作系统上。Docker 引擎&…...
Gatling介绍
Gatling:基于Scala的高性能负载测试工具 一、Gatling 简介 Gatling 是一个开源的 HTTP 压力测试工具,专为高并发场景设计,支持 HTTP/HTTPS、WebSocket、Kafka 等协议。其基于 Scala 的脚本语法简洁高效,支持实时报告生成和分布式…...
Shot Studio for macOS 发布 1.0.2
Shot Studio 是一个 macOS 的 app,专门为开发者设计,主要用于各大 app 应用商店的预览图设计。 提供了非常多的模板,也预设了很多尺寸。可以直接一键使用 在 1.0.2 这个版本中新增了: 文本渐变 图层:边框、颜色、圆…...
基于Spring Boot的乡村养老服务管理系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
Harbor服务需要crt证书,而下载是nginx的证书pem,应该怎么处理
1. 明确文件用途 shgbitai.com.key:SSL 私钥文件(与 Apache/Nginx 通用)。shgbitai.com.pem:已合并的证书文件(通常包含域名证书 中间证书链)。 Nginx 的证书通常以 .pem 或 .crt 为后缀,而 …...
Hadoop第一课(配置linux系统)
1、让hadoop用户,有root权限,如果可以不输密码更好: (1)先登入root用户 (2)visudo命令进入配置文件 (3)找到 root ALL(ALL) ALL这一行,在该行下面增加:hadoop ALL(ALL) ALL (:set nu可以显示行号ÿ…...
Java+Vue+uniapp微信小程序校园自助打印系统(程序+论文+讲解+安装+调试+售后)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在当今时代,网络与科学技术正以前所未有的速度迅猛发展,这股强大…...
QT 中的元对象系统(二):元对象实现原理QMetaObject
目录 1.元对象系统的构成 2.QObject和QMetaObject的关系 3.Qt 元对象模型QMetaObject 3.1.基本信息 3.2.类信息classinfo 3.3.类构造函数constructor 3.4.枚举信息 enumerator 3.5.类方法method 3.6.类属性peoproty 4.MOS(Meta Object System)示例 5.总结 1.元对象系…...
C++:指针函数与函数指针
文章目录 概述什么是指针函数(Pointer Function)什么是函数指针(Function Pointer)总结: 概述 什么是指针函数(Pointer Function) 指针函数是指返回类型为指针的函数。即,函数返回…...
用HTML5+CSS+JavaScript实现新奇挂钟动画
用HTML5+CSS+JavaScript实现新奇挂钟动画 引言 在技术博客中,如何吸引粉丝并保持他们的关注?除了干货内容,独特的视觉效果也是关键。今天,我们将通过HTML5、CSS和JavaScript实现一个新奇挂钟动画,并将其嵌入到你的网站中。这个动画不仅能让你的网站脱颖而出,还能展示你的…...
【MySQL篇】表的操作
1,创建表 语法: create table ( field1 datatype, field2 datatype, field3 datatype )charset 字符集 collate 校验规则 engine 存储引擎; 说明: field表示列名datatype表示列的类型charset字符集,如果没有指明,则…...