Jenkins搭建、權限管理、參數化、流水線等詳細教程!

部署Jenkins

一、jenkins 安裝

官網:?https://jenkins.io

yum 安裝 jenkins *jenkins 依賴 java 環境 #注意2.346之后的版本不再支持jdk8
卸載舊jenkins
#查詢以前是否安裝jenkins
rpm -qa |grep jenkins
#卸載 jenkins
yum -y remove jenkins ?
rpm -e jenkins
#徹底刪除jenkins殘留文件
find / -iname jenkins | xargs -n 1000?rm?-rf# 導入jenkins源
wget -O /etc/yum.repos.d/jenkins.repo ? ? https://pkg.jenkins.io/redhat/jenkins.repo
# 導入jenkins官方證書
rpm --import https://pkg.jenkins.io/redhat/jenkins.io-2023.key#安裝jdk11
yum install fontconfig java-17-openjdk -y
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm
#有點慢,可以在Windows上提前下載導入。
sudo?yum -y install ./jdk-17_linux-x64_bin.rpm
java -version#安裝jenkins
yum install jenkins -y
#設置開機自啟動
systemctl?enable?jenkins?#rpm安裝
wget http://pkg.jenkins-ci.org/redhat-stable/jenkins-2.346.1-1.1.noarch.rpm?
#安裝
rpm -ivh jenkins-2.346.1-1.1.noarch.rpm ?
二、配置文件
2.1 查詢 yum 下載 Jenkins 安裝的文件
[root@k8s-master-node1 ~]# rpm -ql jenkins
/usr/bin/jenkins ? ?# Jenkins 服務二進制文件
/usr/lib/systemd/system/jenkins.service?#systemd 服務單元文件,定義Jenkins啟動參數
/usr/share/java/jenkins.war?# war 包?
/var/cache/jenkins ?# war包解壓目錄 jenkins網頁代碼目錄
/var/lib/jenkins ?# jenkins 工作目錄
2.2 修改配置文件

配置文件說明

[root@k8s-master-node1 ~]# grep -Ev?"^(#|$)"?/usr/lib/systemd/system/jenkins.service
[Unit]
Description=Jenkins Continuous Integration Server ? ?# Jenkins 持續集成服務器的描述
Requires=network.target ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 依賴于網絡服務,表示網絡必須先啟動
After=network.target ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??# 在網絡服務啟動后再啟動 Jenkins
[Service]
Type=notify ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 服務類型為 notify,表示服務啟動后會通知?
NotifyAccess=main ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 僅監聽主進程的通知
ExecStart=/usr/bin/jenkins ? ? ? ? ? ? ? ? ? ? ? ? ??# 啟動 Jenkins 的命令
Restart=on-failure ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??# 在服務失敗時自動重啟
SuccessExitStatus=143 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 指定退出狀態碼 143 為正常退出
User=root ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 以 root 用戶身份運行 Jenkins
Group=root ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??# 以 root 用戶組身份運行 Jenkins
Environment="JENKINS_HOME=/var/lib/jenkins"? ? ? ? ??# 設置 Jenkins 主目錄的環境變量
WorkingDirectory=/var/lib/jenkins ? ? ? ? ? ? ? ? ? ?# 指定工作目錄為 /var/lib/jenkins
Environment="JENKINS_WEBROOT=%C/jenkins/war"? ? ? ? ?# 設置 Jenkins Web 根目錄的環境變量
Environment="JAVA_OPTS=-Djava.awt.headless=true"? ? ?# 設置 Java 選項為無頭模式
Environment="JENKINS_PORT=3333"? ? ? ? ? ? ? ? ? ? ??# 設置 Jenkins 監聽的端口為 3333
[Install]
WantedBy=multi-user.target ? ? ? ? ? ? ? ? ? ? ? ? ??# 在多用戶目標(運行級別)下啟動 Jenkins
2.3 啟動 jenkins
  • ? 啟動之前修改以 root 用戶、群組身份運行 Jenkins, 確保后面 Jenkins 有權限使用 Docker 服務。

