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

Jenkins--从入门到入土

Jenkins–从入门到入土

文章目录

  • Jenkins--从入门到入土
    • 〇、概念提要--什么是CI/DI?
      • 1、CI(Continuous Integration,持续集成)
      • 2、DI(DevOps Integration,DevOps 集成)
      • 3、解决的问题
    • 一、Jenkins安装部署
      • 1、什么是Jenkins?
      • 2、Jenkins在开发过程中所属位置
      • 3、安装硬件环境和知识储备
      • 4、安装
        • 4.1、下载war启动
        • 4.2、Docker启动
        • 4.3、windows使用驱动安装
      • 5、使用插件自定义 Jenkins
      • 6、创建第一个管理员用户
    • 二、Jenkins配置
      • 1、环境配置
        • 1.1、更换站点镜像
        • 1.2、全局工具的配置
      • 2、用户权限配置
      • 3、插件介绍
    • 三、配置自动化任务--自由风格
      • 1、两种执行方法
      • 2、安装插件
      • 3、搭建GitLab
        • 3.1、从docker compose快速搭建GitLab
        • 3.2、上传到服务器
      • 4、github整合Jenkins
        • 4.1、关联github
        • 4.2、Jenkins中的github的配置
        • 4.3、新建任务
        • 4.4、立即构建
        • 4.5、Github代码更新之后触发构建
    • 四、配置自动化任务--Pipeline
      • 1、安装Blue Ocean插件
      • 2、新建Github测试项目
      • 3、编写Jenkinsfile文件
      • 4、推送到github项目中
      • 5、操作流水线Blue Ocean
      • 6、选择仓库创建流水线

温馨提示:由于本文档写的比较杂,基本讲了很多东西,所以自己根据目录筛选自己需要的部分。

〇、概念提要–什么是CI/DI?

1、CI(Continuous Integration,持续集成)

  • 定义:持续集成是一种软件开发实践,开发人员频繁地将代码更改集成到共享代码库中。每次集成都触发自动构建和测试,以尽早发现错误并提高软件质量。
  • 关键特点
    • 频繁集成:开发人员每天多次将代码提交到版本控制系统。
    • 自动化构建和测试:每次提交代码后,系统会自动构建项目并运行自动化测试。
    • 快速反馈:开发人员可以迅速知道他们的代码是否引入了错误。
    • 集成工具:常用工具包括Jenkins、Travis CI、CircleCI等。

2、DI(DevOps Integration,DevOps 集成)

  • 定义:DevOps集成是一种将开发和运维团队的工作流程、工具和文化相结合的实践,旨在提高软件开发和交付的速度和质量。
  • 关键特点
    • 自动化:通过自动化的构建、测试、部署和监控,减少手动干预,降低错误率。
    • 持续交付(CD):实现代码从开发到生产环境的自动化部署。
    • 协作:开发和运维团队紧密合作,共享责任,共同优化流程。
    • 常用工具:包括Docker、Kubernetes、Ansible、Puppet、Chef等。

3、解决的问题

CI和DI在计算机领域分别强调持续集成和DevOps实践中的集成部分,通过自动化和协作提高软件开发和交付的效率和质量。

持续的集成部署解决了很多问题,使得工作变成一种流程的形式,我们就负责编码(code)的内容,其他环节都是自动化的部署完成。

image-20240524153806030

“You build it , you run it !”

一、Jenkins安装部署

1、什么是Jenkins?

image-20240521144411533

Build great things at any scale,The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project.

Jenkins官方 ,Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。

Jenkins文档下载

2、Jenkins在开发过程中所属位置

主流软件开发流程:

Jenkins在Kubernetes中持续部署

3、安装硬件环境和知识储备

机器要求:

  • 256 MB 内存,建议大于 512 MB

  • 10 GB 的硬盘空间(用于 Jenkins 和 Docker 镜像)

