CI/CD-Jenkins安裝與應用

CI/CD-Jenkins安裝與應用

Docker安裝Jenkins

docker-compose.yaml

version: "3.8"
# ========================
# 自定義網絡配置
# ========================
networks:cicd:driver: bridgeservices:jenkins:# 盡量使用新版本的Jenkins, 低版本的Jenkins的有些插件使用不了# jenkins/jenkins:lts-jdk17是長期支持版, jenkins/jenkins:jdk17是最新版image: jenkins/jenkins:jdk17container_name: jenkinsports:- 8080:8080 # WEB UI- 50000:50000volumes:# 將宿主機的Docker引擎掛載到Jenkins容器上,即Jenkins容器調用宿主機的Docker- /var/run/docker.sock:/var/run/docker.sock- /usr/bin/docker:/usr/bin/docker# 將宿主機的docker compose掛載到容器中- /usr/local/bin/docker-compose:/usr/local/bin/docker-compose# 讓容器和宿主機時間保持一致- /etc/localtime:/etc/localtime# Jenkins工作存儲位置/var/jenkins_home, 所有插件數據配置都在次目錄下- /data/cicd/jenkins/jenkins_home:/var/jenkins_home# Docker打包Java涉及的Dockerfile, 鏡像, docker compose命令的存儲- /data/cicd/docker:/data/docker# 指定用戶, 因為Jenkins鏡像內部使用的用戶是jenkins,但是我們啟動容器時的賬號是root,導致沒有權限操作內部目錄user: rootnetworks:- cicd

初始化

配置鏡像加速

啟動容器后, 修改鏡像源

vi /var/jenkins/jenkins_home/hudson.model.UpdateCenter.xml
<?xml version='1.1' encoding='UTF-8'?>
<sites><site><id>default</id><!-- 華為鏡像源 --><url>https://mirrors.huaweicloud.com/jenkins/update-center.json</url></site>
</sites>
登錄Jenkins

查看初始化密碼

docker logs jenkins

image-20250326215724120

輸入密碼, 點擊下一步

image-20250326163555580

安裝官方推薦插件

安裝官方推薦插件

可能有部分安裝失敗(受網絡, 墻, 數據源, 插件和Jenkins版本不匹配等原因限制), 可以嘗試點多幾次重試

image-20250327133026443

繼續下一步創建用戶和配置Jenkins訪問地址和端口, 然后進入Jenkins

安裝JDK, Git, Maven, Publish over ssh, Gitee插件

JDK下載插件

image-20250328115514598

Git

image-20250328115555723

Maven Integration plugin

image-20250327140926049

publish over shh

image-20250327141133011

Gitee

image-20250328194718821

安裝JDK, Git, Maven

image-20250327135546188

JDK

新版本Jenkins自帶了JDK, 直接使用自帶的JDK17

image-20250328120332524

Git

新版本Jenkins自帶了git, 配置路徑即可

image-20250327143942321

Maven

image-20250328114141592

構建部署Java項目

新建Maven任務

新建任務->填寫任務名稱->選擇maven項目->點擊確定

image-20250328114933113

填寫描述

image-20250327142733667

設置源碼地址

根據官方提供的java demo項目地址: https://github.com/jenkins-docs/simple-java-maven-app

倉庫地址(這個是github的鏡像地址, gitcode提供的): https://gitcode.com/gh_mirrors/si/simple-java-maven-app.git

image-20250328093550003

保存并構建

image-20250327144437040

查看日志

image-20250327144752968

發現日志構建成功

image-20250327145026094

查看構建好的jar包

構建好的jar通常存放在包在**/var/jenkins_home/workspace/任務名/target**,

而我們通過docker方式啟動并進行了數據卷掛載 我們可以在宿主機進行查看

cd /data/cicd/jenkins/jenkins_home/workspace/hello-word/target
ls

image-20250327145549072

運行Jar包

這里演示的Jenkins服務器和項目運行服務器是同一個的情況

不同的情況后續說明

在官方提供的demo中,實際上僅控制臺輸出了 Hello World! 字符串

image-20250328145102868

java -jar運行

進入容器

docker exec -it jenkins /bin/bash

容器中運行該命令

java -jar /var/jenkins_home/workspace/hello-word/target/my-app-1.0-SNAPSHOT.jar

發現確實輸出了Hello World!

image-20250328121238486

Docker打包鏡像運行

宿主機執行一下創建文件夾命令