接下來啟動:

`[root@k8s-master-node1 ~]# systemctl start jenkins`
2.4 驗證安裝
[root@k8s-master-node1 /data]# ps -ef|grep jenkins
root ? ? ?3523 ?7329 ?0 14:04 pts/0 ? ?00:00:00 grep --color=auto jenkins
jenkins ?12697 ? ? 1 ?7 14:01 ? ? ? ? ?00:00:15 /usr/local/java/jdk1.8.0_121/bin/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true?-DJENKINS_HOME=/var/lib/jenkins -jar /usr/lib/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20
三、jenkins配置(web頁面)
3.1 管理員密碼獲取

?

[root@k8s-master-node1 ~]# cat /var/lib/jenkins/secrets/initialAdminPassword

3.2 安裝插件 (選擇在線安裝)

?

如果采用最新版的 一般不一會出現這個情況

?

出現離線安裝解決方法:

1)修改 /var/lib/jenkins/updates/default.json

jenkins 在下載插件之前會先檢查網絡連接,其會讀取這個文件中的網址。默認是訪問谷歌,肯定監測失敗,所以將圖下的google改為www.baidu.com即可,更改完重啟服務。

?

2)修改/var/lib/jenkins/hudson.model.UpdateCenter.xml

該文件為jenkins下載插件的源地址,默認為:https://updates.jenkins.io/update-center.json,就是因為https的問題,此處我們將其改為http即可,之后重啟jenkins服務即可。

其他國內備用地址(也可以選擇使用):

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

http://mirror.esuni.jp/jenkins/updates/update-center.json

在修復完之后,我們發現離線問題已經解決

選擇安裝推薦的插件:

?

3.3 創建第一個管理員用戶

?

3.4 url 配置

之前版本沒有這個選項,這里默認即可:

?

3.5 安裝完成

出現如下頁面時,表示安裝完成

?

?

3.6 配置 jdk、git、maven

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

?

jdk:可以自動安裝,但是選擇本地安裝的適合項目jdk版本,寫入我們jdk的路徑即可

?

git:

?

maven:

?

3.7 jenkins 下載插件失敗處理辦法

jenkins 下載插件失敗,提示:

java.io.IOException: Downloaded file /app/jenkins_home/plugins/jacoco.jpi.tmp does not?match?expected SHA-1, expected?'CtK02wHdFOxTutqhUQzmue6uvpg=', actual?'YGO05utKyaaFzpGCgCE95GS0WsU='at hudson.model.UpdateCenter.verifyChecksums(UpdateCenter.java:1783)at hudson.model.UpdateCenter.access$1100(UpdateCenter.java:147)at hudson.model.UpdateCenter$InstallationJob.replace(UpdateCenter.java:1934)at hudson.model.UpdateCenter$UpdateCenterConfiguration.install(UpdateCenter.java:1178)at hudson.model.UpdateCenter$DownloadJob._run(UpdateCenter.java:1653)at hudson.model.UpdateCenter$InstallationJob._run(UpdateCenter.java:1848)at hudson.model.UpdateCenter$DownloadJob.run(UpdateCenter.java:1624)at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)at java.util.concurrent.FutureTask.run(FutureTask.java:266)at hudson.remoting.AtmostOneThreadExecutor$Worker.run(AtmostOneThreadExecutor.java:110)at java.lang.Thread.run(Thread.java:745)

中國源的問題。需要換個源就可,換源方法:

jenkins->系統管理->管理插件->高級 選擇升級站點

把:http://updates.jenkins-ci.org/update-center.json

換成:http://mirror.esuni.jp/jenkins/updates/update-center.json

鏡像地址查詢:

http://mirrors.jenkins-ci.org/status.html

Jenkins 核心功能使用

一、Jenkins 用戶權限管理
1.1 用戶管理背景

針對開發、運維、測試針對不同角色進行不同權限劃分,

基于插件: Role-based Authorization Strategy ,Authorize Project 來實現。