环境要求:

  • Java8(由于Jenkins是由Java语言编写,所以需要 JRE 或者 JDK环境)
  • Docker (导航到网站顶部的Get Docker链接以访问适合您平台的Docker下载

4、安装

4.1、下载war启动
  1. 下载War包:http://mirrors.jenkins.io/war-stable/latest/jenkins.war

    mkdir -p /opt/jenkins
    wget -O /opt/jenkins/jenkins.war http://mirrors.jenkins.io/war-stable/latest/jenkins.war
    
  2. 打开终端进入到下载目录.

     cd /opt/jenkins
    
  3. 运行命令 java -jar jenkins.war --httpPort=8080.

    java -jar jenkins.war --httpPort=8080
    
  4. 打开浏览器进入链接 http://localhost:8080.

    image-20240524105733698

  5. 按照说明完成安装.

参考链接https://www.jenkins.io/zh/doc/pipeline/tour/getting-started/

4.2、Docker启动

docker安装文档:在CentOS中安装Docker

  1. 搜索Docker镜像:

    版本选择:

    Jenkins: https://hub.docker.com/r/jenkins/jenkins/

    Jenkins with Blue Ocean: https://hub.docker.com/r/jenkinsci/blueocean

    image-20240522180452702

    使用命令:

    docker pull jenkins/jenkins#24版本的docker镜像,因为我发现存在问题,当安装依赖的时候,换个版本可以。
    docker pull  jenkins/jenkins:2.459-jdk17
    
  2. 在Docker中设置桥接网络

    docker network create jenkins
    
  3. 启动(三组命令,自行甄别)

    # 官方给出的命令
    docker run \--name jenkins-docker \--rm \--detach \--privileged \--network jenkins \--network-alias docker \--env DOCKER_TLS_CERTDIR=/certs \--volume jenkins-docker-certs:/certs/client \--volume jenkins-data:/var/jenkins_home \--publish 2376:2376 \docker:dind \--storage-driver overlay2# Jenkins
    docker run \-itd \-u root \-p 8080:8080 \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \-v /usr/bin/docker:/usr/bin/docker \--name jenkins-master \jenkins/jenkins#Jenkins blueoceandocker run  \-itd  \-u root   \-p 8080:8079   \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock  \-v /usr/bin/docker:/usr/bin/docker \--name jenkins-master \jenkinsci/blueocean# Jenkins 2.459 版本docker run  \-itd  \-u root   \-p 8080:8080   \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock  \-v /usr/bin/docker:/usr/bin/docker \--name jenkins-master \jenkins/jenkins:2.459-jdk17
  4. 查看启动状态:

    docker ps
    

    image-20240524162358779

  5. 查看日志

    docker logs jenkins-master  
    

    后面的参数是容器的参数,重点看下面这个:

    image-20240524162519031

  6. 访问:http://192.168.200.128:2376/

参考文档:https://www.jenkins.io/doc/book/installing/docker/

4.3、windows使用驱动安装
  1. 首先下载镜像:官网

    image-20240522185553500

  2. 确保安装了Java环境,并且安装环境变量,我这里使用JDK 21演示

    image-20240522185714105

  3. Jenkins启动

    image-20240522185926936

    image-20240522190957509

    image-20240522191052458

    image-20240522191140747

    image-20240522191216798

    image-20240522191230811

    image-20240522191245707

    image-20240522191257725

    安装完成!

  4. 打开安装目录,我的在E:\Software\Jenkins,安装中有涉及,请留意。

    image-20240522191642821

  5. 打开jenkins.xml配置文件,设置Jenkins环境变量和Java环境变量

    image-20240522192012862

    换成:

    image-20240522192342863

    但是我发现配置不修改应该也是可以运行的,只是官方这样操作的,我只换了JAVA_HOME

  6. 搜索service,打开Jenkins服务。

    image-20240522193156980

    在这里插入图片描述

  7. 浏览器访问预先设置好的端口http://localhost:8079/:

    image-20240522193448151

  8. 查看管理员密码image-20240522193720322

    image-20240522193800820

5、使用插件自定义 Jenkins

解锁 Jenkins后,会出现**“自定义 Jenkins”**页面。在这里,您可以安装任意数量的有用插件作为初始设置的一部分。

单击显示的两个选项之一:

  • 安装建议的插件- 安装推荐的插件集,这些插件基于最常见的用例。
  • 选择要安装的插件- 选择最初安装的插件集。当您第一次访问插件选择页面时,默认选择建议的插件。

设置向导显示 Jenkins 的配置进度以及您选择的 Jenkins 插件安装集。此过程可能需要几分钟。

如果不确定需要什么插件,请选择安装建议的插件。您可以稍后通过 Jenkins 中的管理 Jenkins > 插件页面安装(或删除)其他 Jenkins 插件。

6、创建第一个管理员用户

最后,在使用插件自定义 Jenkins后,Jenkins 会要求您创建第一个管理员用户。

  1. 当**“创建第一个管理员用户”**页面出现时,在相应字段中指定管理员用户的详细信息,然后单击“保存并完成”
  2. Jenkins 就绪页面出现时,单击Start using Jenkins
  3. 如果需要,请使用您刚刚创建的用户凭据登录 Jenkins,然后就可以开始使用 Jenkins 了!

二、Jenkins配置

1、环境配置

1.1、更换站点镜像

具体流程:

image-20240524170556997

将升级站点的URL更换成清华镜像:

https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/current/update-center.json

这样插件下载就会从镜像进行下载,相对来说下载更快。

1.2、全局工具的配置

image-20240524180523227

  • JDK:

    image-20240524180548087

  • Git:

    image-20240524180612658

还有其他环境中的工具配置。

2、用户权限配置

  • 矩阵权限的配置

  • 添加管理员用户所有的权限

  • 添加Authorize Project | Jenkins plugin)插件,并且在系统管理中进行配置。配置逻辑,就给用户当前项目的矩阵权限!

    示例:

    image-20240524180316934

