Jenkins 構建流水線

在 Linux 系統上安裝 Jenkins 服務,以及配置自動化構建項目

前置準備環境:docker、docker-compose、jdk、maven

一、環境搭建

1. Jenkins 安裝

(1)拉取鏡像

# 安裝鏡像包,默認安裝最新版本
docker pull jenkins/jenkins
# 查看是否安裝成功
docker images

(2)啟動并創建 Jenkins 容器

Jenkins工作空間目錄:每新建一個項目都會在該目錄下創建對應文件夾,拉取的代碼等文件均在該路徑下。
若是需要推送文件到目標服務器,默認從該項目文件夾下加載。例如:

  • 工作空間目錄為:/var/jenkins_home/workspace
  • 項目名稱為:demo

那么推送文件時所在路徑為:/var/jenkins_home/workspace/demo,只需在腳本中維護后續路徑即可

啟動容器
docker run -u root -d \
-p 8080:8080 -p 50000:50000 \
-v /var/jenkins_home/workspace/:/var/jenkins_home/workspace \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/local/java:/usr/local/java \
-v /usr/local/maven/apache-maven-3.9.9:/usr/local/maven \
-e JAVA_OPTS="-Dorg.apache.commons.jelly.tags.fmt.timeZone='Asia/Shanghai" \
--restart=unless-stopped \
--name jenkins-server jenkins/jenkins:2.426.2-lts
啟動命令解釋
docker run -u root -d \
-p 80:8080 -p 81:50000 \                    				      # 鏡像8080端口映射到宿主機80端口
-v /var/jenkins_home/workspace/:/var/jenkins_home/workspace \     # 掛載 jenkins 工作空間目錄
-v /var/run/docker.sock:/var/run/docker.sock \                    # 掛載 docker
-v /usr/bin/docker:/usr/bin/docker \                              # 掛載 docker
-v /usr/local/java:/usr/local/java \                              # 掛載 jdk
-v /usr/local/maven/apache-maven-3.9.9:/usr/local/maven \         # 掛載 maven
-e JAVA_OPTS="-Dorg.apache.commons.jelly.tags.fmt.timeZone='Asia/Shanghai" \  # 同步時間
--restart=unless-stopped \                                                    # 重啟策略
--name jenkins-server jenkins/jenkins:2.426.2-lts                              # jenkins-serve(自定義容器名稱)  jenkins/jenkins:2.426.2-lts(鏡像名稱及版本)
安裝并創建用戶

瀏覽器打開 http://127.0.0.1:8080,輸入超級管理密碼進行登錄

# 進入容器,查看管理員密碼
docker exec -it jenkins-server bash
cat /var/jenkins_home/secrets/initialAdminPassword

在這里插入圖片描述

  1. 選擇安裝推薦的插件,安裝完成后創建管理員用戶
    在這里插入圖片描述

在這里插入圖片描述

2. Harbor 鏡像倉庫安裝

(1)下載在線安裝包

mkdir -p /root/software/harbor
cd /home/software/harbor
wget https://all-share-public.oss-cn-shanghai.aliyuncs.com/install-harbor/harbor-online-installer-v2.10.1.tgz
tar -zxvf harbor-online-installer-v2.10.1.tgz
cd harbor

(2)配置 harbor.yml 文件

cp harbor.yml.tmpl harbor.yml

編輯 harbor.yml,并在對應位置寫入以下內容

hostname: 192.168.1.1 # 設置為指定部署機器IP
......
http:
port: 8081 # 從80修改為指定端口(可選)
https: # 注釋掉 https 相關(無證書必須注釋掉)
......
harbor_admin_password: Harbor12345 # admin用戶指定密碼 (可選)
......
data_volume: /root/software/harbor/data # 數據存儲目錄(可選)
......
log:
......
local:
......
location: /root/software/harbor/logs # 日志目錄(可選)

(3)編譯安裝