# Dockerfile存儲地方
mkdir -p /data/cicd/docker/dockerFile
#docker-compose.yaml存儲地方
mkdir -p /data/cicd/docker/compose_script
Dockerfile

宿主機中創建Dockerfile

vim /data/cicd/docker/dockerFile/Dockerfile
FROM openjdk:17
# 設置工作目錄
WORKDIR /data/app
# 將宿主機的目錄掛載到容器的/app目錄
VOLUME /data/app/data
# 復制.jar文件到工作目錄
COPY my-app-1.0-SNAPSHOT.jar /data/app/my-app.jar
# 設置容器啟動時執行的命令
CMD ["java", "-jar", "my-app.jar"]
docker-compose.yaml

宿主機創建docker-compose.yaml

vim /data/cicd/docker/compose_script/docker-compose.yaml
version: "3.8"
services:my-app:image: my-app:v1container_name: my-app
構建鏡像

進入容器中

docker exec -it jenkins /bin/bash

容器中執行構建鏡像

# -f: 指定Dockerfile路徑
# -t: 鏡像的名字及標簽, 通常 name:tag 或者 name 格式
# /var/jenkins_home/workspace/hello-word/target/: 相對路徑
docker build -f /data/docker/dockerFile/Dockerfile --tag my-app:v1 /var/jenkins_home/workspace/hello-word/target/

如果宿主機中已經有OpenJDK17鏡像, 那么就不會重新拉取, 如果沒有, 那么此時拉取

博主這里已經有了JDK17鏡像, 所以這里沒有有拉去鏡像的步驟

image-20250328144324400

查看構建好的鏡像

docker images my-app

image-20250328144359378

運行鏡像

啟動my-app容器, 前臺模式啟動

docker-compose -f /data/docker/compose_script/docker-compose.yaml up

image-20250328144444220

Jenkins自動部署

當構建成功后自動執行啟動命令(這里以啟動容器為例子)

Post steps -> 構建成功后執行 -> 執行shell

image-20250328145910645

填寫啟動的shell命令

將之前構建容器, 啟動容器等命令寫入shell腳本中

# 使用docker ps和grep來檢查容器是否存在
if docker-compose ps -a | grep "my-app" > /dev/null; thenecho "容器存在"# 容器存在則停止并刪除容器docker-compose -f /data/docker/compose_script/docker-compose.yaml downdocker rm my-app:v1
elseecho "容器不存在"
fi# 構建鏡像
docker build -f /data/docker/dockerFile/Dockerfile --tag my-app:v1 /var/jenkins_home/workspace/hello-word/target/
# 運行容器(后臺啟動, 和之前的前臺啟動不一樣)
docker-compose -f /data/docker/compose_script/docker-compose.yaml up -d

重新構建, 并查看構建日志

image-20250328151039266

查看容器日志

這里輸出了幾個Hello World!是因為博主啟動了幾次容器

image-20250328151155861

拉取Gitee項目自動化部署

前提

  1. 有Gitee賬戶
  2. 會將SpringBoot項目推送到Gitee

創建SpringBoot項目

pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.whiteBrocade</groupId><artifactId>jenkins_demo</artifactId><version>0.0.1-SNAPSHOT</version><name>jenkins_demo</name><description>jenkins_demo</description><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.whitebrocade.jenkins_demo.JenkinsDemoApplication</mainClass><skip>false</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins><!-- 將根目錄下的Dockerfile一并打包至target目錄 --><resources><resource><directory>${project.basedir}</directory><targetPath>${project.build.directory}</targetPath><includes><include>Dockerfile</include></includes></resource><!-- maven默認會將資源目錄下的資源文件進行打包, 而如果在pom.xml中配置了resources標簽,則默認的資源打包策略就被覆蓋掉了, 只會打包resources標簽中配置的資源文件 --><resource><directory>src/main/resources</directory><includes><include>**/*</include></includes></resource></resources></build><!-- maven鏡像源 --><repositories><repository><id>public</id><name>aliyun nexus</name><url>https://maven.aliyun.com/repository/public</url><releases><enabled>true</enabled></releases></repository></repositories></project>
application.yaml
# 應用服務 WEB 訪問端口
server:port: 9999
TestController
/*** @author whiteBrocade* @version 1.0*/
@RestController
public class TestController {@GetMapping("/hello")public String hello(@RequestParam String name) {return "Hello " + name;}
}
Dockerfile
# 用的是JDK17
FROM openjdk:17
LABEL authors="whiteBrocade"
# 設置工作目錄
WORKDIR /data/app
# 將宿主機的目錄掛載到容器的/app目錄
VOLUME /data/app
# 復制.jar文件到工作目錄
COPY jenkins_demo-0.0.1-SNAPSHOT.jar /data/app/jenkins_demo.jar
# 設置容器啟動時執行的命令
CMD ["java", "-jar", "jenkins_demo.jar"]