3、插件介绍

  • Publish over SSH

    这个是一个远程Shell工具,可以远程去执行一些shell命令

  • HTTP Request Plugin

    跨平台调用,在构建前后可以通过该插件以http形式调用各种api接口实现和内部系统的联动

  • Publish Over FTP

    用于远程使用FTP发布,比较合适于静态资源的发布。

  • Performance Plugin

​ 该插件可以读取和解析测试框架输出的报告,并且在 Jenkins 上绘制性能和稳定性相关的图表。Performance Plugin 支持的测试框架有 JUnit、JMeter, Twitter 的 Lago 和 Taurus。

​ https://plugins.jenkins.io/performance

  • Gitlab Merge Request Builder Plugin

​ Gitlab Merge Request Builder Plugin 可以方便的自动发起代码审查,它在创建 pull request 的时候,会自动带上关联任务的运行结果,以方便代码审查着确认改动的正确性。

​ 同时,这款插件还支持自动合并,既在代码审查通过后自动合并该 pull request 内容。

​ https://github.com/timols/jenkins-gitlab-merge-request-builder-plugin

  • JIRA Plugin

​ JIRA Plugin 可以让 Jenkins 任务和 JIRA 集成起来,这样项目管理者可以通过 JIRA 了解项目进度,开发者也可以通过该插件直接更改 JIRA 上的 issue 状态。

​ https://plugins.jenkins.io/jira

  • Kubernetes Plugin

​ 和最近大热的容器编排框架 Kubernetes 集成当然不能落下了。另外,Jenkins 对执行机的管理一直比较弱,无法做到快速的扩容和缩容。Kubernetes Plugin 通过引入 Kubernetes 的容器编排能力,让 Jenkins 执行机运行在 Kubernetes 环境中。

