当前位置: 首页 > news >正文

Jenkins实现CI/CD发布(Ansible/jenkins共享库/gitlab)

Jenkins实现多环境发布

1. 需求介绍

本人负责公司前端业务模块,由于前端模块较多,所以在编写jenkinsfile时会出现很多项目使用的大部分代码相同的情况,为解决这种问题,采用了jenkins的共享库方式优化,并且jenkins要支持多环境发布,我们有gray与online两个环境,可以确定的是每次gray环境都会优先更新,之后再更online环境;也会有大版本上线需同时更新的情况;有了需求就尽管写代码啦;

发布online环境的话要从已经部署后的gray环境拷贝,尽量做到一次编译,但配置文件各不相同,所以流程如下;

2. 模块介绍

  • jenkins:编译、UI发布;
  • gitlab:配置文件、共享库存储;
  • ansible:playbook方式发布;

3. 共享库建立

  1. 在gitlab上创建空项目并clone到本地(不做演示);
  2. 在jenkins的Manager Jenkins —>Configure System-→Global Pipeline Libraries中配置共享库的git地址;这里不做演示;
  3. 在项目中创建目录结构,如下所示;
shared_library/
├── README.md
├── resources
│   └── org
│       └── devops
├── src
│   └── org
│       └── devops
│           ├── build_deploy.groovy
│           ├── checkout_code.groovy
│           └── email_notification.groovy
└── vars7 directories, 4 files

2.1 共享库介绍

  • build_deploy.groovy
