1. 程式人生 > >Jenkins+GitLab+SonnarQube搭建CI/CD全流程

Jenkins+GitLab+SonnarQube搭建CI/CD全流程

#### 1. CI/CD ##### 1.1 CI - 持續整合 持續整合( Continuous integration , 簡稱 CI )指的是,頻繁地(一天多次)將程式碼整合到主幹。持續整合的目的就是讓產品可以快速迭代,同時還能保持高質量。它的核心措施是程式碼整合到主幹之前,必須通過自動化測試。只要有一個測試用例失敗,就不能整合。通過持續整合團隊可以快速的從一個功能到另一個功能,簡而言之,敏捷軟體開發很大一部分都要歸功於持續整合。 持續整合的組成要素 - 一個自動構建過程, 從檢出程式碼、 編譯構建、 執行測試、 結果記錄、 測試統計等都是自動完成的, 無需人工干預。 - 一個程式碼儲存庫,即需要版本控制軟體來保障程式碼的可維護性,同時作為構建過程的素材庫,一般使用SVN或Git。 - 一個持續整合伺服器, Jenkins 就是一個配置簡單和使用方便的持續整合伺服器。 ##### 1.2 CD - 持續部署 持續部署則是在持續整合的基礎上,把部署到生產環境的過程自動化。 #### 2. 整體架構說明 **單體專案 / 前後端分離專案 解決方案**(已實現) **微服務專案 解決方案**
#### 3. GitLab程式碼管理私服 ##### 3.1 理解 GitLab和GitHub一樣屬於第三方基於Git開發的作品,免費且開源(基於MIT協議),與Github類似,可以註冊使用者,任意提交你的程式碼,新增SSHKey等等。不同的是GitLab是可以部署到自己的伺服器上,資料庫等一切資訊都掌握在自己手上,適合團隊內部協作開發,你總不可能把團隊內部的智慧總放在別人的伺服器上吧?簡單來說可把GitLab看作個人版的GitHub。 ##### 3.2 安裝(CentOS7) > 這裡我使用的是Docker-compose安裝,基於twang2218/gitlab-ce-zh漢化版映象 ```shell version: '2' services: gitlab: image: 'twang2218/gitlab-ce-zh' restart: unless-stopped hostname: '192.168.0.200' environment: TZ: 'Asia/Shanghai' GITLAB_OMNIBUS_CONFIG: | external_url 'http://192.168.0.200' gitlab_rails['time_zone'] = 'Asia/Shanghai' gitlab_rails['gitlab_shell_ssh_port'] = 2222 ports: - '8089:80' - '8443:443' - '2222:22' volumes: - ./config:/etc/gitlab - ./data:/var/opt/gitlab - ./logs:/var/log/gitlab volumes: config: data: logs: ``` ##### 3.3 相關配置 ```shell # 安裝相關依賴 yum -y install policycoreutils openssh-server openssh-clients postfix # 啟動ssh服務&設定為開機啟動 systemctl enable sshd && sudo systemctl start sshd # 設定postfix開機自啟,並啟動,postfix支援gitlab發信功能 systemctl enable postfix && systemctl start postfix # 開放ssh以及http服務,然後重新載入防火牆列表 firewall-cmd --add-service=ssh --permanent firewall-cmd --add-service=http --permanent firewall-cmd --reload # 可以修改gitlab配置,配置檔案已被掛載到Linux宿主機 vim /root/docker/gitlab/config/gitlab.rb ``` ##### 3.4 頁面配置 1. 管理員賬號
2. 新增組 使用管理員 root 建立組,一個組裡面可以有多個專案分支,可以將開發新增到組裡面進行設定許可權,不同的組就是公司不同的開發專案或者服務模組,不同的組新增不同的開發即可實現對開發設定許可權的管理。 3. 建立使用者 4. 將使用者新增到組中 > Gitlab使用者在組裡面有5種不同許可權: > > Guest:可以建立issue、發表評論,不能讀寫版本庫 > > Reporter:可以克隆程式碼,不能提交,QA、PM可以賦予這個許可權 > > Developer:可以克隆程式碼、開發、提交、push,普通開發可以賦予這個許可權 > > Maintainer:可以建立專案、新增tag、保護分支、新增專案成員、編輯專案,核心開發可以賦予這個許可權 >
> Owner:可以設定專案訪問許可權 - Visibility Level、刪除專案、遷移專案、管理組成員,開發組組長可以賦予這個許可權 5. 組中建立專案 6. 原始碼上傳到Gitlab倉庫(這裡我們通過SSH的方式) - 登入GitLab私服地址:192.168.0.200:8089 - 配置SSH免密登入,以SSH方式push,pull程式碼 - 下載安裝Git客戶端 - 開啟Git Bash ```shell # 配置Git使用者使用者名稱 git config--global user.name “xxxx” # 配置GIt 使用者郵箱 git config --global user.email “xxxx” # 檢視是否存在ssh keys cd ~/.ssh # 若出現”No such file or directory”,則表示需要建立一個ssh keys ssh-keygen -t rsa -C "你的郵箱" #郵箱寫GitLab賬戶設定的郵箱 ``` - 然後開啟`~/.ssh/id_rsa.pub`檔案(~表示使用者目錄,比如我的windows就是C:\Users\Administrator),複製其中的內容 - 開啟gitlab,搜尋SSH Key,並把上一步中複製的內容貼上到Key所對應的文字框,在Title對應的文字框中給這個sshkey設定一個名字,點選Add key按鈕 - 嘗試拉取程式碼和提交程式碼,此時已不需要輸入密碼了 ```shell git clone ssh://[email protected]:2222/DianJianQiJu/jp-console.git ``` #### 4. Jenkins環境搭建 ##### 4.1 安裝環境(CentOS7) | 名稱 | 安裝包 | 版本號 | | ------- | ------------------------------ | ------- | | Jenkins | jenkins-2.190.3-1.1.noarch.rpm | 2.190.3 | | JDK | | 1.8 | | Maven | | 3.6.2 | ##### 4.2 Jenkins安裝與配置 ```shell # 把安裝包上傳到伺服器,進行安裝 rpm -ivh jenkins-2.190.3-1.1.noarch.rpm # 修改Jenkins配置 vim /etc/syscofig/jenkins JENKINS_USER="root" JENKINS_PORT="CenterSoft123" # 啟動Jenkins systemctl start jenkins ``` ##### 4.3 頁面配置 1. 第一次進入需要輸入admin賬戶密碼 ```shell cat /var/lib/jenkins/secrets/initialAdminPassword ``` 2. 選擇外掛來安裝 => 選擇無 => 安裝。 以此來跳過外掛安裝,因為Jenkins外掛需要連線預設官網下載,速度非常慢而且經過會失敗,所以我們暫時先跳過外掛安裝 3. 新增一個管理員賬戶,並進入Jenkins後臺 ```shell # Username root # Password xxx # Full name root ``` 4. JenKins URL預設即可 ##### 4.4 Jenkins外掛下載加速 1. Jenkins本身沒有提供多少功能,我們可以通過使用外掛來滿足我們的使用。例如從Gitlab拉取程式碼,使用Maven構建專案等功能需要依靠外掛完成。接下來演示如何下載外掛。 2. 修改Jenkins外掛下載地址,Jenkins國外官方外掛地址下載速度非常慢,所以可以修改為國內外掛地址。 > enkins->Manage Jenkins->Manage Plugins,點選可選外掛待其載入完成。這樣做是為了把Jenkins官方的外掛列表下載到本地,接著修改地址檔案替換為國內外掛地址。 ```shell cd /var/lib/jenkins/updates sed -i 's#http:\/\/updates.jekins-ci.org\/download#https:\/\/mirrors.tuna.tsinghua.edu.cn\/jenkins#g' default.json sed -i '#/http:\/\/www.google.com#https:\/\/www.baidu.com#g' default.json ``` > 最後,Manage Plugins點選Advanced,把Update Site改為國內外掛下載地址 > > https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json > > Submit後,在瀏覽器輸入: http://192.168.66.101:8888/restart ,重啟Jenkins。 ##### 4.5 Jenkins使用者許可權管理 我們可以利用Role-based Authorization Strategy 外掛來管理Jenkins使用者許可權 1. Role-based Authorization Strategy外掛 2. 開啟許可權全域性安全配置 > Manage Jenkins -> Configure Global Security 3. 建立角色 > Manage Jenkins -> Manage and Assign Roles -> Manage Roles > > Global roles(全域性角色):管理員等高階使用者可以建立基於全域性的角色 > > Project roles(專案角色):針對某個或者某些專案的角色 > > Node roles(節點角色):節點相關的許可權 4. 我們新增以下三個角色 - baseRole:該角色為全域性角色。這個角色需要繫結Overall下面的Read許可權,是為了給所有使用者繫結最基本的Jenkins訪問許可權。注意:如果不給後續使用者繫結這個角色會報錯誤:"使用者名稱 ismissing the Overall/Read permission" - role1:該角色為專案角色。使用正則表示式繫結"jp.*",意思是隻能操作jp開頭的專案。 - role2:該角色也為專案角色。繫結"web.*",意思是隻能操作web開頭的專案。 5. 建立使用者 > Manage Jenkins -> Manage Users -> 新建兩個使用者如xixi / haha 6. 給使用者分配角色 > Manage Jenkins -> Manage and Assign Roles -> Assign Roles > > 繫結規則如下: > > xixi使用者繫結baseRole和role1角色,haha繫結baseRole和role2角色 > > 建立專案測試許可權! ##### 4.6 Jenkins憑證管理 1. 憑據可以用來儲存需要密文保護的資料庫密碼、Gitlab密碼資訊、Docker私有倉庫密碼等,以便Jenkins可以和這些第三方的應用進行互動。 2. 安裝`Credentials Binding`外掛,要在Jenkins使用憑證管理功能,安裝後Manage Jenkins出現如下選單 3. 五種憑據型別 ```shell # Username with password:使用者名稱和密碼 # SSH Username with private key: 使用SSH使用者和金鑰 # Secret file:需要保密的文字檔案,使用時Jenkins會將檔案複製到一個臨時目錄中,再將檔案路徑設定到一個變數中,等構建結束後,所複製的Secret file就會被刪除。 # Secret text:需要儲存的一個加密的文字串,如釘釘機器人或Github的api token # Certificate:通過上傳證書檔案的方式 ``` 4. Jenkins管理Gitlab憑證 - 使用者密碼型別 - 安裝Git外掛。為了讓Jenkins支援從Gitlab拉取原始碼,需要安裝Git外掛 - 安裝Git工具,為了讓Jenkins支援從Gitlab拉取原始碼,需要在CentOS7上安裝Git工具 ```shell # 安裝 yum install git -y # 安裝後檢視版本 git --version ``` - 建立使用者密碼型別憑證 > Manage Jenkins -> Manage Credentials -> 新增憑據 - 測試憑證是否可用 > 建立一個自由風格的專案,找到"原始碼管理"->"Git",在Repository URL複製Gitlab中的專案URL。 > 檢視**/var/lib/jenkins/workspace/**目錄,發現已經從Gitlab成功拉取了程式碼到Jenkins中。 5. Jenkins管理Gitlab憑證 - SSH型別 ```shell # 在Jenkins所在CentOS系統使用root使用者生成公鑰與私鑰 ssh-keygen -t rsa # 在/root/.ssh/目錄儲存了公鑰和私鑰 ``` - 把生成的公鑰放在Gitlab中。 > 以root賬戶登入->點選頭像->Settings->SSH Keys。複製剛才id_rsa.pub檔案的內容到這裡,點選"Add Key" - 在Jenkins中新增憑證,配置私鑰 > 在Jenkins新增一個新的憑證,型別為"SSH Username with private key",把剛才生成私有檔案內容複製過來 ##### 4.7 Maven安裝和配置 > 在Jenkins整合伺服器上,我們需要安裝Maven來編譯和打包專案。 1. 安裝Maven 2. 配置環境變數 ```shell vim /etc/profile export MAVEN_HOME=/home/apache-maven-3.5.4 export PATH=${PATH}:${MAVEN_HOME}/bin export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk export JRE_HOME=$JAVA_HOME/jre export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin # 使環境變數生效 source /etc/profile #檢視Maven版本 mvn -v ``` 2. 全域性工具配置關聯JDK和Maven > Jenkins -> Global Tool Confifiguration -> JDK->新增JDK > Jenkins->Global Tool Confifiguration->Maven->新增Maven 3. 新增Jenkins全域性變數 > Manage Jenkins->Confifigure System->Global Properties ,新增三個全域性變數 4. 修改Maven的settings.xml ```shell # 建立本地倉庫目錄 mkdir /root/repo # 修改本地倉庫路徑 vim /opt/maven/conf/settings.xml /root/maven_repository # 新增阿里雲私服地址 alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central ``` 5. 測試Maven是否配置成功 - 使用之前的測試專案,修改配置 - 構建 -> 增加構建步驟 -> Execute Shell - 再次構建,如果可以把專案打成war包,代表maven環境配置成功! ##### 4.8 Tomcat安裝與配置 > 這裡使用的是window伺服器。配置與Linux伺服器並無差異 1. 安裝Tomcat8.5 2. 配置Tomcat使用者角色許可權 > 預設情況下Tomcat是沒有配置使用者角色許可權的。但是,後續Jenkins部署專案到Tomcat伺服器,需要用到Tomcat的使用者,所以修改tomcat以下配置,新增使用者及許可權。 ```xml ``` ```xml ``` 3. 重啟Tomcat,訪問測試 4. Tomcat調優,調整Jvm記憶體大小(解決後端專案無端部署失敗的bug) > 由於公司專案體積較大,我多次使用Jenkins自動部署專案都失敗了,但是程式碼並無明顯錯誤。後來發現是tomcat的jvm設定太小容易記憶體溢位,可以適當調整jvm記憶體大下,重啟下即可。 - 使用剛才建立的角色進入manager應用,點選Server Status檢視JVM狀態 - 修改JVM記憶體大小 > 修改方式:開啟Tomcat的bin/catalina.bat檔案進行修改 > > 注意:記憶體不宜設定太大,根據伺服器記憶體大小適當配置 增大堆記憶體 增大非堆記憶體 #### 5. Jenkins各種型別專案構建 ##### 5.1 自動構建專案型別 Jenkins中自動構建專案的型別有很多,常用的有以下三種: - 自由風格軟體專案(FreeStyle Project) - Maven專案(Maven Project) - 流水線專案(Pipeline Project) 每種型別的構建其實都可以完成一樣的構建過程與結果,只是在操作方式、靈活度等方面有所區別,在實際開發中可以根據自己的需求和習慣來選擇。(PS:個人推薦使用流水線型別,因為靈活度非常高) ##### 5.2 自由風格專案搭建 > 演示整合過程:拉取程式碼 -> 編譯 -> 打包 -> 部署 1. 建立自由風格專案web_test2 2. 配置原始碼管理,從GitLab拉取程式碼 3. 編譯打包 4. 部署 > 把專案部署到遠端的Tomcat裡面 - 安裝 `Deploy to container`外掛。Jenkins本身無法實現遠端部署到Tomcat的功能,需要安裝Deploy to container外掛實現 - 新增Tomcat使用者憑證 - 新增構建後操作 - 點選Build Now,開始構建過程 - 之後改動程式碼再push到GitLab,在Jenkins中對專案進行重新構建部署即可 ##### 5.3 Maven專案搭建 1. 安裝Maven Integration外掛 2. 建立Maven專案web_test2_maven 3. 配置專案 > 拉取程式碼和遠端部署的過程和自由風格專案一樣,只是"構建"部分不同 ##### 5.4 流水線專案搭建 1. Pipeline簡介 Pipeline,簡單來說就是一套執行在 Jenkins 上的工作流框架,將原來獨立運行於單個或者多個節點的任務連線起來,實現單個任務難以完成的複雜流程編排和視覺化的工作。 使用Pipeline有以下好處: - 程式碼:Pipeline以程式碼的形式實現,通常被檢入原始碼控制,使團隊能夠編輯,審查和迭代其傳送流程。 - 持久:無論是計劃內的還是計劃外的伺服器重啟,Pipeline都是可恢復的。 - 可停止:Pipeline可接收互動式輸入,以確定是否繼續執行Pipeline。 - 多功能:Pipeline支援現實世界中複雜的持續交付要求。它支援fork/join、迴圈執行,並行執行任務的功能。 - 可擴充套件:Pipeline外掛支援其DSL的自定義擴充套件 ,以及與其他外掛整合的多個選項。 如何建立 Jenkins Pipeline? - Pipeline 指令碼是由 **Groovy** 語言實現的,但是我們沒必要單獨去學習 Groovy - Pipeline 支援兩種語法:**Declarative**(宣告式)和 **Scripted Pipeline**(指令碼式)語法 - Pipeline 也有兩種建立方法:可以直接在 Jenkins 的 Web UI 介面中輸入指令碼;也可以通過建立一個 Jenkinsfifile 指令碼檔案放入專案原始碼庫中(一般都推薦在 Jenkins 中直接從原始碼控制(SCM)中直接載入 Jenkinsfifile Pipeline 這種方法) 2. 安裝Pipeline外掛 3. 安裝外掛後,建立專案的時候多了“流水線”型別 4. Pipeline語法快速入門 - Declarative宣告式-Pipeline > 流水線->選擇HelloWorld模板 > 生成內容如下 > > stages:代表整個流水線的所有執行階段。通常stages只有1個,裡面包含多個stage > > stage:代表流水線中的某個階段,可能出現n個。一般分為拉取程式碼,編譯構建,部署等階段。 > > steps:代表一個階段內需要執行的邏輯。steps裡面是shell指令碼,git拉取程式碼,ssh遠端釋出等任意內容。 ```shell pipeline { agent any stages { stage('Hello') { steps { echo 'Hello World' } } } } ``` > 編寫一個簡單宣告式的Pipeline ```shell pipeline { agent any stages { stage('拉取程式碼') { steps { echo '拉取程式碼' } } stage('編譯構建') { steps { echo '編譯構建' } } stage('專案部署') { steps { echo '專案部署' } } } } ``` > 點選構建,可以看到整個構建過程 - Scripted Pipeline指令碼式-Pipeline > 流水線->選擇Scripted Pipeline > 生成內容如下 > > Node:節點,一個 Node 就是一個 Jenkins 節點,Master 或者 Agent,是執行 Step 的具體執行環境,後續講到Jenkins的Master-Slave架構的時候用到。 > > Stage:階段,一個 Pipeline 可以劃分為若干個 Stage,每個 Stage 代表一組操作,比如:Build、Test、Deploy,Stage 是一個邏輯分組的概念。 > > Step:步驟,Step 是最基本的操作單元,可以是列印一句話,也可以是構建一個 Docker 映象,由各類 Jenkins 外掛提供,比如命令:sh ‘make’,就相當於我們平時 shell 終端中執行 make 命令 > > 一樣 ```shell node { def mvnHome stage('Preparation') { } stage('Build') { } stage('Results') { } } ``` - 我們可以通過左下側流水線語法快速生成pipeline程式碼 > 以拉取程式碼為例,選擇片段生成器模板 ```shell pipeline { agent any stages { stage('拉取程式碼') { steps { checkout([$class: 'GitSCM', branches: [[name: '*/master']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '0c93f73d-1e42-4d39-a8ab-f07d5dda668f', url: 'ssh://[email protected]:2222/DianJianQiJu/web_test2.git']]]) } } stage('編譯打包') { steps { sh label: '', script: 'mvn clean package' } } stage('專案部署') { steps { deploy adapters: [tomcat8(credentialsId: '22b62c37-4009-4ac3-b82b-fbf926a0cc63', path: '', url: 'http://8.136.103.128:8085')], contextPath: null, war: 'target/*.war' } } } } ``` - Pipeline Script from SCM > 剛才我們都是直接在Jenkins的UI介面編寫Pipeline程式碼,這樣不方便指令碼維護,建議把Pipeline指令碼放在專案中(一起進行版本控制),在專案根目錄建立Jenkinsfifile檔案,把指令碼內容複製到該檔案中即可 #### 6. Jenkins構建觸發器 ##### 6.1 Jenkins內建4種構建觸發器 - 觸發遠端構建 - 其他工程構建後觸發(Build after other projects are build) - 定時構建(Build periodically) - 輪詢SCM(Poll SCM) ##### 6.2 觸發遠端構建演示 觸發構建url:http://192.168.0.200:8888/job/web_test2/build?token=123456 ##### 6.3 其他工程構建後觸發 ##### 6.4 定時構建 - 定時字串從左往右分別為: 分 時 日 月 周 - 一些定時表示式的例子: > 每30分鐘構建一次:H代表形參 H/30 * * * * 10:02 10:32 > > 每2個小時構建一次: H H/2 * * * > > 每天的8點, 12點, 22點,一天構建3次: (多個時間點中間用逗號隔開) 0 8,12,22 * * * > > 每天中午12點定時構建一次 H 12 * * * > > 每天下午18點定時構建一次 H 18 * * * > > 在每個小時的前半個小時內的每10分鐘 H(0-29)/10 * * * * > > 每兩小時一次,每個工作日上午9點到下午5點(也許是上午10:38,下午12:38,下午2:38,下午4:38) H H(9-16)/2 * * 1-5 ##### 6.5 輪詢SCM 輪詢SCM,是指定時掃描原生代碼倉庫的程式碼是否有變更,如果程式碼有變更就觸發專案構建。 注意:這次構建觸發器,Jenkins會定時掃描本地整個專案的程式碼,增大系統的開銷,不建議使用。 ##### 6.6 Git hook自動觸發構建外掛 1. 剛才我們看到在Jenkins的內建構建觸發器中,輪詢SCM可以實現Gitlab程式碼更新,專案自動構建,但是該方案的效能不佳。那有沒有更好的方案呢? 有的。就是利用Gitlab的webhook實現程式碼push到倉庫,立即觸發專案自動構建。 2. 安裝GitLab Hook外掛:Gitlab Hook 與 GitLab兩個外掛 3. Jenkins設定自動構建 4. GitLab配置webhook - 開啟webhook功能 > 使用root賬戶登入到後臺,點選Admin Area -> Settings > > 勾選"允許鉤子和服務訪問本地網路" - 在專案中新增webhook - 注意:以下設定必須完成,否則會報錯! #### 7. Jenkins引數化構建 ##### 7.1 理解 有時在專案構建的過程中,我們需要根據使用者的輸入動態傳入一些引數,從而影響整個構建結果,這時我們可以使用引數化構建。 Jenkins支援非常豐富的引數型別。 ##### 7.2 演示通過分支名稱來部署不同分支專案 > 流水線專案作為演示 1. 專案建立分支,並推送到Gitlab上 2. 在Jenkins專案配置中新增字串型別引數 3. 修改pipeline流水線拉取步驟的程式碼 4. 點選Build with Parameters > 輸入分支名稱構建即可!構建完成後訪問Tomcat檢視結果 #### 8. Jenkins配置郵箱伺服器傳送構建結果 ##### 8.1 安裝Email Extension Plugin外掛 ##### 8.2 Jenkins設定郵箱相關引數 > Manage Jenkins -> Confifigure System 1. 設定管理員郵箱 2. 設定郵件引數 3. 設定Jenkins預設郵箱資訊 4. 準備郵件內容(模板) > 在專案根目錄編寫email.html,並把檔案推送到Gitlab,內容如下: ```html ${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日誌
(本郵件是Jenkins程式自動下發的,請勿回覆!)