​ https://github.com/jenkinsci/kubernetes-plugin

  • Build Pipeline plugin

    https://github.com/jenkinsci/build-pipeline-plugin

​ 对一个系统的持续集成会包含很多个方面,如果将它们都杂糅在一个 Jenkins 任务中,会提高排查成本,也不利于整个持续集成的运作。Build Pipeline plugin 可以让项目管理员针对系统持续集成步骤设置一系列关联的任务,任务之间可以设置不同的触发条件,以确认何时需要人工介入。该插件可以让整个持续集成流程变得非常直观:

image-20240524181357541

上述内容部分参考于链接:https://www.jianshu.com/p/6bcb2853fae2

三、配置自动化任务–自由风格

1、两种执行方法

  • 配置自由风格的项目
  • 配置Pipeline使用Jenkinsfile

2、安装插件

  • 版本控制

    • github
    • gitlab

    image-20240524182419991

  • SSH

    • SSH
    • Publish Over SSH
    • SSH Agent
    • SSH Pipeline Steps

    image-20240524182126772

3、搭建GitLab

3.1、从docker compose快速搭建GitLab

这里我们使用GitLab来测试。

使用docker compose在docker环境下快速部署:

搭建docker compose环境参考文章:docker compose快速安装

学习docker compose参考文章(本篇博客不需要,只是推荐学习)DockerCompose(初识、安装、部署) Docker Compose 命令说明文档

docker-compose.yaml文件链接:https://github.com/sameersbn/docker-gitlab/blob/master/docker-compose.yml

image-20240524183353761

可以点击下载,也可以新建docker-compose.yaml文件,将内容复制粘贴。

也可以直接复制(但是建议从官网下载,可能版本会更新之类的):