./prepare
./install.sh

瀏覽器打開 http://192.168.1.1:8081(admin/Harbor12345),新建鏡像倉庫

(4)修改 docker 配置

配置 docker 鏡像源,添加 Harbor 鏡像倉庫地址,需重啟 docker 生效

vim /etc/docker/daemon.json
{
......
"insecure-registries":["192.168.1.1:8081"]
.....
}

重啟 docker

systemctl daemon-reload
systemctl restart docker

(5)設置開機自啟動

vim /usr/lib/systemd/system/harbor.service
[Unit]
Description=Harbor service with docker-compose
Requires=docker.service
After=docker.service
[Service]
Restart=always
#Type=oneshot
RemainAfterExit=yes
StandardError=null
StandardOutput=null
# Harbor實際安裝路徑
WorkingDirectory=/home/software/harbor/harbor
# Remove old containers
ExecStartPre=/usr/local/bin/docker-compose -f /home/software/harbor/harbor/dockercompose.yml down -v
# Compose up
ExecStart=/usr/local/bin/docker-compose -f /home/software/harbor/harbor/dockercompose.yml up -d
# Compose down, remove containers
ExecStop=/usr/local/bin/docker-compose -f /home/software/harbor/harbor/dockercompose.yml down -v
[Install]
WantedBy=multi-user.target

設置自啟動

systemctl daemon-reload
systemctl enable harbor

3. Sonarqube 代碼檢測工具安裝

(1)下載在線安裝包

mkdir -p /home/software/sonarqube
cd /home/software/sonarqube
wget https://all-share-public.oss-cn-shanghai.aliyuncs.com/install-sonarqube/sonarqube.tar
tar -zxvf sonarqube.tar
cd sonarqube

若是需要修改端口、掛載文件路徑,編輯當前目錄下 docker-compose.yml 文件即可

# 執行安裝程序
./install.sh

(2)創建 Token 令牌

瀏覽器打開 http://192.168.1.1:8021,賬號:admin/admin

創建 Token 令牌:生成的 Token 值要記錄下來,配置 Jenkins 流水線時需要使用
在這里插入圖片描述

二、Jenkins配置

1. 插件安裝

需要安裝以下插件:
Publish Over SSH:用于Jenkins 發送文件到遠程服務器
Maven Integration:Maven 插件,打包項目
GitLab:Gitlab 插件,拉取代碼
DingTalk:釘釘插件,用于推送項目構建狀態等通知

系統管理 -> 插件管理,安裝完成后重啟 Jenkins
在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述

2. 配置 JDK 和 Maven

點擊:系統管理 -> 全局工具配置

在這里插入圖片描述


在這里插入圖片描述

3. 配置 SSH 連接

點擊:系統管理 -> 系統配置 -> 找到SSH
在這里插入圖片描述

4. 配置全局憑據

點擊:系統管理 -> 憑據管理 -> System/全局 -> Add Credentials
根據合適的認證方式創建憑據(示例為用戶名&密碼)
在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述

5. 配置釘釘通知

此配置為構建項目時釘釘推送通知,若是不需要可忽略

(1)生成釘釘 webhook 地址和密鑰

打開釘釘 選擇要推送的群 -> 群設置 -> 機器人 -> 添加機器人 -> 自定義 -> 添加 打開如下頁面
在這里插入圖片描述


在這里插入圖片描述

(2)Jenkins中配置釘釘信息

在這里插入圖片描述


在這里插入圖片描述


在這里插入圖片描述

三、Jenkins 構建項目

Jenkins中構建項目的類型有很多,實際上每種類型的構建都可以完成一樣的構建過程與結果,只是在操作方式、靈活度等方面有所區別,在實際開發中可以根據自己的需求和習慣來選擇。從靈活度上來說,流水線類型是最高的。常用的有以下三種:

  • 自由風格軟件項目(FreeStyle Project)(推薦)
  • 流水線項目(Pipeline Project)(推薦)
  • Maven項目(Maven Project)