構建結果 - ${BUILD_STATUS}


構建資訊:
  • 專案名稱:${PROJECT_NAME}
  • 構建編號:第${BUILD_NUMBER}次構建
  • 觸發原因:${CAUSE}
  • 構建日誌:${BUILD_URL}console
  • 構建地址:${BUILD_URL}
  • 工作目錄:${PROJECT_URL}ws
  • 專案地址:${PROJECT_URL}
  • 變更集:${JELLY_SCRIPT,template="html"}
Changes Since Last Successful Build:
  • 歷史變更記錄 : ${PROJECT_URL}changes
${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:
%c
",showPaths=true,changesFormat="
[%a]
%m
",pathFormat="%p"}
Failed Test Results:
${FAILED_TESTS}

構建日誌 (最後 100行):
Test Logs (if test has ran): ${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip

``` 5. 編寫指令碼新增構建後傳送郵件 > 流水線語法介面選擇post模板 > 流水線語法介面選擇郵件模板 ```shell pipeline { agent any stages { stage('拉取程式碼') { steps { checkout([$class: 'GitSCM', branches: [[name: '*/${branch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: '0c93f73d-1e42-4d39-a8ab-f07d5dda668f', url: 'ssh://[email protected]:2222/DianJianQiJu/web_test2.git']]]) } } stage('編譯打包') { steps { sh label: '', script: 'mvn clean package' } } stage('專案部署') { steps { deploy adapters: [tomcat8(credentialsId: '22b62c37-4009-4ac3-b82b-fbf926a0cc63', path: '', url: 'http://8.136.103.128:8085')], contextPath: null, war: 'target/*.war' } } } post { always { emailext( subject: '構建通知:${PROJECT_NAME} - Build # ${BUILD_NUMBER} - ${BUILD_STATUS}!', body: '${FILE,path="email.html"}', to: '[email protected]' ) } } } ``` 6. 郵件結果展示 7. 郵件相關全域性引數參考列表: > Configure System -> Extended E-mail Notifification -> Content Token Reference,點選旁邊的?號即可參考 #### 9. SonarQube程式碼審查工具 SonarQube是一個用於管理程式碼質量的開放平臺,可以快速的定位程式碼中潛在的或者明顯的錯誤。目前支援java,C#,C/C++,Python,PL/SQL,Cobol,JavaScrip,Groovy等二十幾種程式語言的程式碼質量管理與檢測。 底層使用Elasticsearch作為程式碼檢索工具。 ##### 9.1 Jenkins整合SonarQube圖示 ##### 9.2 安裝環境(CentOS7) | 軟體 | 伺服器 | 版本 | | ------------------- | ------------- | ------------------- | | MySQL | 192.168.0.204 | 5.7(8+版本會報錯) | | SonarQube | 192.168.0.200 | 6.7.4 | | SonarQube漢化jar包 | 192.168.0.200 | 1.19 | | Sonar-Scanner客戶端 | 192.168.0.200 | 4.2.0 | ##### 9.3 安裝步驟 1. 在MySQL資料庫中建立sonar資料庫 2. 安裝SonarQube並設定許可權 ```shell yum install unzip unzip sonarqube-6.7.4.zip #解壓 mkdir /opt/sonar #建立目錄 mv sonarqube-6.7.4/* /opt/sonar #移動檔案 user add sonar #建立sonar使用者,必須sonar用於啟動,否則報錯 chown -R sonar. /opt/sonar #更改sonar目錄及檔案許可權 ``` 3. 修改SonarQube配置檔案 ```shell vim /opt/sonar/conf/sonar.properties #內容如下: sonar.jdbc.username=root sonar.jdbc.password=xxxx sonar.jdbc.url=jdbc:mysql://192.168.0.204:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false ``` > 注意:SonarQube預設監聽9000埠,如果9000埠被佔用需要更改。 4. 啟動sonar ```shell cd /opt/sonar su sonar ./bin/linux-x86-64/sonar.sh start #啟動 su sonar ./bin/linux-x86-64/sonar.sh status #檢視狀態 su sonar ./bin/linux-x86-64/sonar.sh stop #停止 tail -f logs/sonar.log #檢視日誌 ``` 5. 訪問sonar http://192.168.0.200:9000 預設賬戶:admin/admin 6. 建立token,用於jenkins對sonarqube的憑證管理 ```shell #這裡的憑證我已生成 - SonarQube token root: f0e71f7e7f194dfe4912d20ed5fa0d481b20e7cf ``` 7. 漢化SonarQube 將漢化jar包放入SonarQube安裝目錄extensions/plugins下,重啟SonarQube) 8. 關閉將審查結果上傳到SCM的功能 9. Jenkins安裝SonarQube外掛 10. Jenkins新增SonarQube憑證 11. Jenkins安裝SonarQube Scanner客戶端 > Manage Jenkins->Global Tool Confifiguration 12. Jenkins進行SonarQube配置 > Manage Jenkins -> Confifigure System -> SonarQube servers ##### 9.4 Jenkins專案程式碼審查 1. 非流水線專案新增構建步驟 2. 流水線專案新增構建步驟 ```shell stage('SonarQube程式碼審查') { steps{ script { # 引入SonarQubeScanner工具 scannerHome = tool 'sonarqube-scanner' } # 引入SonarQube的伺服器環境 withSonarQubeEnv('sonarqube6.7.4') { sh "${scannerHome}/bin/sonar-scanner" } } } ``` 3. 配置檔案模板 ```shell # 專案的唯一標記(這裡我直接寫專案名) sonar.projectKey=jp-console # 專案名字 sonar.projectName=jp-console # 專案版本號 sonar.projectVersion=1.0 # 指定掃描程式碼的路徑,.表示在當前專案的根目錄下掃描所有 #sonar.sources=. sonar.sources=stidem/src/main # 掃描指定目錄 # 巨坑!新版sonar外掛需指定sonar.java.binaries sonar.java.binaries=**/target/classes # 排除不需要掃描的 sonar.exclusions=**/test/**,**/target/** # Jdk版本 sonar.java.source=1.8 sonar.java.target=1.8 # 原始碼編碼格式 sonar.sourceEncoding=UTF-8 ``` 3. 常見Bug 4. 程式碼審查結果 #### 10 Jenkins部署Vue專案靜態資源到Nginx ##### 10.1 圖示 ##### 10.2 安裝與配置Nginx伺服器 1. 安裝Nginx伺服器 2. 以Jeeplus Vue專案為例修改nginx.conf配置檔案 ```shell worker_processes 1; events { worker_connections 1024; } http { include mime.types; default_type application/octet-stream; #access_log logs/access.log main; sendfile on; keepalive_timeout 65; gzip on; gzip_min_length 1k; gzip_comp_level 9; gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png; gzip_vary on; gzip_disable "MSIE [1-6]\."; proxy_connect_timeout 600; proxy_read_timeout 600; proxy_send_timeout 600; server { listen 80; server_name 生產伺服器域名或ip; location ^~ /jeeplus-customer { proxy_pass http://127.0.0.1:8085/jeeplus; proxy_set_header Host 127.0.0.1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ^~ /userfiles { proxy_pass http://127.0.0.1:8085/jeeplus/userfiles; proxy_set_header Host 127.0.0.1; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location / { root html/jp-ui/dist; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } } ``` 3. Windows下Nginx相關命令 ```shell cmd 進入Nginx解壓目錄 執行以下命令 # 啟動nginx服務 start nginx # 修改配置後重新載入生效 nginx -s reload # 快速停止或關閉Nginx nginx -s stop # 正常停止或關閉Nginx nginx -s quit # 重新開啟日誌檔案 nginx -s reopen # 測試nginx配置檔案是否正確 nginx -t -c /path/to/nginx.conf # 驗證配置是否正確: nginx -t # 檢視Nginx的版本號 nginx -V ``` ##### 10.3 Jenkins安裝NodeJS外掛 ##### 10.4 Jenkins配置Nginx伺服器 1. 安裝Node.js環境 > Manage Jenkins -> Global Tool Configuration 2. Jenkins安裝SSH外掛 3. Jenkins配置SSH遠端伺服器 > Manage Jenkins ->Configure System 4. 建立前端自由風格專案jp-ui並配置 > 其他步驟與之前的專案配置一致,下面只列出不一樣的 5. Window生產伺服器安裝SSH工具 - 在拿不到Linux root賬戶的情況下winscp等工具是無法實現檔案傳輸的,此時我們可以借用Bitvise SSH; - 下載地址:https://www.bitvise.com/ssh-server-download [Bitvise SSH Server installer](https://bvdl.s3-eu-west-1.amazonaws.com/BvSshServer-Inst.exe) - version 7.32, size 14.0 MB。我們需要server版軟體該工具可以實現雙向傳輸,即linux到Windows和 Linux 獲取Windows端檔案。 - 下載後雙擊安裝 -> 勾選個人版本 -> 輸入個人資訊,此處的資訊不作為scp賬戶。下面會講到scp賬戶 - 進入後點擊“open easy setting” - server setting,勾選開放防火牆,當然為了安全你可以自己設定僅限區域網 - virtual account 設定,這裡就是scp賬戶資訊,很重要。點選新增 - 設定賬戶資訊 - 點選virtual account password,設定賬戶密碼 - 點選save changes回到server介面。點選start server,即可啟動ssh服務。如有防毒軟體攔截請全部攔截 - 下面我們測試一下,注意window目錄寫法 - 從Linux獲取Windows檔案 - 從Linux傳送檔案到Windows目錄 6. Jenkins點選構建開始執行,檢視是否成功。並訪問Nginx進行測試 #### 11. Jenkins + Docker + SpringCloud微服務持續整合 ##### 未完待續... #### 12. 基於Kubernetes/K8S容器編排工具構建Jenkins持續整合 ##### 未完待續...