【前端自动化部署】,Devops,CI/CD

DevOps

提到Jenkins,想到的第一个概念就是 CI/CD 在这之前应该再了解一个概念。

DevOps Development Operations 的组合,是一种方法论,并不特指某种技术或者工具。DevOps 是一种重视 Dev 开发人员和 Ops 运维人员之间沟通、协作的流程。通过自动化的软件交付,使软件的构建,测试,发布更加的快捷、稳定、可靠。

CI

CI 的英文名称是Continuous Integration,中文翻译为:持续集成。

试想软件在开发过程中,需要不断的提交,合并进行单元测试和发布测试版本等等,这一过程是痛苦的。持续集成CI是在源代码变更后自动检测、拉取、构建的过程。
在这里插入图片描述

CD

CD 对应两个概念 持续交付Continuous Delivery 持续部署Continuous Deployment

持续交付

提交交付顾名思义是要拿出点东西的。在 CI 的自动化流程阶段后,运维团队可以快速、轻松地将应用部署到生产环境中或发布给最终使用的用户。

可以理解为是将代码集成到共有仓库(如Git)中,并自动进行构建、测试和验证,以确保团队成员的代码都能够统一的集成在一起,同时减少冲突和问题。

从前端的角度考虑,在某些情况下肯定是不能直接通过自动化的方式将最终的 build 结果直接扔到生产机的。持续交互就是可持续性交付供生产使用的的最终 build。最后通过运维或者后端小伙伴进行部署。
在这里插入图片描述

持续部署

作为持续交付的延伸,持续部署可以自动将应用发布到生产环境。

是在持续集成的基础上,对代码进行自动化构建、测试和发布,并可以进行快速、可靠地部署。持续部署是进一步自动化持续交付的过程,通过自动化流水线将程序代码的更改自动部署到生产环境中。

在这里插入图片描述

CI/CD 工具选择

  • Jenkins:一个开源的、可扩展的CI/CD工具,支持多种编程语言和版本控制系统,具有丰富的插件生态系统和广泛的应用支持。
  • GitHub Actions:GitHub 是一个基于 Git 的代码托管平台,也提供了 CI/CD 的功能,可以通过 GitHub Actions 实现自动化构建、测试和部署。
  • GitLab CI/CD: GitLab是基于Git的代码托管平台,版本控制平台内置的CI/CD工具,与GitLab紧密集成,提供一体化的代码管理和持续交付功能。
  • CircleCI:CircleCI 是一个云端的 CI/CD 工具,支持多种编程语言和版本控制系统,使用简单,适合小型团队。
  • Travis CI:Travis CI 是一个云端的 CI/CD 工具,支持多种编程语言和版本控制系统,使用简单,适合小型团队。

Jenkins 安装

示例服务器为 阿里云 CentOS 服务器。安全组中增加 8080 端口 Jenkins 默认占用

Jenkins 安装大体分两种方式,一种使用 Docker 另一种则是直接安装,示例选择后者。不管使用哪种方式安装,最终使用层面都是一样的。

# 下载 Jenkins 资源
sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
# 获取并导入信任 的包制作者的秘钥
sudo rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
# 升级 yum 源中的所有包
sudo yum upgrade
# Jenkins 依赖于 java 所以需要安装 JDK
sudo yum install java-11-openjdk
# 安装 Jenkins
sudo yum install jenkins

如果最终 Jenkins 没有找到包而导致没有安装成功,检查第一步和第二部执行结果并重新执行。

可以使用systemctl命令管理 Jenkins 服务 systemctl

# 启动 Jenkins 服务
systemctl start jenkins
# 重启 Jenkins 服务
systemctl restart jenkins
# 停止 Jenkins 服务
systemctl stop jenkins
# 查看 Jenkins 服务状态
systemctl status jenkins

启动服务后访问服务器地址 + 8080 端口,Jenkins 默认为 8080 端口。

Jenkins 使用及 Freestyle 任务构建

在这里插入图片描述
首次进入使用 cat /var/lib/jenkins/secrets/initialAdminPassword 查看密码。

随后进入插件安装页面,暂时安装系统推荐插件即可。

然后创建用户

在这里插入图片描述

构建目标:拉取 github 代码

点击 新建 Item 创建一个 Freestyle Project

在这里插入图片描述
在 源码管理 处选择 git ,输入仓库地址,点击添加。
在这里插入图片描述
输入 github 账号和密码,这里的密码有时候可能会出现问题,可以使用 token github 如何生成 token ?