1. 新建任務(選擇流水線)

在這里插入圖片描述

2. 配置構建參數

用于在構建項目時動態維護的參數(例如 構建的代碼分支、構建環境等)
在這里插入圖片描述

3. 構建流水線(Pipeline)【重點】

Jenkins Pipeline Doc

tools :工具定義。可定義在腳本中使用的工具等;需在 系統管理 -> 全局配置管理 中維護,此處填寫對應的 maven 和 jdk 名稱即可
environment:變量定義。可將代碼倉庫地址,項目部署路徑等信息在該模塊下定義,方便維護
stages:Pipeline 各階段定義。是必須出現的指令,包含一個或多個 stage,Pipeline 的大部分工作在此執行。可以在此處進行項目代碼拉取、打包、推送倉庫、部署等一系列操作
post:post 是在 Pipeline 或者 stages 執行結束后的操作,不是必須出現的指令。例如發送項目構建成功、失敗等通知

在這里插入圖片描述

以下為示例 Pipeline 腳本,可根據實際情況進行修改。

pipeline {agent anytools {// 需在 系統管理 -> 全局配置管理 中維護,此處填寫對應的 maven 和 jdk 名稱即可maven "maven3.9.9"jdk "java17"}environment {// 項目名稱 projectName = "ruoyi-cloud-plus"// projectCodeParentPath = "./ruoyi-cloud-plus"    			 // 項目父模塊代碼路徑// projectCodeSubPath = "./ruoyi-cloud-plus/admin-server"    // 項目子模塊代碼路徑(如果沒有子模塊,則刪除此變量,下面引用此變量的地方均修改為 $projectCodeParentPath) // 項目部署服務器路徑serverPath = "/home/project/ruoyi-cloud-plus" // git倉庫的url地址gitUrl = 'http://192.168.1.1/gitlab/demo/ruoyi-cloud-plus.git'// git倉庫的認證憑據ID, 可前往 系統管理-> 憑據管理 查看gitCredentialsId = "git-demo"// sonarqube 的 url 地址sonarquebUrl = "http://192.168.1.1:8021"// sonarqube 的 token 令牌                             sonarquebToken = "sqa_05fxxxxxxxxxxxx227b1"// harbor 鏡像倉庫的用戶名harborUser = "admin"// harbor鏡像倉庫的用戶密碼harborPasswrod="Harbor12345"// harbor倉庫的url地址harborUrl = "192.168.1.1:8081"// harbor倉庫項目名稱harborRepo = "demo-library"// 釘釘機器人IDdingTalk = "Jenkins-DingTalk"}stages {stage('=========【拉取代碼】=========') {steps{git branch: params.branchName, credentialsId: env.gitCredentialsId, url: env.gitUrl}}stage('=========【編譯打包】=========') {steps {sh """mvn clean package -Dmaven.test.skip=true -P ${params.active}"""}}stage('=========【sonarqueb代碼質量檢測】=========') {            steps {sh """                     /var/jenkins_home/sonar-scanner/bin/sonar-scanner \\-Dsonar.projectKey=${env.projectName}-${params.branchName} \\                -Dsonar.projectName=${env.projectName}-${params.branchName} \\          -Dsonar.sourceEncoding=UTF-8 \\-Dsonar.sources=${env.projectCodeParentPath} \\-Dsonar.java.binaries=${env.projectCodeSubPath}/target/ \\-Dsonar.host.url=${env.sonarquebUrl} \\-Dsonar.login=${env.sonarquebToken}"""}}stage('=========【構建鏡像到Harbor倉庫】=========') {steps {sh """echo "-------- 1. 構建鏡像 ------------"docker build -t ruoyi-nacos:${params.imageTag} -f ruoyi-nacos/Dockerfile .docker build -t ruoyi-auth:${params.imageTag} -f ruoyi-auth/Dockerfile .docker build -t ruoyi-gateway:${params.imageTag} -f ruoyi-gateway/Dockerfile .docker build -t ruoyi-system:${params.imageTag} -f ruoyi-modules/ruoyi-system/Dockerfile .echo "-------- 2. 鏡像打標簽 ------------"docker login -u ${harborUser} -p ${harborPasswrod} ${harborUrl}docker tag ruoyi-nacos:${params.imageTag} ${harborUrl}/${harborRepo}/ruoyi-nacos:${params.imageTag}docker tag ruoyi-auth:${params.imageTag} ${harborUrl}/${harborRepo}/ruoyi-auth:${params.imageTag}docker tag ruoyi-gateway:${params.imageTag} ${harborUrl}/${harborRepo}/ruoyi-gateway:${params.imageTag}docker tag ruoyi-system:${params.imageTag} ${harborUrl}/${harborRepo}/ruoyi-system:${params.imageTag}echo "-------- 3. 推送鏡像至Harbor ------------"docker push ${harborUrl}/${harborRepo}/ruoyi-nacos:${params.imageTag}docker push ${harborUrl}/${harborRepo}/ruoyi-auth:${params.imageTag}docker push ${harborUrl}/${harborRepo}/ruoyi-gateway:${params.imageTag}docker push ${harborUrl}/${harborRepo}/ruoyi-system:${params.imageTag}echo "-------- 4. 刪除未被任何容器使用的鏡像 ------------"// docker image prune -f"""}}stage('=========【拉取鏡像并運行】=========') {        steps {   sshPublisher(publishers: [sshPublisherDesc(configName: 'service-160', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: """#!/bin/bashcd ${env.serverPath} ./deploy.sh ${env.harborUrl} ${env.harborUser} ${env.harborPasswrod} ${env.harborRepo} ${params.imageTag}""", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: """${env.servePath}""", remoteDirectorySDF: false, removePrefix: 'docker', sourceFiles: 'docker/docker-compose.yml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: true)])}}}// 若是不需要配置釘釘推送,則不需要下面的配置   post {        success {  dingtalk (                robot: '${dingTalk}',                type:'MARKDOWN',title: "${projectName}項目構建成功",                text: [                  "### ${projectName}項目構建成功",                 "---","- 環境: ${params.active}", "- 分支: ${params.branchName}",              "- 持續時間: ${currentBuild.durationString}",              "- 執行人:${currentBuild.buildCauses.shortDescription}"             ])   }failure {            dingtalk (                robot: '${dingTalk}',                type:'MARKDOWN',                title: "${projectName}項目構建失敗",                text: [                  "### ${projectName}項目構建失敗",                 "---","- 環境: ${params.active}", "- 分支: ${params.branchName}",              "- 持續時間: ${currentBuild.durationString}",              "- 執行人:${currentBuild.buildCauses.shortDescription}"             ])   } unstable {            dingtalk (                robot: '${dingTalk}',                type:'MARKDOWN',                title: "${projectName}項目構建異常",                text: [                  "### ${projectName}項目構建異常",                 "---",  "- 環境: ${params.active}", "- 分支: ${params.branchName}",              "- 持續時間: ${currentBuild.durationString}",              "- 執行人:${currentBuild.buildCauses.shortDescription}"             ])   } }  
}

4. 部署項目服務器上預置腳本

該步驟可忽略,需同時修改流水線腳本中【拉取鏡像并運行】stage 對該腳本的引用

在需要部署應用的服務器中,然后在 environment 中 serverPath 路徑下編寫 deploy.sh(記得賦予執行權限)

下面是提供的 deploy.sh 示例模版(需根據自身項目修改)

#!/bin/bash
# 接收啟動時的傳參
harborUrl=$1
harborUser=$2
harborPasswrod=$3
harborRepo=$4
imageTag=$5# 拼接完整鏡像地址變量,在docker-compose文件中可引用
nacos_image=$(echo "nacos_image=\"$harborUrl/$harborRepo/ruoyi-nacos:$imageTag\"")
auth_image=$(echo "auth_image=\"$harborUrl/$harborRepo/ruoyi-auth:$imageTag\"")
gateway_image=$(echo "gateway_image=\"$harborUrl/$harborRepo/ruoyi-gateway:$imageTag\"")
system_image=$(echo "system_image=\"$harborUrl/$harborRepo/ruoyi-system:$imageTag\"")# 新建 docker-compose 環境變量文件, 并寫入鏡像地址
envFile=".env"
rm -f "$envFile"echo "$nacos_image" >> "$envFile"
echo "$auth_image" >> "$envFile"
echo "$gateway_image" >> "$envFile"
echo "$system_image" >> "$envFile"# 登錄 Harbor 倉庫
docker login -u ${harborUser} -p ${harborPasswrod} ${harborUrl}# 停止并刪除服務
docker-compose down# 啟動 nginx
docker-compose up -d nginx-web# 啟動 nacos            
docker-compose up -d nacos# 啟動 ruoyi-gateway ruoyi-auth ruoyi-system
docker-compose up -d ruoyi-gateway ruoyi-auth ruoyi-system# 刪除未被任何容器使用的鏡像
docker image prune -f

至此配置完成,進行構建驗證

四、Jenkins Pipeline語法

1. stages

Pipeline 階段定義,是必須出現的指令,每個 Pipeline 包含一個或多個 stage,Pipeline 的大部分工作在此執行。可以在此處進行 項目代碼拉取、打包、推送倉庫、部署等一系列操作。其中 steps 塊中可以包含script 塊。

pipeline {agent anystages {stage('第一階段') {steps {echo '第一階段 拉取代碼'}}stage('第二階段') {steps {echo '第二階段 項目打包'}}}
}

2. post

post是在Pipeline或者 stage執行結束后的操作,不是必須出現的指令,可設置以下觸發條件:

  • always:無論 Pipeline 或者 stage 運行完成的狀態如何都會運行
  • changed:只有當前 Pipeline 或者 stage 運行的狀態與先前運行狀態不同時才能運行
  • fixed:只有當前一次構建失敗或者不穩定,而當前 Pipeline 或者 stage 運行成功時運行
  • regression:前一次運行成功,而當前 Pipeline 或者 stage 運行狀態為 failure, unstable 或者 aborted 時運行
  • aborted:只有當前 Pipeline 或者 stage 處于 “aborted” 狀態時才能運行,通常是手動終止。
  • failure:當前 Pipeline 或者 stage 處于 “failed” 狀態時才運行
  • success:當前 Pipeline 或者 stage 具有 “success” 狀態時才運行
  • unstable:當前 Pipeline 或者 stage 具有 “unstable” 狀態才運行
  • unsuccessful:當前 Pipeline 或者 stage 不是 “success” 狀態時運行
  • cleanup:不管 Pipeline 或 stage 的狀態如何,在每一個 post 條件被執行之后運行。
pipeline {agent anystages {stages {stage('第一階段') {steps {echo '第一階段 拉取代碼'}}}post {success {echo '代碼拉取成功!'}failure {echo '代碼拉取失敗!'}always {echo 'goodbye'}}
}

3. 流水線語法生成

在配置流水線頁面,點擊流水線語法可打開語法生成器頁面
在這里插入圖片描述

(1)在此處可選擇需要生成語法的類型

  • 拉取代碼 :git:Git
  • 推送文件到遠程服務器:sshPublisher:Send build artifacts over SSH
    在這里插入圖片描述

(2)填寫對應的參數信息,此處以文件推送示例

推送文件路徑配置可結合文章開頭Jenkins工作空間目錄描述進行配置,其中docker/docker-compose.yml就位于/var/jenkins_home/workspace/demo路徑下,此處只需配置docker/docker-compose.yml即可
在這里插入圖片描述
填寫完成后,點擊下方的 “生成流水線腳本” 進行生成,最后復制生成的腳本到 steps 中即可

在這里插入圖片描述


在這里插入圖片描述

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

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

相關文章

【Java】面試題 并發安全 (1)

文章目錄 synchronized1. 基本概念與作用2. 使用方式3. 底層原理(基于monitor)4. 面試題回答要點5. 注意事項與進階理解 Java中synchronized鎖相關知識總結Java內存模型(JMM)CAS概述及重要性volatile關鍵字AQS簡介 synchronized …

前端項目 npm報錯解決記錄

1.首先嘗試解決思路 npm報錯就切換yarn , yarn報錯就先切換npm刪除 node_modules 跟 package-lock.json文件重新下載依 2. 報錯信息: Module build failed: Error: Missing binding D:\vue-element-admin\node_modules\node-sass\vendor\win32-x64-8…

深度學習中batch_size

Batch size調整和epoch/iteration的關系 訓練數據集總共有1000個樣本。若batch_size10,那么訓練完全體樣本集需要100次迭代,1次epoch。 訓練樣本10000條,batchsize設置為20,將所有的訓練樣本在同一個模型中訓練5遍,則…

Redis 數據類型全解析:基礎與進階應用場景

前言:Redis 是一個高性能的內存數據庫,支持多種數據類型,能夠高效處理各種場景的數據存儲和操作。 以下是Redis數據類型的數據結構及其應用場景的詳細說明: 基礎數據類型 1. 字符串 (String) 底層數據結構 Simple Dynamic Stri…

評分模型在路網通勤習慣分析中的應用——提出問題(1)

1、問題的由來、目標和意義 最近一段時間和公司其它業務部門討論時,發現一個有趣的交通路網問題,車輛從S點行駛到V點共用時40分鐘,這段時間內路網中的卡口攝像頭識別到了車輛通過的信息。如下圖所示: 設計師需要通過這些有限的路…

leetcode 面試經典 150 題:刪除有序數組中的重復項

鏈接刪除有序數組中的重復項題序號26題型數組解題方法雙指針難度簡單熟練度????? 題目 給你一個 非嚴格遞增排列 的數組 nums ,請你 原地 刪除重復出現的元素,使每個元素 只出現一次 ,返回刪除后數組的新長度。元素的 相對順序 應該保…

提升生產力工具

VSCODE插件 干貨:用好這13款VSCode插件,工作效率提升10倍 - 程序員檸檬 - 博客園 Sourcetrail Sourcetrail 是一個開源且免費的源碼閱讀工具,以其強大的代碼導航、可視化及跨平臺支持特性,成為開發者理解復雜代碼庫的得力助手。…

什么是 Git Hooks?

在團隊開發中,當成員提交代碼的描述信息不符合約定提交規范的時候,需要阻止當前的提交,而要實現這個目的,我們就需要先來了解一個概念,叫做 Git hooks,即Git 在執行某個事件之前或之后進行一些其他額外的操…

Go語言方法和接收器類型詳解

Go語言方法和接收器類型詳解 1. 方法接收器類型 1.1 值接收器 值接收器方法不會改變接收器的狀態,因為Go語言會在調用時復制接收器的值。因此,任何對接收器成員變量的修改都只會影響副本,而不會影響原始結構體實例。 type Person struct …

MS SQL Server 實戰 排查多列之間的值是否重復

目錄 需求 范例運行環境 數據樣本設計 功能實現 上傳EXCEL文件到數據庫 SQL語句 小結 需求 在日常的應用中,排查列重復記錄是經常遇到的一個問題,但某些需求下,需要我們排查一組列之間是否有重復值的情況。比如我們有一組題庫數據&am…

抖去推碰一碰系統技術源碼/open SDK轉發技術開發

抖去推碰一碰系統技術源碼/open SDK轉發技術開發 碰一碰智能系統#碰碰卡系統#碰一碰系統#碰一碰系統技術源頭開發 碰碰卡智能營銷系統開發是一種集成了人工智能和NFC技術的工具,碰碰卡智能營銷系統通過整合數據分析、客戶關系管理、自動化營銷活動、多渠道整合和個…

redis優化

在高并發、高性能、高可用系統中,Redis 的優化至關重要。以下是一些在面試中可以詳細說明的 Redis 優化策略,以及具體的實踐經驗和技術亮點: 1. 數據模型與結構設計優化 使用合適的數據結構 :根據業務需求選擇合適的 Redis 數據結…

WEB攻防-通用漏洞-文件上傳-js驗證-MIME驗證-user.ini-語言特征

目錄 定義 1.前端驗證 2.MIME驗證 3.htaccess文件和.user. ini 4.對內容進行了過濾,做了內容檢測 5.[ ]符號過濾 6.內容檢測php [] {} ; 7.()也被過濾了 8.反引號也被過濾 9.文件頭檢測 定義 文件上傳漏洞是指攻擊者上傳了一個可執行文件(如木馬…

探索與決策的完美結合:Actor-Critic 方法及其衍生算法

引言 在強化學習領域,如何讓智能體學會做出最優決策是一個關鍵問題。Actor-Critic 方法提供了一種高效的解決方案,它結合了策略梯度(Actor)和值函數(Critic)的優點,使智能體能夠在復雜的環境中…

未來網絡技術的新征程:5G、物聯網與邊緣計算(10/10)

一、5G 網絡:引領未來通信新潮流 (一)5G 網絡的特點 高速率:5G 依托良好技術架構,提供更高的網絡速度,峰值要求不低于 20Gb/s,下載速度最高達 10Gbps。相比 4G 網絡,5G 的基站速度…

數據交易和聯邦學習的背景下的安全屬性

數據交易和聯邦學習的背景下的安全屬性 在數據交易和聯邦學習的背景下,安全屬性對于保護數據隱私、確保系統可靠性和維護交易公平性至關重要。以下將分析文章中涉及的安全屬性以及分析這些屬性的目的。 涉及的安全屬性 雙向認證:文章雖未明確提及傳統意義上的雙向認證機制,…

QWT 之 QwtPlotDirectPainter直接繪制

QwtPlotDirectPainter 是 Qwt 庫中用于直接在 QwtPlot 的畫布上繪制圖形的一個類。它提供了一種高效的方法來實時更新圖表,特別適合需要頻繁更新的數據可視化應用,例如實時數據流的顯示。 使用 QwtPlotDirectPainter 的主要優勢在于它可以繞過 QwtPlot 的…

改變HTML元素的方式有哪些?如何在HTML中添加/替換或刪除元素?

使用 JavaScript 的 DOM 操作 如果想要修改元素的樣式,就要先獲取元素之后再進行下一步操作 獲取元素:可以使用等方法獲取到需要操作的 HTML 元素。 document.getElementById() document.getElementsByClassName() document.getElementsByTagName() d…

SuperMap iClient3D for Cesium等高線標注

kele 前言 在三維地形分析中,等高線分析是一種非常重要的分析方法,它能直觀的表達出地形的高低起伏特征,在三維系統中受到廣泛應用。在SuperMap iClient3D for Cesium中,等高線分析是前端GPU分析,能夠分析并渲染出等高…

從 x86 到 ARM64:CPU 架構的進化與未來

在計算機發展的歷史長河中,x86、x64 和 ARM64 這三大主流 CPU 架構各自書寫了輝煌的篇章。它們不僅代表了技術的進步,更承載著無數創新者的夢想與努力。 x86:從 16 位到 32 位的輝煌之路 誕生與崛起 1978 年,英特爾(…