提交代碼到gitee中

image-20250328184422528

Jenkins構建任務

創建Maven任務

image-20250328184553333

設置源碼地址

image-20250328184809443

添加Post Steps

選擇僅構建成功執行(Run only if build succeeds), 添加下邊的shell腳本

# 默認操作在Jenkins工作目錄下的項目名目錄 即 workspace/jenkins-demo/target
cd target
# 構建鏡像
docker build -t jenkins_demo . 
# 使用docker ps和grep來檢查容器是否存在
if docker ps -a | grep "jenkins_demo" > /dev/null; thenecho "容器存在"# 容器存在則停止并刪除容器docker stop jenkins_demodocker rm jenkins_demo
elseecho "容器不存在"
fi
# 運行容器
docker run -d -p 9999:9999 --name jenkins_demo jenkins_demo
保存并構建

保存后, 點擊構建, 如下圖, 構建成功

image-20250328191840409

查看容器是否啟動

image-20250328191955538

訪問項目

http://192.168.132.10:9999?hello=whiteBrocade

image-20250328193908945

Gitee的WeHhooks觸發自動構建

WebHooks介紹

WebHooks是一種基于HTTP協議的回調機制。當特定事件(如代碼推送、Pull Request等)發生時,源系統會向預先配置的URL發送一個HTTP請求,以通知目標系統進行相應的操作。在CI/CD流程中,WebHooks常用于觸發Jenkins構建任務

添加Gitee憑證

系統管理的中配置Gitee令牌(令牌申請點擊Gitee私人令牌)

image-20250328200117746

添加觸發器

選擇之前的jenkins_demo構建任務, 點擊Triggers

image-20250328201122904

觸發策略為

  • Push: 倉庫推送代碼, 推送/刪除分支
  • Pull Request: 新建, 更新, 合并

生成隨機密碼, 這里的隨機密碼后續要復制到Gitee中的WebHooks中

image-20250328204034396

Gitee添加WebHooksp

Gitee ->自己的jenkins_demo倉庫 -> 管理 -> WebHooks -> 添加webHook

image-20250328203033164

從Jenkins中獲取URL

image-20250328231123703

添加WebHooks

將剛剛的URL復制過來, 這里需要內網穿透, 詳細請看內網穿透工具章節

image-20250328231203010

修改代碼并提交

image-20250328234956416

觸發自動構建了

image-20250328235648716

訪問新增的接口

image-20250328235758102

遠程推送和自動部署

Publish Over SSH配置SSH Servers

如果沒有安裝Publish Over SSH, 那么先安裝

系統管理 -> 系統配置 -> Publish over SSH, 添加SSH Servers

image-20250329202455066

添加推送

清空Post Steps

由于之前配置一個Post Steps會影響后續流程, 這里清空, 確保這個構建任務沒有Post Steps

Post Steps添加步驟

image-20250329204202152

注意事項

  • Jenkins會默認找到任務的工作目錄, 這里就是/var/jenkins/jenkins_home/workspace/jenkins_demo
  • Source files可以傳遞多個文件, 文件通過英文逗號間隔

image-20250329211844893

sh腳本

cd /data/storage
# 構建鏡像
docker build -t jenkins_demo . 
# 使用docker ps和grep來檢查容器是否存在
if docker ps -a | grep "jenkins_demo" > /dev/null; thenecho "容器存在"# 容器存在則停止并刪除容器docker stop jenkins_demodocker rm jenkins_demo
elseecho "容器不存在"
fi
# 運行容器
docker run -d -p 9999:9999 --name jenkins_demo jenkins_demo

構建項目

image-20250329212045477

效果

查看容器

進入192.168.132.11主機

查看容器

image-20250329212335593

測試請求

訪問http://192.168.132.11:9999/hello?whiteBrocade

image-20250329212535524

內網穿透工具

  • natapp實現內網穿透

  • neutrino-proxy沒有實現

natapp