配置只是一方面,同时服务器也要具备 git 环境。 yum install git

在这里插入图片描述

构建目标:部署到本机

部署前端项目肯定是离不开 nginx 的。 yum install nginx

安装完成后同样可以使用 systemctl 命令管理 nginx 服务。

nginx 具体配置这里就不说了。本示例项目中,静态文件托管目录为 /usr/share/nginx/html/dist

接着来到 Jenkins 这里。想要部署前端项目还需要依赖一个 Node 环境,需要在 Manage Jenkins -> Manage Plugins 在可选插件中搜索 nodejs 选择对应插件进行安装,安装完成后需要重启才会生效。

在这里插入图片描述
然后到 系统管理 -> 全局工具配置 中配置 Node (吐槽:没有安装任何插件时系统管理以及其子页面全是英文,安装完插件后又变成了中文。这国际化不知道是系统原因还是它的原因)

在这里插入图片描述
随后去修改刚才创建的任务。在 构建环境 中会多出一个选项 Provide Node & npm bin/ folder to PATH 勾选即可。然后在 构建 中选择 增加构建步骤 -> 执行 shell 输入打包发布相关的命令。Jenkins 会逐行执行。

npm install yarn -gyarn installyarn build
# 打包 build 后的文件
tar -zcvf dist.tar.gz dist/
# 删除 build 后的文件
rm -rf dist/
# 移动 build 后的压缩包到 nginx 托管目录下
sudo mv dist.tar.gz /usr/share/nginx/html
# 进入托管目录下
cd /usr/share/nginx/html
# 解压
sudo tar -zxcf dist.tar.gz
# 删除压缩包
sudo rm -rf dist.tar.gz

由于项目构建时是在 Jenkins 的工作目录下执行脚本,会出现权限问题。导致即使使用了 sudo 还会出现类似以下错误。

We trust you have received the usual lecture from the local SystemAdministrator. It usually boils down to these three things:    #1) Respect the privacy of others.    #2) Think before you type.    #3) With great power comes great responsibility

解决方案:在 /etc/sudoers 文件中增加 jenkins ALL=(ALL) NOPASSWD:ALL 表示在执行 sudo 时不需要输入密码。

如果不使用 sudo 则会出现以下错误。

xxxxxxx: Permission denied

解决方案:修改 /lib/systemed/system/jenkins.service 文件。将 User=jenkins 修改为 User=root,表示给 Jenkins 赋权限。修改配置文件后记得重启服务。

构建的过程中还可能出现以下错误

ERROR: Error fetching remote repo 'origin'

解决方案:由于需要构建的代码在 github 上面,这种错误表示拉取代码失败了,重试几次就可以了。

工作目录

上面提到一个很重要的概念就是 工作目录 在上面的 shell 默认就是在这里执行的。工作目录是由两部分组成。

  • /var/lib/jenkins/workspace/ 类似于前缀吧。
  • web-deploy 这个其实是上面构建任务的名字。

总结:Jenkins 的执行目录是 /var/lib/jenkins/workspace/web-deploy。也就是说输入的每一条命令都是在这里面执行的。(搞清楚定位能避免好多问题,特别是前端的部署,就是打包,移动,解压很容易搞错路径。)

构建目标:侦听 git 提交到指定分支进行构建

  • 来到 Jenkins 中选择 系统管理 -> 系统配置 找到 Jenkins URL 将其复制。

  • 随后在尾部添加 github-webhook/ 尾部斜杠一定不要丢。整体结构大致为 http://192.168.0.1:8080/github-webhook/

  • 登录 github 需要集成的项目中添加 webhook。在 Payload URL 中将上述内容填入。

在这里插入图片描述

  • 然后修改 Jenkins 任务配置 构建触发器中选择 GitHub hook trigger for GITScm polling
    在这里插入图片描述
    由于在上面的源码管理中已经指定了main分支,此时如果这个分支的代码有改动就会触发自动构建。

构建目标:部署到目标主机

在真实的开发场景中,Jenkins 几乎不会和前端资源放到一个服务器。大多数情况下 Jenkins 所处的服务器环境就是一个工具用的服务器,放置了一些公司中常用的工具。因此构建到指定的服务器也至关重要。

  1. 系统管理 -> 插件管理 搜索 Publish Over SSH 进行安装。
    在这里插入图片描述

  2. 然后在系统管理 -> 系统配置中找到 Publish over SSH 点击新增,再点击高级,然后选中 Use password authentication, or use a different key
    在这里插入图片描述
    完成后可点击右下角 Test Confirguration 进行测试。

  3. 继续修改构建任务。先修改原有的构建脚本。因为要发布到远程,所以原有的发布命令要进行去除。