1.2 ?安裝用戶管理插件

安裝該插件:

系統管理->管理插件-可選插件->搜索該插件選中直接安裝即可。

?

?

1.3 開啟該插件功能

系統管理->全局安全設置-授權策略->選中該插件功能即可->保存

?

1.4 驗證用戶管理

關閉用戶管理功能來進行實踐測試

1、策略改回原來的(全局安全配置)

?

2、開啟允許用戶注冊(全局安全配置)

?

3、注冊一個新用戶

?

4、登錄之后,其默認就是管理員用戶,可以進行任何操作

?

5、開啟 Role-Based Strategy

6、重新登錄新創建 test1 用戶,顯示已經沒有任何權限了

?

1.5 權限劃分

安裝 Role-Based Strategy 插件后,系統管理?中多了如圖下所示的一個功能,用戶權限的劃分就是靠他來做的。

?

1、Manage Roles(管理角色)

  • ? Manage Roles:管理角色,相當于針對角色賦予不同權限,然后在將該角色分配給用戶。角色就相當于一個組。其里面又有Global roles(全局)、Project roles(項目)、Slave roles(),來進行不同劃分。

默認如圖下所示:

?

1)Global roles

默認是有一個admin用戶的,是所有權限都有的,所有權限都是勾選了的。

接下來我們來添加一個角色:user

?

給其一個讀的權限。

2)Item roles
  • ? roles to add:表示項目角色

  • ? Pattern:是用來做正則匹配的(匹配的內容是Job(項目名)),比如說根據正則匹配到的項目項目角色就都有權限;

接下來新建一個island 項目角色,改項目角色一般給其構建、取消、讀取、讀取空間權限,一般配置這4個即可

?

  • ? Agent roles (代理角色):節點相關的權限

  • ? roles to add:表示項目角色

  • ? Pattern:是用來做正則匹配的(匹配的內容是節點(Agent節點)),比如說根據正則匹配到的項目項目角色就都有權限;

?

2、Assigin roles(分配角色)

1)給予test用戶分配 user 角色

這樣其就有 manage roles 中剛才創建的user角色的權限了。

?

此時再去看 test1用戶,已有查看的權限了

?

2)針對指定用戶分配項目角色(一般最常用的就是針對不同用戶進行項目角色分配)

比如將test用戶分配有 island 項目角色,這樣其就可以有剛才我們創建的island 項目角色正則匹配到的項目的權限了。

?

二、Jenkins 參數化構建

2.1 參數化構建背景

如果只是簡單的構建,jenkins自己默認的插件可以做,但是如果我們想要在構建過程中有更多功能,比如說:選擇性構建、傳參、項目指定變量等等其他功能,基礎的參數化構建可以實現一些簡單功能,但是要想使用更多功能這時候我們就需要借助參數化構建來實現交互的功能。此處我們來借助以下插件來進行實現:

  • ? Extended Choice Parameter(更豐富的參數化構建插件)

  • ? Git Parameter

2.2 安裝插件

首先還是安裝該插件,去管理插件里面進行安裝 Extended Choice Parameter

?

1、項目配置

?

2、構建選擇分支進行測試,添加branch參數?git配置中選$branch參數

?

?

3、參數化配置已經生效

?

2.3 Git 插件

再用 git 時使用該插件是非常方便的。

1、安裝插件 Git Parameter

?

2、進行配置

在配置之前有一個坑,當我們在配置git中寫了遠端地址后,會有報錯:

這個是和前面docker報錯是一樣的

這是因為 jenkins 我們 yum 裝的運行用戶是 jenkins 用戶,此處是 jenkins 用戶去 git 倉庫進行拉取,而 jenkins 用戶的話默認是 /bin/false 的,不但不能登錄,也沒有 git 命令權限,所以肯定是失敗的。

解決此問題兩種辦法:

  • ? 更改jenkins用戶為root用戶;

  • ? 更改jenkins用戶為正常的普通用戶/bin/bash,將其的公鑰加入到git服務器的git用戶中。