這個免費的隧道過一段時間會失效, 所以有時候不行的話, 可以重新啟動一個natapp, 用新分配的地址重新配置一個WebHooks

  1. 下載[NATAPP]客戶端(https://natapp.cn/#download)
  2. 進入NATAPP注冊
  3. 選擇免費隧道

image-20250328224654937

  1. 點擊免費購買

image-20250328224806610

  1. 復制authtoken

image-20250328224919194

  1. 修改本機地址為VM內網地址

image-20250328230024844

  1. natapp.exe同級目錄下新建config.ini
#將本文件放置于natapp同級目錄 程序將讀取 [default] 段
#在命令行參數模式如 natapp -authtoken=xxx 等相同參數將會覆蓋掉此配置
#命令行參數 -config= 可以指定任意config.ini文件
[default]
authtoken=3xxxxxxxxxxx3                       #對應一條隧道的authtoken
clienttoken=                    #對應客戶端的clienttoken,將會忽略authtoken,若無請留空,
log=none                        #log 日志文件,可指定本地文件, none=不做記錄,stdout=直接屏幕輸出 ,默認為none
loglevel=ERROR                  #日志等級 DEBUG, INFO, WARNING, ERROR 默認為 DEBUG
http_proxy=                     #代理設置 如 http://10.123.10.10:3128 非代理上網用戶請務必留空

image-20250328225239120

  1. 點擊natapp.exe啟動

image-20250328232354088

neutrino-proxy

啟動服務端
配置
創建文件夾
# 服務端
# 配置
mkdir -p /data/neutrino-proxy/server/config
# 運行數據
mkdir -p /data/neutrino-proxy/server/data
# 日志
mkdir -p /data/neutrino-proxy/server/logs
服務端app.yml

創建app.yml配置

vim /data/neutrino-proxy/server/config/app.yml
server:# 服務端web端口,用于支持HTTP接口,管理后臺頁面訪問port: 8888
# 日志級別
solon.logging:logger:"root":level: infoappender:file:level: infoneutrino:proxy:# 隧道相關配置-用于維持服務端與客戶端的通信tunnel:# 線程池相關配置,用于技術調優,可忽略boss-thread-count: 2work-thread-count: 10# 隧道非SSL端口port: 9000# 隧道SSL端口ssl-port: 9002# 隧道SSL證書配置key-store-password: 123456key-manager-password: 123456jks-path: classpath:/test.jks# 是否開啟隧道傳輸報文日志(日志級別為debug時開啟才有效)transfer-log-enable: false# 是否開啟心跳日志heartbeat-log-enable: falseserver:tcp:# 線程池相關配置,用于技術調優,可忽略boss-thread-count: 5work-thread-count: 20# http代理端口,默認80(不配置不支持)http-proxy-port: 80# https代理端口,默認443 (不配置不支持,同時需要配置域名、證書)https-proxy-port: 443# 是否開啟代理服務報文日志(日志級別為debug時開啟才有效)transfer-log-enable: falseudp:# 線程池相關配置,用于技術調優,可忽略boss-thread-count: 5work-thread-count: 20# 是否開啟代理服務報文日志(日志級別為debug時開啟才有效)transfer-log-enable: falsedata:db:# 數據庫類型,目前支持h2、mysql、mariadbtype: h2# 數據庫連接URLurl: jdbc:h2:file:./data/db;MODE=MySQL;AUTO_SERVER=TRUE# 數據庫用戶名username:# 數據庫密碼password:
docker-compose.yaml
version: '3.8'networks:npServer:driver: bridge
services:# 服務端npServer:image: aoshiguchen/neutrino-proxy-server:latestcontainer_name: npServerhostname: npServerrestart: alwaysenvironment:TZ: Asia/ShanghaiLANG: zh_CN.UTF-8volumes:- /data/neutrino-proxy/server/config:/root/neutrino-proxy/config- /data/neutrino-proxy/server/data:/root/neutrino-proxy/data- /data/neutrino-proxy/server/logs:/root/neutrino-proxy/logsports:- "8888:8888"- "9000:9000"- "9002:9002"- "9101-9120:9101-9120"networks:- npServer
設置內網穿透
訪問首頁

http://192.168.132.10:8888/

賬號: admin

密碼: 123456

image-20250328211829946

添加License

添加一個專門用于jenkins回調穿透用的License

image-20250328212005519

添加端口映射

image-20250328212223277

啟動客戶端
配置
創建文件夾
# 客戶端
# 配置
mkdir -p /data/neutrino-proxy/client/config
# 日志
mkdir -p /data/neutrino-proxy/client/logs
客戶端app.yml
vim /data/neutrino-proxy/client/config/app.yml

下邊有兩個地方需要修改

  1. server-ip改成自己的本機的公網地址
  2. license-key改成后臺配置的jenkins_demo的license
solon.logging.logger:"root":level: infoneutrino:proxy:tunnel:# 線程池相關配置,用于技術調優,可忽略thread-count: 50# 隧道SSL證書配置key-store-password: 123456jks-path: classpath:/test.jks# 服務端IP(自己的公網IP)server-ip: xxx.xxx.xxx.xxx# 服務端端口(對應服務端app.yml中的tunnel.port、tunnel.ssl-port)server-port: 9002# 是否啟用SSL(注意:該配置必須和server-port對應上)ssl-enable: true# 客戶端連接唯一憑證(這里修改成服務端配置的Jenkins_demo的lin)license-key: xxxxxx# 客戶端唯一身份標識(可忽略,若不設置首次啟動會自動生成)client-id:# 是否開啟隧道傳輸報文日志(日志級別為debug時開啟才有效)transfer-log-enable: false# 是否開啟心跳日志heartbeat-log-enable: false# 重連設置reconnection:# 重連間隔(秒)interval-seconds: 10# 是否開啟無限重連(未開啟時,客戶端license不合法會自動停止應用,開啟了則不會,請謹慎開啟)unlimited: falseclient:udp:# 線程池相關配置,用于技術調優,可忽略boss-thread-count: 5work-thread-count: 20# udp傀儡端口范圍puppet-port-range: 10000-10500# 是否開啟隧道傳輸報文日志(日志級別為debug時開啟才有效)transfer-log-enable: false
docker-compose.yaml
version: '3.8'networks:npClient:driver: bridge
services:npClient:image: aoshiguchen/neutrino-proxy-client:latestcontainer_name: npClienthostname: npClientrestart: alwaysenvironment:TZ: Asia/ShanghaiLANG: zh_CN.UTF-8volumes:- /data/neutrino-proxy/client/config:/root/neutrino-proxy/config- /data/neutrino-proxy/client/logs:/root/neutrino-proxy/logsports:- "10000-10500:10000-10500/udp"networks:- npClient

參考

Jenkins中文官網

Docker安裝Jenkins

Jenkins+Docker 實現一鍵自動化部署項目!步驟齊全,少走坑路

Docker 快速安裝Jenkins完美教程 (親測采坑后詳細步驟)

【Jenkins】之配置國內鏡像加速

Jenkins安裝插件提速

實戰指南:使用Docker安裝Jenkins并結合Buildx構建跨平臺鏡像

Index of jenkins-local

Jenkins首次安裝選擇推薦插件時出現“: No such plugin: cloudbees-folder” 解決方案

Jenkins首次安裝推薦插件出錯 No such plugin: cloudbees-folder 超詳細解決方案

Index of /jenkins/plugins/cloudbees-folder/latest/r

jenkins安裝,打包,部署java項目_jenkins打包,發布,部署

更換 Jenkins 插件下載源(解決 Jenkins 插件安裝失敗)【圖文詳細教程】

jenkins安裝,打包,部署java項目

Jenkins之java代碼上線

Jenkins+Gitee 的Java項目提交自動部署

Jenkins查看版本

24年最新 Docker安裝jenkins并發布服務器,配置環境,最全,已成功驗證

Jenkins_Micro麥可樂的博客

Docker 安裝 Jenkins-jdk17

內網穿透工具neutrino-proxy

內網穿透Neutrino-Proxy的安裝部署和使用

Linux搭建NeutrinoProxy(中微子代理) 內網穿透教程

【從0開始搭建內網穿透】開源內網穿透神器

開源內網穿透神器,中微子代理(NeutrinoProxy)2.0.0重磅發布

內網穿透神器 NeutrinoProxy 1.8.0 版本發布

linux 獲取公網 IP 方法

iP地址查詢–手機號碼查詢歸屬地 | 郵政編碼查詢 | iP地址歸屬地查詢 | 身份證號碼驗證在線查詢網

jenkins自動部署代碼到多臺服務器

使用docker build命令構建鏡像時遇到警告信息 The legacy builder is deprecated and will be removed in a future release

關于maven打包時, 資源文件沒有被打包進來的問題

gitee使用webhoot觸發Jenkins自動構建

jenkins使用gitee插件自動部署webhook404問題記錄

GitEE提交代碼自動構建Jenkins項目

jenkins自動化部署構建后Publish Over SSH失敗問題解決辦法

jenkins報錯code記錄

解決 jenkins exit status not zero error (status code 125)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74933.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74933.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74933.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

驗證Linux多進程時間片切換的程序

?? 一、軟件需求 在同時運行多個CPU密集型進程時&#xff0c;需采集以下統計信息&#xff1a; 當前運行在邏輯CPU上的進程ID每個進程的運行進度百分比 實驗程序設計要求&#xff1a; 1. 命令行參數 參數說明示例值n并發進程數量3total總運行時長&#xff08;毫秒&…

IvorySQL:兼容Oracle數據庫的開源PostgreSQL

今天給大家介紹一款基于 PostgreSQL 開發、兼容 Oracle 數據庫的國產開源關系型數據庫管理系統&#xff1a;IvorySQL。 IvorySQL 由商瀚高軟件提供支持&#xff0c;主要的功能特性包括&#xff1a; 完全兼容 PostgreSQL&#xff1a;IvorySQL 基于 PostgreSQL 內核開發&#xf…

樹莓派超全系列文檔--(13)如何使用raspi-config工具其二

如何使用raspi-config工具其二 raspi-configPerformance optionsOverclockGPU memoryOverlay file systemFan Localisation optionsLocaleTime zoneKeyboardWLAN country Advanced optionsExpand filesystemNetwork interface namesNetwork proxy settingsBoot orderBootloader…

QT音樂播放器(1):數據庫保存歌曲

實現功能&#xff1a;用數據庫保存本地導入和在線搜索的歌曲記錄 目錄 一. 保存本地添加的歌曲 1. 使用QSettings &#xff08;1&#xff09;在構造函數中&#xff0c;創建對象。 &#xff08;2&#xff09;在導入音樂槽函數中&#xff0c;保存新添加的文件路徑&#xff0c…

自動化發布工具CI/CD實踐Jenkins常用工具和插件的使用

1、安裝常用工具 名稱版本備注jdkjava8代碼打包所需git1.8.3.1maven3.6.3注意配置私服內容nvm0.39.3多Node.js環境管理工具Node.jsv14.18.0 / v16.17.1包管理工具yarn1.22.15包管理工具 1.1 安裝jdk Jenkins 需要使用java11 及以上&#xff0c;但是代碼打包依賴jdk8&#xff…

shared_ptr和 weak_ptr的詳細介紹

關于 shared_ptr 和 weak_ptr 的詳細介紹及使用示例&#xff1a; 1. shared_ptr&#xff08;共享所有權智能指針&#xff09; 核心特性 引用計數&#xff1a;記錄當前有多少個 shared_ptr 共享同一個對象。自動釋放&#xff1a;當引用計數歸零時&#xff0c;自動釋放對象內存…

Spring AI MCP 架構詳解

Spring AI MCP 架構詳解 1.什么是MCP? MCP 是一種開放協議&#xff0c;它對應用程序向大語言模型&#xff08;LLMs&#xff09;提供上下文信息的方式進行了標準化。可以把 MCP 想象成人工智能應用程序的 USB-C 接口。就像 USB-C 為將設備連接到各種外圍設備和配件提供了一種…

騰訊系AI應用,可以生視頻,3D模型...

以下注冊手機后就可以使用了。 騰訊智影 智能抹除-在線去水印去字幕-抹除水印字幕-騰訊智影 混元&#xff08;文字&#xff0c;圖片生成3D&#xff09; 騰訊混元3D 混元視頻&#xff08;文字生成視頻&#xff0c;可惜右下角有文字&#xff09; https://video.hunyuan.tencen…

數據結構(并查集,圖)

并查集 練習版 class UnionFindSet { public:void swap(int* a, int* b){int tmp *a;*a *b;*b tmp;}UnionFindSet(size_t size):_ufs(size,-1){}int UnionFind(int x){}void Union(int x1, int x2){}//長分支改為相同節點int FindRoot(int x){}bool InSet(int x1, int x2)…

數據結構:探秘AVL樹

本節重點 理解AVL樹的概念掌握AVL樹正確的插入方法利用_parent指針正確更新平衡因子掌握并理解四種旋轉方式&#xff1a;左單旋&#xff0c;右單旋&#xff0c;左右雙旋&#xff0c;右左雙旋 一、AVL樹的概念 AVL樹得名于它的發明者G. M. Adelson-Velsky和E. M. Landis&…

電源系統的熱設計與熱管理--以反激式充電器為例

前言 反激電源常用于各種電子設備中&#xff0c;比如充電器、適配器等&#xff0c;它們通過變壓器進行能量轉換。高溫環境可能對電子元件造成影響&#xff0c;特別是像MOSFET、二極管、變壓器這樣的關鍵部件&#xff0c;導致效率變低&#xff0c;甚至可能導致功能失效。還有安…

linux課程學習二——緩存

一.文件io與標準io的一個區別 遇到死循環可以ctrl c結束進程 使用printf輸出&#xff0c;輸出沒有問題 用wirte輸出&#xff0c;參數1&#xff0c;可以理解為上面介紹的linux標準文件描述符的1&#xff08;STDOUT&#xff09;標準輸出&#xff0c;我們加上一個死循環while&…

Kafka中的消息如何分配給不同的消費者?

大家好&#xff0c;我是鋒哥。今天分享關于【Kafka中的消息如何分配給不同的消費者&#xff1f;】面試題。希望對大家有幫助&#xff1b; Kafka中的消息如何分配給不同的消費者&#xff1f; 在 Kafka 中&#xff0c;消息是通過 主題&#xff08;Topic&#xff09; 進行組織的&…

Android的安全問題 - 在 Android 源碼的 system/sepolicy 目錄中,區分 public、private 和 vendor的目的

參考&#xff1a;Google文檔 在 Android 8.0 及更高版本中自定義 SEPolicy 在 Android 源碼的 system/sepolicy 目錄中&#xff0c;區分 public、private 和 vendor 是為了模塊化 SELinux 策略&#xff0c;并明確不同部分的訪問權限和接口邊界。這種設計主要基于以下原因&…

Java NIO之FileChannel 詳解

關鍵點說明 文件打開選項&#xff1a; StandardOpenOption.CREATE - 文件不存在時創建 StandardOpenOption.READ/WRITE - 讀寫權限 StandardOpenOption.APPEND - 追加模式 StandardOpenOption.TRUNCATE_EXISTING - 清空已存在文件 緩沖區操作&#xff1a; ByteBuffer.wrap…

stock-pandas,一個易用的talib的替代開源庫。

原創內容第841篇&#xff0c;專注智能量化投資、個人成長與財富自由。 介紹一個ta-lib的平替——我們來實現一下&#xff0c;最高價突破布林帶上軌&#xff0c;和最低價突破布林帶下軌的可視化效果&#xff1a; cross_up_upper stock[high].copy()# cross_up_upper 最高價突破…

JVM 面經

1、什么是 JVM? JVM 就是 Java 虛擬機&#xff0c;它是 Java 實現跨平臺的基石。程序運行之前&#xff0c;需要先通過編譯器將 Java 源代碼文件編譯成 Java 字節碼文件&#xff1b;程序運行時&#xff0c;JVM 會對字節碼文件進行逐行解釋&#xff0c;翻譯成機器碼指令&#x…

【JavaScript】合體期功法——DOM(一)

目錄 DOMWeb API 基本概念作用和分類 什么是 DOMDOM 樹DOM 對象 獲取 DOM 元素根據 CSS 選擇器來獲取 DOM 元素選擇匹配的第一個元素選擇匹配的多個元素 其他獲取 DOM 元素方法 修改元素的內容對象.innerText 屬性對象.innerHTML 屬性案例&#xff1a;年會抽獎 修改元素屬性修改…

GAMMA數據處理(十)

今天向別人請教了一個問題&#xff0c;剛無意中搜索到了一模一樣的問題 不知道這個怎么解決... ok 解決了 有一個GAMMA的命令可轉換 但是很奇怪 完全對不上 轉換出來的行列號 不知道為啥 再試試 是因為經緯度坐標的小數點位數 de as

Java入門知識總結——章節(二)

ps&#xff1a;本章主要講數組、二維數組、變量 一、數組 數組是一個數據容器&#xff0c;可用來存儲一批同類型的數據 &#x1f511;&#xff1a;注意 類也可以是一個類的數組 public class Main {public static class Student {String name;int age; // 移除 unsignedint…