npm install yarn -gyarn installyarn build
# 只打包,然后删除文件夹
tar -zcvf dist.tar.gz dist/rm -rf dist/
  1. 选择构建后操作 -> Send build artifacts over SSH
    在这里插入图片描述
  • Rransfer Set Source files:要上传到目标服务器的文件。它是一个相对路径,相对于 Jenkins 的工作目录 由于上面的 shell 执行之后在工作目录中只有一个压缩包,so 直接写一个文件名即可。
  • Remove prefix:去前缀。假设此时打包文件在 /var/lib/jenkins/workspace/web-deploy/assets/dist.tar.gz,那么 Rransfer Set Source files 则应该为 assets/dist.tar.gz,此时 Remove prefix 配置为 assets/ 则可以去除这个前缀,否则会在目标服务中创建 assets 。
  • Remote directory:远程的静态资源托管目录。由于配置服务器默认为 /,所以 usr/share/nginx/html/ 不用以 / 开头。
  • Exec command:远程机执行 shell,由于配置服务器默认为 /, 所以 工作目录也是以 / 开始。

执行成功后查看执行日志会有类似以下结果:

SSH: Connecting from host [iZuf6dwyzch3wm3imzxgqfZ]SSH: Connecting with configuration [aliyun-dev] ...SSH: EXEC: completed after 202 msSSH: Disconnecting configuration [aliyun-dev] ...
# 如果 Transferred 0 file 则需要查看配置的路径是否正确。表示文件并没有被移动到远程主机中。
SSH: Transferred 1 file(s)Finished: SUCCESS

构建目标:钉钉机器人通知

  1. 系统管理 -> 插件管理 搜索 DingTalk 进行安装。文档
    在这里插入图片描述

  2. 钉钉群创建机器人。钉钉群 -> 只能群助手 -> 添加机器人 -> 自定义

在这里插入图片描述

  1. 定义机器人名字和关键字,创建完成后先将 webhook 中的内容复制。
    在这里插入图片描述
  2. Jenkins 中 系统管理 -> 系统配置 -> 钉钉 -> 新增 配置完成后可点击右下角进行测试。
    在这里插入图片描述
  3. 修改构建任务配置。

在这里插入图片描述

  • 通知人:atAll 勾选后 @ 不到准确的人。😂。输入框内可填写需要被 @ 人的手机号,多个换行。
  • 自定义内容:支持 markdown 写法,可以使用一些环境变量。192.168.0.1:8080/env-vars.html/
  • 实现默认 @ 执行人
  1. 构建成功
    在这里插入图片描述

Pipline 构建

上一章节中着重介绍了如何构建 freestyle 的任务,但是 Jenkins 远不止于此。在本章开始之前强烈建议阅读文档[7],重点关注流水线相关内容。

新建任务 -> 选择流水线 其他内容可以都不用管,只关注流水线 有两种选择,演示就选择第一种。

直接在 Jenkins 中书写配置。

在这里插入图片描述
在项目的 Jenkinsfile 配置文件中写配置。

在这里插入图片描述
在正式开始之前应该了解 Jenkins Pipline 的基础概念。

pipeline {    
	agent any // 在任何可用的代理上,执行流水线或它的任何阶段。    
	stages {        
		stage('Build') { 
		// 定义 "Build" 阶段。            
			steps {                
			// 执行与 "Build" 阶段相关的步骤。           
 			}       
  		}       
   		stage('Deploy') { 
  		 	// 定义 "Deploy" 阶段。           
    		steps {                
   	 		// 执行与 "Deploy" 阶段相关的步骤。           
			}       
		}    
	}
}
  • pipline:定义流水线整个结构,可以看做是根节点
  • agent:指示 Jenkins 为整个流水线分配一个执行器,比如可以配置 Docker
  • stages:对整个 CI 流的包裹,个人认为没多大用,还必须得有。
  • stage:可以理解为是对某一个环节的描述。注意:参数就是描述内容,可以是任何内容。不要想歪了只能传递 Build Deploy 这些。
  • steps:描述了 stage 中的步骤,可以存在多个。

了解到这里还是不够的。流水线入门[8] 流水线语法参考[9]