此處暫時先用第一種解決辦法,更改 jenkins 的運行用戶為 root 用戶,通過如下方式進行更改:

?

  • ? 將/usr/lib/systemd/system/docker.service;文件中user和group改為root

  • ? 然后再重啟即可。

三、Jenkins pipeline
3.1 概覽

?

3.2 安裝

在對 jenkins 進行初始化安裝時,默認已經安裝了 jenkins 的相關插件,如下圖所示:

?

3.3 實操

1、新建任務

?

2、編寫 pipeline 腳本

?

可以借助流水線語法去做。

roads流水線腳本:

pipeline {?agent any?// 參數化parameters {// ?string defaultValue:?'2.0.0', description:?'選擇版本', name:?'version'gitParameter branchFilter:?'origin/(.*)', defaultValue:?'master', name:?'BRANCH',?type:?'PT_BRANCH'string(name:?'version', defaultValue:?'2.0.0', description:?'選擇版本')
}tools {jdk?'jdk1.8'? ?maven?'maven-3.9.6'}stages {stage('pull code') {steps {cleanWs() //清空workspaceecho'pull start'git branch:?"${params.BRANCH}", ?credentialsId:?'xxxxxxxxxxxxxxxxxxxx', url:?'xxxxxxxxxxxxxxxxxxxxxxx'echo'pull end'}}stage('mvn install xxxxxxxxxx') {steps {echo'build xxxxxxxx'dir('xxxxxxxx') {sh?"mvn -v"sh?"mvn clean install -Dmaven.test.skip=true"}?}}stage('mvn install xxxxxxxxxx') {steps { ? ? ??echo'build xxxxxxxx'dir('xxxxxxxxxxx') {sh?"mvn clean install -Dmaven.test.skip=true"}?}}stage('mvn install xxxxx') {steps {echo'build xxxxxxxxx'dir('xxxxxxxx') {sh?"mvn clean install -Dmaven.test.skip=true"} ? ?}}stage('mvn install island-opple') {steps {echo'build island-opple'sh?"mvn clean install -Dmaven.test.skip=true"}}// stage('login docker') {// ? ? steps {// ? ? ? ??echo'start login docker'// ? ? ? ? sh?"docker login --username=xxxxxxxxxxxx --password=xxxxxxxxx registry.cn-hangzhou.aliyuncs.com"// ? ? }}stage('make image and push') {steps {echo'start build image'script {def selectedProjects =?"${project_name}".split(',')if(selectedProjects.size()>0){for(int i=0;i<selectedProjects.size();i++){aaa = selectedProjects[i].replace("\"",?"")dir(aaa){sh?"pwd"sh?'''sed -i "1c FROM xxxxxxxxxxxxxxxxxx" Dockerfile?'''sh?"mvn -Ddocker.image.tag=${version}?dockerfile:build"sh?'''sleep 3image=$(docker images | sed -n '2p' | awk '{print$1":"$2}')echo $image'''// docker push?$image}}}}}}}
}
3、構建測試

具體配置詳解請參考?Pipeline

四、Jenkins 構建郵件狀態通知
4.1 前提

前提:服務器開啟郵箱服務

(如果啟動失敗修改/etc/postfix/main.cf,確保?inet_interfaces?參數正確設置。默認是inet_interfaces = localhost,

如果你的服務器只想監聽 IPv4 地址,可以將該參數設置為?inet_interfaces = 127.0.0.1

如果想監聽所有地址(包括 IPv4 和 IPv6),可以將其設置為?inet_interfaces = all

?

4.2 ?基礎配置

需要安裝一個插件:

插件: Email Extension Plugin

進行配置:

系統管理->系統設置->相關配置如下圖:

?

可以在此處進行測試發送!檢驗配置是否正確

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

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

相關文章

百度飛槳(PaddlePaddle)案例分享:基于 PaddleOCR 的圖像文字提取系統

一、案例背景 在實際教學、辦公及政務系統中&#xff0c;紙質材料&#xff08;如手寫作文、表格、試卷等&#xff09;仍廣泛存在。為提升信息處理效率&#xff0c;采用 OCR&#xff08;Optical Character Recognition&#xff09;技術將圖像中的文字提取為可編輯文本已成為剛需…

python操控鼠標

在已知屏幕坐標的情況下&#xff0c;可以通過 Python 的 pyautogui 或 pynput 等庫實現網頁上的鼠標點擊操作。以下是具體步驟和代碼示例&#xff1a; 1. 使用 PyAutoGUI&#xff08;推薦&#xff09; pyautogui 是一個簡單易用的庫&#xff0c;可以直接通過屏幕坐標控制鼠標點…

UV 與 Bun 深度解析

UV 與 Bun 深度解析&#xff1a;現代開發工具的安裝與使用指南 什么是 UV&#xff1f; UV&#xff08;Ultra-Velocity&#xff09;是由 Astral 公司&#xff08;Ruff 的創建者&#xff09;開發的超高速 Python 包管理工具&#xff1a; 用 Rust 編寫&#xff0c;速度極快&…

【算力網絡】多樣化算力感知

一、算力網絡 ? 算力網絡&#xff08;Computing Power Network&#xff09;是我國率先提出的原創性技術理念&#xff0c;其核心是通過高速網絡整合分散的算力資源&#xff08;如云端、邊緣、終端等&#xff09;&#xff0c;實現算力的動態感知、智能調度和一體化服務&#x…

Greenplum/PostgreSQL pg_hba.conf 認證方法詳解

Greenplum/PostgreSQL pg_hba.conf 認證方法詳解 pg_hba.conf 文件中的 METHOD 字段指定了客戶端認證方式&#xff0c;以下是各種認證方法的詳細說明和配置示例。 常用認證方法 1. trust - 無條件允許連接 說明&#xff1a;不需要密碼&#xff0c;完全信任連接 適用場景&am…

分布式數據庫中間件-Sharding-JDBC

前言 學習視頻&#xff1a;深入Sharding-JDBC分庫分表從入門到精通【黑馬程序員】本內容僅用于個人學習筆記&#xff0c;如有侵擾&#xff0c;聯系刪除 1、概述 1.1、分庫分表是什么 小明是一家初創電商平臺的開發人員&#xff0c;他負責賣家模塊的功能開發&#xff0c;其中…

pycharm2020.2版本給項目選擇了虛擬環境解釋器,項目文件都運行正常,為什么terminal文件路徑的前面沒有虛擬解釋器的名稱

解決問題&#xff1a; 1.打開 Anaconda Prompt輸入 conda init cmd.exe 或者 pycharm終端直接 conda init cmd.exe 重啟動 CMD和pycharm&#xff0c;使配置生效。

2025商旅平臺排行:國內主流商旅平臺解析

在數字化轉型加速2025年&#xff0c;企業商旅管理正從“成本中心”向“智能管控樞紐”升級。如何通過技術賦能實現商旅成本精準優化與管理效率躍升&#xff1f;本文聚焦國內五大主流商旅平臺&#xff0c;以“綜合型頭部平臺創新型平臺”雙維度解析&#xff0c;結合數據實證與場…

CNS無線電信號覆蓋分析系統v0.1

#系統終端有的版本號了# 開發一套類EMACS的專業軟件任重道遠&#xff0c;經過慢吞吞的開發&#xff0c;我們已經將目標定位大幅下調了&#xff0c;不再對標EMACS系統了&#xff0c;改為瞄行業老二WRAP軟件了。當然WRAP軟件在電磁信號仿真分析領域也是神一樣的存在&#xff0c;其…

單視頻二維碼生成與列表二維碼生成(完整版)

視頻二維碼有有兩種情況&#xff1a;一種是單個視頻的生成一個二維碼&#xff1b;另一種是一組視頻&#xff08;多個視頻&#xff09;生成一個列表二維碼。用戶按自己的實際需求生成&#xff0c;即可&#xff0c;很方便。 STEP1 注冊帳號 使用視頻二維碼&#xff0c;您需要注…

關于linux:1. Linux 基礎運維

一、Linux 安裝與發行版選擇 關于操作系統種類&#xff1a; 1&#xff09;基于 Linux 內核的操作系統 Ubuntu、Debian、Kali、CentOS、RHEL、Arch、Android、Alpine、OpenWRT 等 特點&#xff1a;開源、穩定、安全、廣泛使用于服務器與開發領域 2&#xff09;基于 Windows…

(LeetCode 每日一題) 2016. 增量元素之間的最大差值 (數組)

題目&#xff1a;2016. 增量元素之間的最大差值 思路&#xff1a;維護已遍歷過的最小值&#xff0c;時間復雜度0(n)。 C版本&#xff1a; class Solution { public:int maximumDifference(vector<int>& nums) {int mnnums[0];int ans0;for(int i1;i<nums.size()…

MySQL基礎與常用數據類型淺析

一.MySQL數據類型分類 二.數值類型 2.1int類型 我們使用TINYINT作為例子進行實驗驗證: 越界插入會直接報錯,跟我們當時學習語言的時候不太一樣,語言會進行隱式類型轉換或截斷.一般不會直接報錯.其他的int類型也是同理. 說明: 在MySQL中&#xff0c;整型可以指定是有符號的…

Ubuntu 20.04離線安裝Nvidia-docker

服務器因系統故障重裝&#xff0c;安裝docker容器時發現幾年前的在線安裝步驟不好使了&#xff0c;只好嘗試離線安裝。為了下次不卡殼&#xff0c;記錄一下安裝步驟。 先確定自己的操作系統&#xff0c;并確保已經安裝了nvidia driver。我的操作系統是Ubuntu 20.04。 1. 下載…

6,TCP客戶端

1,創建一個新的項目 2,界面設計

【dify更新問題】如何更新dify且低成本解決git pull 443問題

我的dify部署在mini server上&#xff0c;掛不了TZ&#xff0c;所以采用了如下辦法 更新origin (.git/config) 地址為&#xff1a;https://gitee.com/dify_ai/dify.git 順序執行 &#xff08;https://docs.dify.ai/en/getting-started/install-self-hosted/docker-compose#upg…

即時通訊消息推送技術深度解析:從底層原理到行業實踐-優雅草卓伊凡|片翼|擱淺

即時通訊消息推送技術深度解析&#xff1a;從底層原理到行業實踐-優雅草卓伊凡|片翼|擱淺 引言&#xff1a;重新啟程的即時通訊項目 優雅草科技的卓伊凡最近重啟了即時通訊項目的二次開發工作&#xff0c;在這個萬物互聯的時代&#xff0c;消息推送通知作為IM系統的核心功能之…

Joomla jdoc 語法使用介紹

jdoc 語句包含在每個 Joomla 模板中&#xff0c;用于指示 Joomla 或其擴展的其他部分輸出內容在整個網頁中的位置。本文將簡單的介紹一下Joomla模板開發中常用到的<jdoc>標簽語法&#xff0c;并且介紹不同類型的<jdoc>標簽元素的功能。 JDoc語句 一個典型的 jdoc…

Linux history 命令

Linux history 命令詳解 history 是 Linux 系統中一個非常實用的命令&#xff0c;用于查看、管理和操作當前 Shell 會話中執行過的命令歷史記錄。它可以幫助用戶快速重復執行命令、搜索歷史記錄、清除敏感命令等&#xff0c;極大地提高了命令行操作的效率。 一、基本用法 顯示…

側信道分析中的簡單模板攻擊(TA)Python實現(帶測試)

一、模板攻擊原理 模板攻擊&#xff08;Template Attacks, TA&#xff09;是一種高效的側信道分析方法&#xff0c;利用密碼設備運行時的物理泄漏信息&#xff08;如功耗&#xff09;恢復密鑰。其核心思想是通過建模密鑰相關中間值的泄漏特征&#xff0c;構建攻擊模板。模板攻…