version: '2.3'services:redis:restart: alwaysimage: redis:6.2command:- --loglevel warningvolumes:- redis-data:/data:Zpostgresql:restart: alwaysimage: sameersbn/postgresql:14-20230628volumes:- postgresql-data:/var/lib/postgresql:Zenvironment:- DB_USER=gitlab- DB_PASS=password- DB_NAME=gitlabhq_production- DB_EXTENSION=pg_trgm,btree_gistgitlab:restart: alwaysimage: sameersbn/gitlab:17.0.0depends_on:- redis- postgresqlports:- "10080:80"- "10022:22"volumes:- gitlab-data:/home/git/data:Zhealthcheck:test: ["CMD", "/usr/local/sbin/healthcheck"]interval: 5mtimeout: 10sretries: 3start_period: 5menvironment:- DEBUG=false- DB_ADAPTER=postgresql- DB_HOST=postgresql- DB_PORT=5432- DB_USER=gitlab- DB_PASS=password- DB_NAME=gitlabhq_production- REDIS_HOST=redis- REDIS_PORT=6379- TZ=Asia/Kolkata- GITLAB_TIMEZONE=Kolkata- GITLAB_HTTPS=false- SSL_SELF_SIGNED=false- GITLAB_HOST=- GITLAB_PORT=10080- GITLAB_SSH_PORT=10022- GITLAB_RELATIVE_URL_ROOT=- GITLAB_SECRETS_DB_KEY_BASE=long-and-random-alphanumeric-string- GITLAB_SECRETS_SECRET_KEY_BASE=long-and-random-alphanumeric-string- GITLAB_SECRETS_OTP_KEY_BASE=long-and-random-alphanumeric-string- GITLAB_ROOT_PASSWORD=- GITLAB_ROOT_EMAIL=- GITLAB_NOTIFY_ON_BROKEN_BUILDS=true- GITLAB_NOTIFY_PUSHER=false- GITLAB_EMAIL=notifications@example.com- GITLAB_EMAIL_REPLY_TO=noreply@example.com- GITLAB_INCOMING_EMAIL_ADDRESS=reply@example.com- GITLAB_BACKUP_SCHEDULE=daily- GITLAB_BACKUP_TIME=01:00- SMTP_ENABLED=false- SMTP_DOMAIN=www.example.com- SMTP_HOST=smtp.gmail.com- SMTP_PORT=587- SMTP_USER=mailer@example.com- SMTP_PASS=password- SMTP_STARTTLS=true- SMTP_AUTHENTICATION=login- IMAP_ENABLED=false- IMAP_HOST=imap.gmail.com- IMAP_PORT=993- IMAP_USER=mailer@example.com- IMAP_PASS=password- IMAP_SSL=true- IMAP_STARTTLS=false- OAUTH_ENABLED=false- OAUTH_AUTO_SIGN_IN_WITH_PROVIDER=- OAUTH_ALLOW_SSO=- OAUTH_BLOCK_AUTO_CREATED_USERS=true- OAUTH_AUTO_LINK_LDAP_USER=false- OAUTH_AUTO_LINK_SAML_USER=false- OAUTH_EXTERNAL_PROVIDERS=- OAUTH_CAS3_LABEL=cas3- OAUTH_CAS3_SERVER=- OAUTH_CAS3_DISABLE_SSL_VERIFICATION=false- OAUTH_CAS3_LOGIN_URL=/cas/login- OAUTH_CAS3_VALIDATE_URL=/cas/p3/serviceValidate- OAUTH_CAS3_LOGOUT_URL=/cas/logout- OAUTH_GOOGLE_API_KEY=- OAUTH_GOOGLE_APP_SECRET=- OAUTH_GOOGLE_RESTRICT_DOMAIN=- OAUTH_FACEBOOK_API_KEY=- OAUTH_FACEBOOK_APP_SECRET=- OAUTH_TWITTER_API_KEY=- OAUTH_TWITTER_APP_SECRET=- OAUTH_GITHUB_API_KEY=- OAUTH_GITHUB_APP_SECRET=- OAUTH_GITHUB_URL=- OAUTH_GITHUB_VERIFY_SSL=- OAUTH_GITLAB_API_KEY=- OAUTH_GITLAB_APP_SECRET=- OAUTH_BITBUCKET_API_KEY=- OAUTH_BITBUCKET_APP_SECRET=- OAUTH_BITBUCKET_URL=- OAUTH_SAML_ASSERTION_CONSUMER_SERVICE_URL=- OAUTH_SAML_IDP_CERT_FINGERPRINT=- OAUTH_SAML_IDP_SSO_TARGET_URL=- OAUTH_SAML_ISSUER=- OAUTH_SAML_LABEL="Our SAML Provider"- OAUTH_SAML_NAME_IDENTIFIER_FORMAT=urn:oasis:names:tc:SAML:2.0:nameid-format:transient- OAUTH_SAML_GROUPS_ATTRIBUTE=- OAUTH_SAML_EXTERNAL_GROUPS=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_EMAIL=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_NAME=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_USERNAME=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_FIRST_NAME=- OAUTH_SAML_ATTRIBUTE_STATEMENTS_LAST_NAME=- OAUTH_CROWD_SERVER_URL=- OAUTH_CROWD_APP_NAME=- OAUTH_CROWD_APP_PASSWORD=- OAUTH_AUTH0_CLIENT_ID=- OAUTH_AUTH0_CLIENT_SECRET=- OAUTH_AUTH0_DOMAIN=- OAUTH_AUTH0_SCOPE=- OAUTH_AZURE_API_KEY=- OAUTH_AZURE_API_SECRET=- OAUTH_AZURE_TENANT_ID=volumes:redis-data:postgresql-data:gitlab-data:

打开编辑文件内容:

image-20240524184143182