Pipline 复刻 Freestyle

这里先直接把配置贴出来。后续结合内容在进行分析。

// 自定义 钉钉插件 的 错误信息和成功信息
def successText = [
    ""
    " ### 新的构建信息,请注意查收"
    "",
    ""
    " ${env.JOB_BASE_NAME}任务构建<font color=green>成功</font> ,点击查看[构建任务 #${env.BUILD_NUMBER}](http://106.14.185.47:8080/job/${env.JOB_BASE_NAME}/${env.BUILD_NUMBER}/)
    ""
    "
]
def failureText = [
        ""
        " ### 新的构建信息,请注意查收"
        "",
        ""
        " ${env.JOB_BASE_NAME}任务构建<font color=red>失败</font> ,点击查看[构建任务 #${env.BUILD_NUMBER}](http://106.14.185.47:8080/job/${env.JOB_BASE_NAME}/${env.BUILD_NUMBER}/)"
        ""
    ]
    // 1,侦听 github push 事件
properties([pipelineTriggers([githubPush()])])
pipeline
{
    agent any // 环境变量定义。    
    environment
    {
        GIT_REPO = 'http://github.com/vue-ts-vite-temp.git'
    }
    stages
    {
        // 2,拉取 github 代码,通过 GitSCM 侦听 push 事件。        
        stage('Pull code')
        {
            steps
            {
                checkout(
                    [
                        $class: 'GitSCM',
                        branches: [
                            [name: '*/main']
                        ],
                        extensions: [],
                        userRemoteConfigs: [
                            [
                                credentialsId:
                                '381325e4-0f9c-41ea-b5f6-02f8ea2a475a',
                                url: env.GIT_REPO
                            ]
                        ],
                        changelog: true,
                        poll: true,
                    ]
                )
            }
        }
        stage('Install and build')
        {
            steps
            {
                // 3,前面安装过的 nodejs 插件使用                
                nodejs('v14.19.0')
                {
                    sh 'npm install yarn -g'
                    sh 'yarn install'
                    sh 'yarn build'
                }
            }
        }
        stage('Pack')
        {
            steps
            {
                sh 'tar -zcvf dist.tar.gz dist/'
                sh 'rm -rf dist/'
            }
        }
        stage('Deploy')
        {
            steps
            {
                // 4,前面下载的 Publish Over SSH 插件的使用                
                sshPublisher(
                    publishers: [
                        sshPublisherDesc(
                            configName: 'aliyun-dev',
                            transfers: [
                                sshTransfer(
                                    cleanRemote: false,
                                    excludes: '',
                                    execCommand: ''
                                    '                                        
                                    cd / usr / share / nginx /
                                    html /
                                    tar - zxvf dist.tar.gz rm -
                                    rf dist.tar.gz ''
                                    ',                                    
                                    execTimeout: 120000,
                                    flatten: false,
                                    makeEmptyDirs: false,
                                    noDefaultExcludes: false,
                                    patternSeparator: '[, ]+',
                                    remoteDirectory:
                                    '/usr/share/nginx/html/',
                                    remoteDirectorySDF: false,
                                    removePrefix: '',
                                    sourceFiles:
                                    'dist.tar.gz'
                                )
                            ],
                            usePromotionTimestamp: false,
                            useWorkspaceInPromotion: false,
                            verbose: false
                        )
                    ]
                )
            }
        }
    }
    post
    {
        success
        {
            // 5,DingTalk 插件的使用。            
            dingtalk(
                robot: '1314',
                type: 'ACTION_CARD',
                title: 'Jenkins构建提醒',
                text: successText,
                btns: [
                    [
                        title: '控制台',
                        actionUrl: 'http://106.14.185.11:8080/'
                    ],
                    [
                        title: '项目预览',
                        actionUrl: 'http://github.com/'
                    ],
                ],
                at: []
            )
        }
        failure
        {
            dingtalk(
                robot: '1314',
                type: 'ACTION_CARD',
                title: 'Jenkins构建提醒',
                text: failureText,
                btns: [
                    [
                        title: '控制台',
                        actionUrl: 'http://106.14.185.11:8080/'
                    ],
                    [
                        title: '项目预览',
                        actionUrl: 'http://github.com/'
                    ],
                ],
                at: [] // 这里是手机号多个之间,隔开            
            )
        }
    }
}