package org.devops// 定义编译函数,传入两个参数
// Env: 要发布的环境
// Buildcommand: 编译时的命令,由于多个项目可能编译命令不一样,所以这里以接收参数的方式;
def Build(Env,Buildcommand){if (Env == "gray") {
// 需求说明了,如果是灰度环境的话就要拉取源码进行编译,所以这里执行编译命令,并打印当前发布环境;sh Buildcommandprintln("gray环境")
// 如果是生产的话则不进行编译,直接从发布后的gray环境中复制即可;具体实现在playbook中;} else if(Env == "online"){println("生产环境不编译")
// 如果是全部发布的话则跟灰度一个逻辑,不过就是打印的结果不一样,如果打印无所谓的话也可以写到上面条件变成or;} else if(Env == "all"){sh Buildcommandprintln("全环境发布")}
}// 定义获取配置文件方法,传四个参数
// Env: 要发布的环境;
// project: gitlab对应的项目名称;
// filename: 配置文件的名称;
// path: 配置文件要放到哪个位置(主要是灰度环境用)
def Get_Config(Env,project,filename,path){if (Env == "gray") {
// 如果环境是灰度的话;先判断编译目录下是否有"gray_env"目录,有就删除;然后clone项目地址到本地的gray_env目录下,并且将项目中的配置文件挪到编译后的目录中;sh "`[ -d ./gray_env ] && rm -rf ./gray_env/ || :` && git clone ssh://git@xxxxx/xxx/${project} gray_env && mv -f gray_env/${filename} ./${path}"
// 如果是生产的话跟上面一样,不过目录名是online_env,将项目中的配置文件挪到编译目录;}else if(Env == "online"){sh "`[ -d ./online_env ] && rm -rf ./online_env/ || :` && git clone ssh://git@xxxx/xxxxx/${project} online_env && mv -f online_env/${filename} ./"
// 如果是全发布的话则两步都走;}else if(Env == "all"){sh "`[ -d ./gray_env ] && rm -rf ./gray_env/ || :` && git clone ssh://git@xxxx/xxx/${project} gray_env && mv -f gray_env/${filename} ./${path}"sh "`[ -d ./online_env ] && rm -rf ./online_env/ || :` && git clone ssh://git@xxxx/xxxx/${project} online_env && mv -f online_env/${filename} ./"}
}// 定义压缩编译后程序并发到目标服务器上
def compress_copy(Env){if (Env == "gray" || Env == "all") {
// 将目录打包名为"jenkins项目的名字".tar.gz文件,并忽略调本地的.svn目录sh "tar czf ${JOB_BASE_NAME}.tar.gz --exclude=.svn ./dist"
// 将文件传到发布机器的/tmp/目录下sh "scp -P50022  ${JOB_BASE_NAME}.tar.gz sysvideo@$ansible的机器地址:/tmp/"       }
}
//定义发布方法,传四个参数
// Env: 要发布的环境;
// file_path: playbook的路径,相对于"/etc/ansible/jenkins"目录的相对路径;
// config_name: 对应的配置文件名称
def Deploy(Env,file_path,config_name){if (Env == "gray") {
// 如果是灰度环境的话则跳过playbook中tags为online的步骤进行发布println("灰度环境跟以前线上环境发布一样")// sh "cd /etc/ansible/jenkins/$(dirname ${file_path}) && sudo ansible-playbook --skip-tags='online' -e update_file=/tmp/${JOB_BASE_NAME}.tar.gz ${file_path}"}else if(Env == "online") {
// 如果是online的话则需要先将配置文件拉到本机,也就是ansible这台机器上;随后调用下面的playbook中online的tags进行发布sh "sudo ansible-playbook -e config_name='${config_name}' -e job_name='${JOB_BASE_NAME}' /etc/ansible/jenkins/global/pull_config_from_jenkins.yml"println("发布生产环境,先把配置文件从jenkins拉到本地")// sh "ansible-playbook --tags=online /etc/ansible/jenkins/global/${file_path}"}else if(Env == "all") {sh "sudo ansible-playbook -e config_name='${config_name}' -e job_name='${JOB_BASE_NAME}' /etc/ansible/jenkins/global/pull_config_from_jenkins.yml"println("拉完配置文件之后,执行发布命令,默认会都跑一遍")// sh "cd /etc/ansible/jenkins/$(dirname ${file_path}) && sudo ansible-playbook -e update_file=/tmp/${JOB_BASE_NAME}.tar.gz ${file_path}"}
}
  • checkout_code.groovy
package org.devops
// 定义获取代码的通用方法,接收一个参数
// address: 代码所在的svn地址,仅支持SVN
def CheckOut_Code(address) {checkout (changelog: false,poll: false,scm: [$class: 'SubversionSCM',additionalCredentials: [],excludedCommitMessages: '',excludedRegions: '',excludedRevprop: '',excludedUsers: '',filterChangelog: false,ignoreDirPropChanges: false,includedRegions: '',locations: [[cancelProcessOnExternalsFail: true,credentialsId: 'svn_pass',depthOption: 'infinity',ignoreExternalsOption: true,local: '.',remote: address]],quietOperation: true,workspaceUpdater: [$class: 'UpdateUpdater']])
}
  • email_notification.groovy
package org.devops
// 定义通用发送邮件方法,接收一个参数;
// EmailUser: 收件人,默认为xxxx@netxx.com;
def send_mail(EmailUser = 'xxxx@netxx.com') {mail (subject: "Status of pipeline : ${currentBuild.fullDisplayName}",body: "${env.BUILD_URL} has result ${currentBuild.result}",to: EmailUser,from: "jenkins@jenkins.com")println(EmailUser)
}

4. pipeline编写

下面是其中一个实例,其它的可以按照这个模板去修改

// 引用共享库
@Library("shared_library") _
import org.devops.email_notification
def email_notification = new org.devops.email_notification()
def code = new org.devops.checkout_code()
def build_deploy = new org.devops.build_deploy()
pipeline {agent nonetools {nodejs "nodejs 14.18.2"}parameters {choice(choices: "gray\nonline\nall",description: "选择发布到哪个环境",name: "environment")string(name: "Code_Address",defaultValue: "None",description: "定义代码的SVN路径,默认为None")string(name: "Config_Name",defaultValue: "None",description: "前端文件的文件名,如果是gray的可以不用写;")}stages {stage("checkout code") {agent {label "master"}steps {script {/*1. 拉取代码,从SVN地址获取代码的位置;这里只考虑了SVN的情况,未考虑Git;2. 共享库位置在git,详情咨询kfreesre@163.com;*/code.CheckOut_Code("${Code_Address}")}}}stage("build and Get Config") {agent {label "master"}steps {script {/*1. Build将源码进行编译;参数解释:1. environment参数可固定;2. npm config set ...; 代表编译命令,根据实际情况修改;2. Get_Config从Git获取项目相关配置文件,environment参数可固定;参数解释:1. environment参数可固定;2. xxxx: 配置文件所在的git仓库名称;同一项目的灰度与生产名称一致,传入一个就行,可去git确认;3. production.js: 配置文件的名称;4. dist/static/js/: 当源码编译后,会在workspace中生成一个dist的目录,将3中的"production.js"拷贝到编译后的目录中;git上项目的描述中说明了具体位置;*/build_deploy.Build("${environment}","npm config set registry 私库地址 && npm install && npm run build")build_deploy.Get_Config("${environment}","xxxx","production.js","dist/static/js/")}}}stage("compress and copy") {agent {label "master"}steps {script {/* 1. 将编译后的dist目录打包为压缩包,命名为当前jenkins项目的名称;2. 随后将打包后的tar.gz文件发送到云视ansible的/tmp目录下;*/ build_deploy.compress_copy("${environment}")}}}stage("Deploy") {agent {label "Deploy"}steps {script {/*参数解释:1. environment可固定,不用修改会自动获取在点击构建时选择的环境;2. xxxx/ngin_update_all.yml是对应的anible yaml文件,这里填写相对路径,相对的是/etc/ansible/jenkins;*/build_deploy.Deploy("${environment}","xxxx/update_all.yml","${Config_Name}")}}}}post {always {script {/* 每次都发送邮件,默认发给"xxxx@xxx.com",如果要修改在send_mail()中传参即可,类似 email_notification.send_mail("xxxx.xxx@net.com"),如果有多个收件人可以逗号为分隔符*/email_notification.send_mail("xxxx@netxxx.com,xxxx.xx@netxxx.com")}}}}

5. playbook编写

  1. 编写online环境需要拉取配置文件的playbook
- hosts: jenkinsbecome: yesbecome_method: sudobecome_user: rootvars:- config_name: None- job_name: None# 这里写上jenkins工作目录,我这里TEST是jenkins-UI上创建的前端项目所在文件夹,所以固定;- config_path: /data/jenkins/workspace/TEST/{{job_name}}- local_config_path: Nonetasks:- name: Pull the configuration filefetch:src: "{{ config_path }}/{{ config_name }}"dest: /tmp/register: dest_path
  1. 编写online及gray环境发布的playbook(每个项目所在的目录不一样,所以发布的项目对应的playbook基于这个修改即可)
---
- hosts: - xxxx- xxxxbecome: yesbecome_method: sudobecome_user: rootvars:#  - update_path: /var/www/html/xxxx/pc/dist- gray_path: /var/www/html/gray/xxxx/pc/dist- online_path: /var/www/html/xxxx/pc/dist- update_file: default
# 这里就直接写死了,因为每个项目都对应一个playbook,不过还可以优化;- local_config_path: /tmp/jenkins/data/jenkins/workspace/TEST/xxx/production.jstasks:- name: register  datetime var(gray)command: date +%Y%m%d%H%M%Sregister: datetime- name: create a backup  directory if it does not exist(gray)file:# path: /home/backup/xxx/{{datetime.stdout}}# path: /home/backup/xxx/gray/{{datetime.stdout}}path: /home/backup/xxx/gray/{{datetime.stdout}}state: directorymode: '0755'- name: backup files(gray)command: tar -czf  /home/backup/xxx/gray/{{datetime.stdout}}/xxxx.tar.gz ./args:chdir: /var/www/html/xxx/gray/pc/- name: chmod dir chown videohy(gray)command: find {{gray_path}} -exec chown nginx:nginx  {} \;- name: Recursively remove directory(gray)file:path: "{{gray_path}}"state: absent- name: decompression to the target server(gray)unarchive:src: "{{update_file}}"dest: /var/www/html/xxx/gray/pccopy: yes- name: Copy from grayscale environmentcommand: cp -af {{gray_path}} $(dirname {{online_path}})tags: online- name: Copy the configuration file to the target servercopy:src: {{local_config_path}}dest: "{{online_path}}/static/js/production.js"tags: online- name: chmod file 0644command: find {{online_path}} -type f -exec chmod 0644 {} \;tags: online- name: chmod file 0755command: find {{online_path}} -type d -exec chmod 0755 {} \;tags: online- name: chmod dir chown nginxcommand: find {{online_path}} -exec chown nginx:nginx  {} \;tags: online- name: chmod file 0644command: find {{gray_path}} -type f -exec chmod 0644 {} \;- name: chmod file 0755command: find {{gray_path}} -type d -exec chmod 0755 {} \;- name: chmod dir chown nginxcommand: find {{gray_path}} -exec chown nginx:nginx  {} \;

相关文章:

Jenkins实现CI/CD发布(Ansible/jenkins共享库/gitlab)

Jenkins实现多环境发布 1. 需求介绍 本人负责公司前端业务模块,由于前端模块较多,所以在编写jenkinsfile时会出现很多项目使用的大部分代码相同的情况,为解决这种问题,采用了jenkins的共享库方式优化,并且jenkins要支持…...

使用navicat查看类型颜色

问题描述: 最近遇到一个mongodb的数据问题。 在date日期数据中,混入了string类型的数据,导致查询视图报错: $add only supports numeric or date types解决办法: 使用类型颜色工具。 找到在last_modified_date字段中…...

iOS 中,Atomic 修饰 NSString、 NSArray,也会线程不安全

众所周知,基础类型如 int、float 的变量被 atomic 修饰后就具有原子性,则线程安全。 然而有些情况,atomic 修饰后不一定是线程安全的。 atomic 修饰 NSString,NSArray 的时候,只是保障首地址(数组名&…...

2023医药微信公众号排名榜top100汇总合集

相信每个医药人都或多或少关注了几个医药微信公众号,便于日常了解到最新的医药新闻包括治疗技术、药物研发、研究成果、医学进展、临床试验进展、市场动向等前沿动态。 笔者也不列外,大大小小的公众号收集了有上百个,本着方便查看的目的&…...

基于YOLO算法的单目相机2D测量(工件尺寸和物体尺寸)三

1.简介 1.1 2D测量技术 基于单目相机的2D测量技术在许多领域中具有重要的背景和意义。 工业制造:在工业制造过程中,精确测量是确保产品质量和一致性的关键。基于单目相机的2D测量技术可以用于检测和测量零件尺寸、位置、形状等参数,进而实…...

Cython编译文件出错

报错信息: (rpc) stuamax:~/segment/dss_crf$ python setup.py install Compiling pydensecrf/eigen.pyx because it changed. Compiling pydensecrf/densecrf.pyx because it changed. [1/2] Cythonizing pydensecrf/densecrf.pyx /home/stu/anaconda3/envs/rpc/l…...

WPF 用户控件依赖注入赋值

前言 我一直想组件化得去开发WPF&#xff0c;因为我觉得将复杂问题简单化是最好的 如何组件化开发 主窗口引用 <Window x:Class"WpfApp1.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.…...

leetcode-48.旋转图像

1. 题目 leetcode题目链接 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 2. 编程 矩阵转置&#xff1a; 遍历矩阵&#x…...

antd的RangePicker设置默认值,默认近七天(andt+react)

import moment from "moment";state {initData:[moment().startOf(day).subtract(6, d), moment().endOf(day)], }<FormItem label"产生时间" {...tailItemLayout}>{getFieldDecorator("produceTime", {initialValue: initData})(<Ran…...

大数据可视化模块竞赛Vue项目文件结构与注意事项

1.vue项目src目录下只有两个文件夹与两个js文件,如图所示: 2.asseets目录存放包或其他外部资料 注意 :echarts采用的是引用外部文件导入 let echarts = require(@/assets/echarts.min.js) 3.components目录存放绘制页面的vue文件(我这里示例创建了一个newPage.vue)…...

户外运动盛行,运动品牌如何利用软文推广脱颖而出?

全民健康意识的提升和城市居民对亲近自然的渴望带来户外运动的盛行&#xff0c;这也使运动品牌的市场保持强劲发展势头&#xff0c;那么在激烈的市场竞争中&#xff0c;运动品牌应该如何脱颖而出呢&#xff1f;下面就让媒介盒子告诉你&#xff01; 一、 分享户外运动干货 用户…...

2024年孝感市建筑类中级职称申报资料私企VS国企

2024年孝感市建筑类中级职称申报资料私企VS国企 民营企业中级职称申报跟事业单位或者是国企申报中级职称流程不一样么&#xff1f;实际上流程基本都是相同的&#xff0c;就是提交纸质版资料有点不一样。 孝感市建筑类中级职称申报基本流程 1.参加建筑类中级职称水平能力测试。 …...

OpenResty安装

OpenResty 是一个基于 Nginx 的 Web 平台&#xff0c;它将 Nginx 和 Lua 脚本语言结合起来&#xff0c;提供了更强大的 Web 应用开发和部署能力。OpenResty 仓库是 OpenResty 项目的官方仓库&#xff0c;包含了 OpenResty 的源代码、文档、示例等资源。 OpenResty 仓库地址是&…...

通过stream对list集合中对象的多个字段进行去重

记录下通过stream流对list集合中对象的多个字段进行去重&#xff01; 举个栗子&#xff0c;对象book&#xff0c;我们要通过姓名和价格这两个字段的值进行去重&#xff0c;该这么做呢&#xff1f; distinct&#xff08;&#xff09;返回由该流的不同元素组成的流。distinct&am…...

招投标系统软件源码,招投标全流程在线化管理

功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查看所…...

css设置文本溢出隐藏...

在CSS中&#xff0c;文本溢出可以使用text-overflow属性来处理&#xff0c;下面分别介绍单行文本溢出和多行文本溢出的处理方法1&#xff1a; 单行文本溢出。需要使用text-overflow: ellipsis;来显示省略号。需要注意的是&#xff0c;为了兼容部分浏览器&#xff0c;还需要设置…...

【小尘送书-第八期】《小团队管理:如何轻松带出1+1>2的团队》

大家好&#xff0c;我是小尘&#xff0c;欢迎你的关注&#xff01;大家可以一起交流学习&#xff01;欢迎大家在CSDN后台私信我&#xff01;一起讨论学习&#xff0c;讨论如何找到满意的工作&#xff01; &#x1f468;‍&#x1f4bb;博主主页&#xff1a;小尘要自信 &#x1…...

【网络协议】聊聊ifconfig

我们知道在linux是ifconfig查看ip地址&#xff0c;但是ip addr也可以查看 IP 地址是一个网卡在网络世界的通讯地址&#xff0c;相当于我们现实世界的门牌号码。 从IP地址的划分来看&#xff0c;C类地址只可以容纳254个&#xff0c;而B类6W多&#xff0c;那么又没有一种折中的…...

python项目之AI动物识别工具的设计与实现(django)

项目介绍&#xff1a; &#x1f495;&#x1f495;作者&#xff1a;落落 &#x1f495;&#x1f495;个人简介&#xff1a;混迹java圈十余年&#xff0c;擅长Java、小程序、Python等。 &#x1f495;&#x1f495;各类成品java毕设 。javaweb&#xff0c;ssm&#xff0c;spring…...

全流量安全分析发现内部系统外联异常

内部系统外连监控的重要性在于保护企业的信息安全和预防数据泄露&#xff0c;以下是几个重要的理由&#xff1a; 1、检测异常活动&#xff1a;通过监控内部系统的外连连接&#xff0c;可以及时发现是否有未经授权或异常的链接尝试。这可能表示存在恶意软件、黑客攻击或内部员工…...

Edge---微软浏览器-兼容性问题-解决办法(详细)

图片现象&#xff1a; 快捷键&#xff1a;winR &#xff08;进入管理员命令窗口&#xff09; 输入&#xff1a;regedit &#xff08;进入注册表编辑器&#xff09; 点击文件夹&#xff1a;HKEY_LOCAL_MACHINE 找到这个路径的文件项&#xff1a;HKEY_LOCAL_MACHINE\SOFTWARE…...

for循环遍历的`form表单组件`rules规则校验失效问题——下拉框选择之后还是报红---亲测有效

问题: 大概的效果就是这种, for循环选择之后还是还是报红 看文章之前 : 先检查 model rules pops 有没有判定好 解决: 参考了他的 for循环遍历的form表单组件rules规则校验失效问题——输入内容后依然提示必填&#xff0c;亲测有效——基础积累_a-form-model的validat…...

【Python数据分析工具】

文章目录 概要整体架构流程技术名词解释 概要 数据分析是一种通过收集、处理、分析和解释大量数据&#xff0c;以发现有价值信息、洞察趋势、制定决策并解决问题的过程。在现代科技和互联网的推动下&#xff0c;数据分析变得日益重要。它不仅仅是对数字和图表的简单解释&#…...

Python数据挖掘入门进阶与实用案例:自动售货机销售数据分析与应用

文章目录 写在前面01 案例背景02 分析目标03 分析过程04 数据预处理1. 清洗数据2.属性选择3.属性规约 05 销售数据可视化分析1.销售额和自动售货机数量的关系2.订单数量和自动售货机数量的关系3.畅销和滞销商品4.自动售货机的销售情况5.订单支付方式占比6.各消费时段的订单用户…...

2.3_9吸烟者问题

...

位运算基础知识及性质(精简总结)

目录 简介 基础知识 常用性质 简介 程计算机中的数在内存中都是以二进制形式进行存储的&#xff0c;用位运算就是直接对整数在内存中的二进制位进行操作&#xff0c;因此其执行效率非常高&#xff0c;在程序中尽量使用位运算进行操作&#xff0c;这会大大提高程序的性能。 基…...

阵列信号处理_对比常规波束形成法(CBF)和Capon算法

空间谱估计 利用电磁波信号来获取目标或信源相对天线阵列的角度信息的方式&#xff0c;也称测向、波达方向估计&#xff08;DOA&#xff09;。主要应用于雷达、通信、电子对抗和侦察等领域。 发展 常规波束形成&#xff08;CBF&#xff09;。本质是时域傅里叶变换在空域直接…...

通过循环生成多个echarts图表并实现自适应

不推荐使用grid布局&#xff0c;不清楚为什么左边一列的不会自适应&#xff0c;换成flex布局就可以了 主要方法借助中的getInstanceByDom方法 完整代码&#xff1a; <template><div class"statis"><div class"content" ><!-- v-for …...

MySQL——六、库表操作(下篇)

MySQL 一、INSERT语句二、REPLACE语句三、UPDATE语句四、delete和TRUNCATE语句五、MySQL用户授权1、密码策略2、用户授权和撤销授权 一、INSERT语句 #在表里面插入数据&#xff1a;默认情况下&#xff0c;一次插入操作只插入一行 方式1&#xff1a; INSERT [INTO] 表名 [(colu…...

自动化办公篇之python批量改名

#批量命名 import xlwings as xw app xw.App(visibleFalse,add_bookFalse) workbook app.books.open("测试表.xlsx") for sheet in workbook.sheets:sheet.namesheet.name.replace("彩印之","银河") workbook.save() app.quit()...

Android MediaCodec将h264实时视频流数据解码为yuv,并转换yuv的颜色格式为nv21

初始化mediacodec private MediaCodec mediaCodec;private ByteBuffer[] inputBuffers;private void initMediaCodec(Surface surface) {try {Log.d(TAG, "onGetNetVideoData: ");//创建解码器 H264的Type为 AACmediaCodec MediaCodec.createDecoderByType("v…...

Postgresql SQL 字段拼接

本文介绍Postgresql 数据库sql字段拼接的方法。 1.使用字符串连接函数 select pkey || - || vname as "项目-版本" from test_jira_project_verison; 2.使用字符串连接操作符 select CONCAT(pkey, -, vname) as "项目-版本" from test_jira_project_ve…...

MySQL 迁移完不能快速导数据了?

关于 5.6 升级到 5.7 之后&#xff0c;GTID 的相关功能的注意事项。 作者&#xff1a;秦福朗&#xff0c;爱可生 DBA 团是队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。热爱互联网&#xff0c;会摄影、懂厨艺&#xff0c;不会厨艺的 DBA 不是好司机&#xff0c;…...

Lazysysadmin靶机

信息收集 主机发现 nmap -sn 192.168.88.0/24 //-sn&#xff1a;制作主机发现&#xff0c;不做端口扫描&#xff1b;扫描结果包含本机IP 端口扫描 nmap --min-rate 10000 -p- 192.168.88.136 扫描端口详细信息 端口扫描发现&#xff0c;该主机的22、80、139、445、3306、…...

LeetCode09——回文数

LeetCode09 自己写的解,转化为字符串再反转&#xff0c;比较笨。 import java.util.Scanner; public class Result01 {public static void main(String[] args) {System.out.println("请输入整数&#xff0c;我来帮您判断是否是回文数。");Scanner scanner new Sc…...

云安全—分布式基础

0x00 前言 云必然是依赖于分布式技术来进行实现的&#xff0c;所以有必要学习和来了解分布式相关的内容 0x01 分布式计算 1.基本概述 分布式计算的定义&#xff1a;通过网络互联的计算机都具有一定的计算能力&#xff0c;他们之间互相传递数据&#xff0c;实现信息共享&…...

Spring(18) @Order注解介绍、使用、底层原理

目录 一、简介二、List 注入使用示例2.1 测试接口类2.2 测试接口实现类12.3 测试接口实现类22.4 启动类&#xff08;测试&#xff09;2.5 测试结果场景一&#xff1a;场景二&#xff1a; 三、CommandLineRunner 使用示例3.1 接口实现类13.2 接口实现类23.3 测试结果场景一&…...

目标检测YOLO实战应用案例100讲-基于改进YOLOv6的轧钢表面细小缺陷检测

目录 前言 存在的问题 轧钢缺陷图像特征分析 2.1单一类型缺陷 2.2面状缺陷...

leetcode:507. 完美数(python3解法)

难度&#xff1a;简单 对于一个 正整数&#xff0c;如果它和除了它自身以外的所有 正因子 之和相等&#xff0c;我们称它为 「完美数」。 给定一个 整数 n&#xff0c; 如果是完美数&#xff0c;返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;num…...

智能物联网解决方案:蓝牙IOT主控模块打造高效监测和超低功耗

物联网蓝牙模块&#xff0c;无论单模&#xff0c;还是双模&#xff0c;或者双模音频的选择&#xff0c;如下文说描述&#xff1a; 蓝牙芯片模块市场的百花齐放&#xff0c;也带来的工程师在选型时碰到很大的困难&#xff0c;但是无论是做半成品&#xff0c;还是做成品&#xf…...

vue 拿到数据后,没有重新渲染视图,nuxt.js拿到数据后,没有重新渲染视图,强制更新视图

以下为Vue2的解决方案 一、 Vue.set&#xff08;&#xff09; 问&#xff1a;什么情况下使用&#xff1f; 答&#xff1a;如果你向响应式数据添加新的“属性”&#xff0c;理论上&#xff0c;一般情况下是没问题的&#xff0c;但是&#xff0c;如果你的级别比较深&#xff0c;又…...

Docker基础操作命令演示

Docker中的常见命令&#xff0c;可以参考官方文档&#xff1a;https://docs.docker.com/engine/reference/commandline/cli/ 1、常见命令介绍 其中&#xff0c;比较常见的命令有&#xff1a; 命令说明文档地址docker pull拉取镜像docker pulldocker push推送镜像到DockerReg…...

XTU-OJ 1175-Change

题目描述 一个班有N个学生&#xff0c;每个学生有第一学期成绩Xi,第二学期成绩Yi&#xff0c;请问成绩上升&#xff0c;持平&#xff0c;下降的人数。 输入 每个样例的第一行是整数N(0≤N≤50),如果N0&#xff0c;表示输入结束&#xff0c;这个样例不需要处理。 第二行是N个整数…...

Python环境安装

环境安装 Windows安装Linux安装 Windows安装 下载最新版Python https://www.python.org/downloads 打开安装包 选择安装路径&#xff0c;安装 安装 验证安装是否成功&#xff0c;命令行输入python Linux安装 安装依赖环境 yum install wget zlib-devel bzip2-devel op…...

苏轼在密州的四首千古名作

苏轼&#xff0c;一个从诗歌王国掉落人间的落魄贵族&#xff0c;整个政治生涯几乎都以流浪为主&#xff0c;在古诗词世界或许只有李白与之最是相似&#xff0c;不过李白的流浪属于荡歌山水、云游四方&#xff0c;而苏轼的流浪则带有被动的成分&#xff1a;一纸贬黜公文就是苏轼…...

[计算机提升] 域及域用户(组)

1.3 域及域用户(组) 1.3.1 域的概念 在Windows操作系统中&#xff0c;域&#xff08;Domain&#xff09;是指一个或多个计算机或资源的集合&#xff0c;这些计算机或资源受到单个安全数据库&#xff08;域控制器&#xff09;的管理和控制。域可以包含多个计算机、用户、组和其…...

命令行配置文件

在说具体的配置方式之前&#xff0c;我们需要首先梳理清除几个概念。这有助于我们明白自己在做什么&#xff0c;以及如何把经验平移到其他方面。 和命令行相关的有几个概念&#xff1a;terminal&#xff08;终端&#xff09;、shell&#xff08;解释器&#xff09;&#xff1b…...

MPP产品介绍-定位-应用场景-技术特点

产品定位 FusionInsight LibrA是企业级的大规模并行处理关系型数据库。FusionInsight LibrA采用MPP(Massive Parallel Processing)架构&#xff0c;支持行存储与列存储&#xff0c;提供PB(Petabyte&#xff0c;2的50次方字节)级别数据量的处理能力。 FusionInsight LibrA在核…...

Linux性能优化--性能工具:磁盘I/O

6.0 概述 本章介绍的性能工具能帮助你评估磁盘I/O子系统的使用情况。这些工具可以展示哪些磁盘或分区已被使用&#xff0c;每个磁盘处理了多少I/O,发给这些磁盘的I/O请求要等多久才被处理。 阅读本章后&#xff0c;你将能够&#xff1a; 确定系统内磁盘I/O的总量和类型(读/写…...

Archive Team: The Twitter Stream Grab

该集合不再更新&#xff0c;应被视为静态数据集。 从一般 Twitter 流中抓取的 JSON 的简单集合&#xff0c;用于研究、历史、测试和记忆的目的。这是“Spritzer”版本&#xff0c;最轻、最浅的 Twitter 抓取。不幸的是&#xff0c;我们目前无法访问流的洒水器或花园软管版本。 …...