3.2、上传到服务器
  1. 新建文件夹:

    mkdir /home/gitlab
    
  2. 上传文件docker-compose.yaml,也可以新建文件,将内容粘贴过去。

    image-20240524184829197

  3. 启动docker compose

    docker-compose up -d
    
    • -d参数:后台启动。
  4. 使用docker ps命令可以看见新增的三个docker容器:

    image-20240524190730297

  5. 浏览器访问:192.168.200.128:80即可进入GitLab的页面。

    本来我想用GitLab来整合Jenkins,但是服务器资源受限,没有配置成功,我换成了github来演示。

4、github整合Jenkins

4.1、关联github
  1. 打开github,找到Settings,找到Developer Settings,打开Psonal access tokens中的Tokens (classic),点击Generate a personal access token生成新的token。

    image-20240526132053005

  2. 填写Note,勾选下面的两个选项。

    image-20240526132356069

  3. 点击生成

    image-20240526132451337

  4. 确保复制你的token,请确保立即复制您的个人访问令牌。你再也看不到了!

    image-20240526132524834

  5. 选择你的项目,创建webhook

    image-20240526143036767

4.2、Jenkins中的github的配置

打开设置:

image-20240526153927365

在设置中找到github的选项(往下划),按照如下操作,添加Github服务器:

image-20240526153403520

上述第4步添加凭据,注意:必须是具有操作权限的github的账户!!

image-20240526153618578

添加并保存退出即可!

4.3、新建任务
  1. 新建Item

    image-20240526154453857

  2. General

  • 添加描述:

image-20240526154548087

  • 添加Github项目地址:

image-20240526154812220

  1. 源码管理:

    • image-20240526155132270

    • 添加Credentials:本篇博客的4.2中的第四步讲到,操作相同,不再赘述。

    • 设置分支

      image-20240526155347509

  2. 构建触发器:

    image-20240526170308832

  3. 构建环境

    image-20240526155751453

    凭据没有的话直接添加就行:

    image-20240526160018806

  4. Build Steps:构建步骤:

    • Set build status to “pending” on GitHub commit

      image-20240526160247886

    • 执行 shell

      image-20240526160401586

  5. 构建后操作

    image-20240526160506678

  6. 最后设置完毕保存即可。

来自曼诺尔雷迪亚兹的提示:上述的配置项只是为了了解并熟悉Jenkins,并且进行快速入门,具体的配置详情可以根据业务需求和个人喜好来具体设置不同的参数。

4.4、立即构建

image-20240526162042927

image-20240526162214977

image-20240526162240293

查看控制台输出:

image-20240526162259337

image-20240526162415535

4.5、Github代码更新之后触发构建
  1. 对代码进行更新并推送

    image-20240526162935826

    Github代码:

    image-20240526163014754

  2. 自动构建:

    image-20240526170200399

  3. 构建成功

    image-20240526170342899

四、配置自动化任务–Pipeline

1、安装Blue Ocean插件

image-20240526172129605

image-20240526172511622

image-20240526172607753

返回控制台就可以看见:

image-20240526172621220

2、新建Github测试项目

image-20240526172747746

我克隆在本地了,因为我要添加一个文件,也可以在Github中添加文件:

本地:

image-20240526172911488

github:

image-20240526172932672

3、编写Jenkinsfile文件

Jenkins流水线官方中文文档 学习Jenkins流水线。

在项目中新建文件Jenkinsfile,文件内容如下:

pipeline {agent {docker{images 'node:10'args '-p 20000:8080'}} stages {stage('Build') { steps {sh 'node -v'sh 'echo "hello world !!"'}}// stage('Test') { //     steps {//         // //     }// }// stage('Deploy') { //     steps {//         // //     }// }}
}

这个 Jenkins Pipeline 使用 Docker 作为代理,在一个包含 Node.js 的 Docker 容器中执行构建步骤。

4、推送到github项目中

image-20240526174313173

5、操作流水线Blue Ocean

  1. 打开Blue Ocean

    image-20240526174406531

  2. 创建流水线

    image-20240526174901301

    需要注意的是,这里的token权限必须要有repo和user:emil才可以,没有的话重新创建token,参照本博客4.1.

    image-20240526174756762

6、选择仓库创建流水线

image-20240526175156571

创建中:

image-20240526175242020

相关文章:

Jenkins--从入门到入土

Jenkins–从入门到入土 文章目录 Jenkins--从入门到入土〇、概念提要--什么是CI/DI?1、CI(Continuous Integration,持续集成)2、DI(DevOps Integration,DevOps 集成)3、解决的问题 一、Jenkins安…...

文心一言 VS 讯飞星火 VS chatgpt (267)-- 算法导论20.2 2题

二、写出 PROTO-vEB-DELETE 的伪代码。通过扫描簇内的相关位,来更新相应的 summary 位。并且你实现的伪代码的最坏情况运行时间是多少?如果要写代码,请用go语言。 文心一言: 首先,让我们回顾一下vEB(Van …...

C 语言设计模式(结构型)

文章目录 代理模式场景示例 门面模式场景示例 桥接模式场景示例 适配器模式场景示例 外观模式场景示例 享元模式场景示例 装饰器模式场景示例 组合模式场景示例 代理模式 C语言中,代理模式通常用于实现对象的间接访问。代理模式是一种结构型设计模式,它…...

【云原生--K8S】K8S python接口研究

文章目录 前言一、搭建ubuntu运行环境1.运行ubuntu容器2.拷贝kubeconfig文件二、python程序获取k8s信息1.获取node信息2.获取svc信息3.常用kubernetes API总结前言 在前面的文章中我们都是通过kubectl命令行来访问操作K8S,但是在实际应用中可能需要提供更方便操作的图形化界面…...

5.26作业

服务器 2 3 #define BUFSIZE 10244 #define login_msg_len 205 6 typedef struct Node{7 char name[login_msg_len];8 struct sockaddr_in addr;9 struct Node *next;10 }Node;11 12 typedef struct Msgtype{13 char type;14 char username[login_msg_len]…...

链接库文件体积优化工具篇:bloaty

笔者之前参与过一个嵌入式智能手表项目,曾经碰到过这样一个问题:手表的flash大小只有2M,这意味着只能在上面烧录2M大小的代码。随着开发不断进行,代码越写越多,编译出来的bin也越来越大。最后bin大小超过了2M, 就没法烧…...

使用pyqt绘制一个爱心!

使用pyqt绘制一个爱心! 介绍效果代码 介绍 使用pyqt绘制一个爱心! 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget from PyQt5.QtGui import QPainter, QPen, QBrush, QColor from PyQt5.QtCore import Qt, Q…...

关于 Transformer 的11个常见面试题

Transformer 是如何工作的? Transformer 是一种深度学习算法,特别适用于自然语言处理(NLP)任务,如语言翻译、语言生成和语言理解。它们能够处理长度可变的输入序列并捕捉长距离依赖关系,使其在理解和处理自…...

OS多核多线程锁记录笔记

自旋锁作用 自旋锁的是为了保护两个核上的公共资源,也就是全局变量,只有在一方也就是一个核抢到了自选锁,才能对公共资源进行操作修改,当然还有其他形似的锁如互斥锁,这里不比较两者的区别,以前没有深入的去…...

nginx做TCP代理

要实现TCP代理,可以使用Nginx的stream模块。stream模块允许Nginx作为一个转发代理来处理TCP流量,包括TCP代理、负载均衡和SSL终止等功能。 以下是配置Nginx实现TCP代理的基本步骤: 在Nginx配置文件中添加stream块,并在该块中配置…...

python 异常处理 try

异常 我们常见的代码错误后 会出现此类异常 SyntaxError:语法错误 AttributeError:属性错误 IndexError:索引错误 TypeError:类型错误 NameError:变量名不存在错误 KeyError:映射中不存在的关键字&#xf…...

月入10万+管道收益,揭秘旅游卡运营的5个阶段!

网上的项目众多,只要用心,便能发现不少商机。在互联网上运营,关键在于理解项目的底层逻辑。今天,我们来揭秘旅游卡项目,如何做到月入10万。 1、先赚成本 开始项目时,首要任务是回本。不要急于求成&#x…...

android_binder源码分析之_binder驱动使用服务

一,binder驱动源码分析,使用服务过程 uint32_t svcmgr_lookup(struct binder_state *bs, uint32_t target, const char *name) {uint32_t handle;unsigned iodata[512/4];struct binder_io msg, reply;bio_init(&msg, iodata, sizeof(iodata), 4);b…...

【波点音乐看广告】

import uiautomator2 as u2 import time from datetime import datetime import xml.etree.ElementTree as ET import re import os 连接设备 d u2.connect() os.system(‘adb shell chmod 775 /data/local/tmp/atx-agent’) os.system(‘adb shell /data/local/tmp/atx-age…...

[SWPUCTF 2021 新生赛]pop

常见的魔术方法 魔术方法__construct() 类的构造函数,在对象实例化时调用 __destruct() 类的析构函数,在对象被销毁时被调用 __call() 在对象中调用一个不可访问的对象时被调用,比如一个对象被调用时,里面没有程序想调用的属性 …...

【DevOps】Jenkins + Dockerfile自动部署Maven(SpringBoot)项目

环境 docker_host192.168.0.1jenkins_host192.168.0.2 jenkins_host构建完成后把jar发布到docker_host,再通过dockerfile自动构建镜像,运行镜像 1 Jenkins安装 AWS EC2安装Jenkins:AWS EC2 JDK11 Jenkins-CSDN博客 AWS EC2上Docker安装…...

【C++】——入门基础知识超详解

目录 ​编辑 1.C关键字 2. 命名空间 2.1 命名空间定义 2.2 命名空间使用 命名空间的使用有三种方式: 注意事项 3. C输入&输出 示例 1:基本输入输出 示例 2:读取多个值 示例 3:处理字符串输入 示例 4:读…...

ChatGPT技术演进简介

chatGPT(chat generative pre-train transformer, 可以对话的预训练trasformer模型),讨论点: 1、chatGPT为什么突然火了 2、GPT 1.0、2.0、3.0、3.5 、4和4o区别和特性,在不同应用场景中如何选对模型 3、未…...

C语言 | Leetcode C语言题解之第114题二叉树展开为链表

题目: 题解: void flatten(struct TreeNode* root) {struct TreeNode* curr root;while (curr ! NULL) {if (curr->left ! NULL) {struct TreeNode* next curr->left;struct TreeNode* predecessor next;while (predecessor->right ! NULL)…...

Vue 子组件向父组件传值

1、使用自定义事件 ($emit) 这是Vue中最常用的子组件向父组件传递数据的方式。子组件通过触发一个自定义事件&#xff0c;并附加数据作为参数&#xff0c;父组件则监听这个事件并处理传递过来的数据。 子组件 (发送数据)&#xff1a; <template><button click"…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

遍历 Map 类型集合的方法汇总

1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

【位运算】消失的两个数字(hard)

消失的两个数字&#xff08;hard&#xff09; 题⽬描述&#xff1a;解法&#xff08;位运算&#xff09;&#xff1a;Java 算法代码&#xff1a;更简便代码 题⽬链接&#xff1a;⾯试题 17.19. 消失的两个数字 题⽬描述&#xff1a; 给定⼀个数组&#xff0c;包含从 1 到 N 所有…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

多模态大语言模型arxiv论文略读(108)

CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题&#xff1a;CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者&#xff1a;Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计

随着大语言模型&#xff08;LLM&#xff09;参数规模的增长&#xff0c;推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长&#xff0c;而KV缓存的内存消耗可能高达数十GB&#xff08;例如Llama2-7B处理100K token时需50GB内存&a…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...