这么多内容手写无疑是很难受的,好在 Jenkins 提供了一些帮助工具。访问地址为:Jenkins地址 + /job + 当前任务 + /pipeline-syntax/,例如:http://localhost:8080/job/dev-deploy/pipeline-syntax/,或者进入任务构建页面,点击流水线语法进入

在这里插入图片描述

进入该页面后请熟读并背诵以下三项。重点放到第一项。

回头看上面的脚本注释都带有序号。根据注释序号开始解释。

  1. 在片段生成器中选择 properties: Set job properties 生成代码片段。由于只是使用了 git hook trigger 所以要对生成的片段稍作修改。
    在这里插入图片描述
  2. 如果不是为了侦听github push 选择 git: Git即可,但现在应该选择 checkout: Check out from version control,随后填写信息生成代码即可。

在这里插入图片描述
3. 选择 nodejs: Provide Node & npm bin/folder to Path
在这里插入图片描述
4. 选择 sshPublisher: Send build artifacts over SSH,像上面流水线一样配置之后直接生成代码即可。

在这里插入图片描述
5. DingTalk 文档

总结: 通过插件生成的代码,稍作组合就成为了完整的配置。但整体难度还是要略高于 Freestyle 任务。毕竟生成的代码有部分也不是拿来即用的,并且 Pipline 基本语法一定要有所掌握。不然生成的代码都不晓得放到哪里合适。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023-09-01 LeetCode每日一题(买钢笔和铅笔的方案数)

2023-09-01每日一题 一、题目编号 2240. 买钢笔和铅笔的方案数二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数 total &#xff0c;表示你拥有的总钱数。同时给你两个整数 cost1 和 cost2 &#xff0c;分别表示一支钢笔和一支铅笔的价格。你可以花费你部分或者…

小米面试题——不用加减乘除计算两数之和

前言 &#xff08;1&#xff09;刷B站看到一个面试题&#xff0c;不用加减乘除计算两数之和。 &#xff08;2&#xff09;当时我看到这个题目&#xff0c;第一反应就是感觉这是一个数电题目。不过需要采用C语言的方式编写出来。 &#xff08;3&#xff09;不过看到大佬的代码之…

3、QT 的基础控件的使用

一、qFileDialog 文件窗体 Header: #include <QFileDialog> qmake: QT widgets Inherits: QDialog静态函数接口&#xff1a; void Widget::on_pushButton_clicked() {//获取单个文件的路径名QString filename QFileDialog :: getOpenFileName(this, tr("Open Fi…

stencilJs学习之构建 Drawer 组件

前言 在之前的学习中&#xff0c;我们已经掌握了 stencilJs 中的一些核心概念和基础知识&#xff0c;如装饰器 Prop、State、Event、Listen、Method、Component 以及生命周期方法。这些知识是构建复杂组件和应用的基础&#xff0c;而抽屉组件是一个很好的示例&#xff0c;能够…

Ceph源码解析:PG peering

集群中的设备异常(异常OSD的添加删除操作)&#xff0c;会导致PG的各个副本间出现数据的不一致现象&#xff0c;这时就需要进行数据的恢复&#xff0c;让所有的副本都达到一致的状态。 一、OSD的故障和处理办法&#xff1a; 1. OSD的故障种类&#xff1a; 故障A&#xff1a;一…

使用Dbeaver连接GaussDB

1.下载DBeaver&#xff0c;官网地址 2.安装软件&#xff0c;打开软件&#xff0c;点击数据库->驱动管理器&#xff0c;具体操作如下图&#xff1a; 3、选择新建后进行参数设置&#xff0c;如下图&#xff1a; 具体参数如下图 驱动名称: GS #随便定义 驱动类型&#…

【STM32】学习笔记(串口通信)-江科大

串口通信 通信接口硬件电路电平标准USARTUSART框图 通信接口 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使用、通信线路简单&#xff0c;可实现两个设备的互相通信 单片机的串口可以使单片机与单片机、单片机与电脑、单片机与各式各样的模块互相通信&#…

【【Verilog典型电路设计之log函数的Verilog HDL设计】】

Verilog典型电路设计之log函数的Verilog HDL设计 log函数是一种典型的单目计算函数&#xff0c;与其相应的还有指数函数、三角函数等。对于单目计算函数的硬件加速器设计一般两种简单方法:一种是查找表的方式;一种是使用泰勒级数展开成多项式进行近似计算。这两种方式在设计方…

Linux学习之逻辑卷LVM用途和创建

理论基础 Linux文件系统建立在逻辑卷上&#xff0c;逻辑卷建立在物理卷上。 物理卷处于LVM中的最底层&#xff0c;可以将其理解为物理硬盘、硬盘分区或者RAID磁盘阵列&#xff0c;这都可以。卷组建立在物理卷之上&#xff0c;一个卷组可以包含多个物理卷&#xff0c;而且在卷组…

港交所MMDH行情协议

目录 一、交易时间 二、MMDH与OMD的差异 三、MMDH消息类型 四、MMDH的市场快照数据 内地市场数据枢纽-证券市场(OMD-MMDH) 港交所OMD-C对接笔记 - skylerjiang - 博客园 (cnblogs.com) 一、交易时间 图 1 港交所交易时间段 图 2 消息序列 二、MMDH与OMD的差异 图 3 标准…

时序预测 | MATLAB实现基于PSO-GRU、GRU时间序列预测对比

时序预测 | MATLAB实现基于PSO-GRU、GRU时间序列预测对比 目录 时序预测 | MATLAB实现基于PSO-GRU、GRU时间序列预测对比效果一览基本描述程序设计参考资料 效果一览 基本描述 MATLAB实现基于PSO-GRU、GRU时间序列预测对比。 1.MATLAB实现基于PSO-GRU、GRU时间序列预测对比&…

华为云 sfs 服务浅谈

以root用户登录弹性云服务器。 以root用户登录弹性云服务器。 安装NFS客户端。 查看系统是否安装NFS软件包。 CentOS、Red Hat、Oracle Enterprise Linux、SUSE、Euler OS、Fedora或OpenSUSE系统下&#xff0c;执行如下命令&#xff1a; rpm -qa|grep nfs Debian或Ubuntu系统下…

ssm+vue高校实验室管理系统源码和论文

ssmvue高校实验室管理系统源码和论文081 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 一&#xff0e;毕业设计的内容 本高校实验室管理系统采用Java语言、MySQL数据库&#xff0c;基于SSM框架进行开发设计&…

Spring Boot存在路径遍历漏洞CVE-2021-22118

文章目录 0.前言1.参考文档2.基础介绍1. 影响的版本2. **漏洞利用原理&#xff1a;** 3.解决方案3.1. 方案13.2. 方案23. 方案3 0.前言 背景&#xff1a;Spring Boot存在路径遍历漏洞。CVE-2021-22118: 官方 issue也有对此的记录&#xff0c;感兴趣可以看下 https://github.com…

雅思写作 三小时浓缩学习顾家北 笔记总结(二)

目录 饥饿网一百句翻译 Using government funds for pollution cleanup work can create a comfortable environment. "Allocating government funds to pollution cleanup work can contribute to the creation of a comfortable environment." Some advertise…

掌握逻辑漏洞复现技术,保护您的数字环境

环境准备 这篇文章旨在用于网络安全学习&#xff0c;请勿进行任何非法行为&#xff0c;否则后果自负。 1、支付逻辑漏洞 攻击相关介绍 介绍&#xff1a; 支付逻辑漏洞是指攻击者利用支付系统的漏洞&#xff0c;突破系统的限制&#xff0c;完成非法的支付操作。攻击者可以采…

Room的基本使用

参考&#xff1a;jetpack之Room数据库 目录 引言一、基本使用1. 导入相关引用2. 建表Entity3. 数据库操作类Dao4. 数据库RoomDatabase5. 简单使用 二、ViewModel LiveData Room 的结合开发1. 建表Entity2. 数据库操作类Dao3. 数据库RoomDatabase4. 仓库Repository5. ViewMode…

uniapp微信小程序用户隐私保护

使用wx.requirePrivacyAuthorize实现微信小程序用户隐私保护。 一、前言 微信小程序官方出了一个公告《关于小程序隐私保护指引设置的公告》。不整的话&#xff0c;后果很多授权无法使用&#xff0c;详见《小程序用户隐私保护指引内容介绍》 。 二、隐私相关设置 1、在 微信…

STM32的HAL库的定时器使用

用HAL库老是忘记了定时器中断怎么配置&#xff0c;该调用哪个回调函数。今天记录一下&#xff0c;下次再忘了就来翻一下。 系统的时钟配置&#xff0c;定时器的时钟是84MHz 这里定时器时钟是84M&#xff0c;分频是8400后&#xff0c;时基就是1/10000s&#xff0c;即0.1ms。Per…

CXL 内存交织(Memory Interleaving)

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…