整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          Jenkins操作手冊 - 巨詳細,一篇足矣

          、持續集成相關概念

          1.1、什么是持續集成?

          隨著軟件開發復雜度的不斷提高,團隊開發成員間如何更好的協同工作以確保軟件開發的質量已經成為開發過程中不可回避的問題。尤其是近年來敏捷開發在軟件領域越來越火,如何能在不間斷變化的需求中快速適應和保證軟件的質量顯得尤其重要。持續集成正是針對這一問題的一種軟件開發實踐。它倡導團隊開發成員必須經常集成他們的工作,甚至每天都可能發生多次集成。而每次集成都是通過自動化的構建來驗證,包括自動編譯、發布和測試,從而盡快地發現集成錯誤,讓團隊能更快的開發內聚的軟件。

          1.2、持續集成的原則

          • 需要版本控制工具來保障團隊成員提交的代碼不會導致集成失敗。常用的版本控制工具有cvs、subversion、git、sourcesafe等;
          • 開發人員需要及時向版本控制庫中提交代碼,也需要經常性地從版本控制庫中更新代碼到本地;
          • 需要有專門的集成服務器來執行集成構建。根據項目的實際情況,集成構建可以通過代碼倉庫中代碼的變動(如push事件、merge事件等)來自動觸發構建,也可以定時啟動構建,如每半小時構建一次;
          • 必須保證構建的成功。如果構建失敗,則修復構建過程中的錯誤將是優先級最高的工作。一旦修復,需手動啟動一次構建。
          • 一個自動構建過程,包括自動編譯、分發、部署和測試等;
          • 一個代碼倉庫,即需要版本控制工具來保障代碼的可維護性,同時作為構建過程的素材庫;
          • 一個持續集成服務器。即將介紹的Jenkins就是一個配置簡單和使用方便的持續集成服務器。

          1.3、持續集成系統的組成

          二、Jenkins簡介和插件

          2.1、Jenkins簡介

          Jenkins是一個開源項目,提供了一種易于使用的持續集成系統,使開發者從繁雜的集成中解脫出來,專注于更重要的業務邏輯實現上。同時Jenkins能實時監控集成中存在的錯誤,提供詳細的日志文件和提醒功能,還能用圖表的形式形象的展示項目構建的趨勢和穩定性。

          2.2、插件介紹

          Jenkins提供了大量的插件,這些插件使Jenkins能實現很多復雜的功能。下面列出了部分持續集成所需的插件:

          • Email Extension Plugin,郵件通知插件。例如,構建失敗或成功后可以發送相關信息到指定的郵箱;
          • Publish Over SSH ,用于遠程服務器發布,將編譯生成的jar、war等文件推送到遠程服務器中指定的目錄;
          • Maven Integration plugin ,Maven集成插件,缺少此插件則新建任務時沒有Maven Project選項;
          • GitLab,用于從指定的代碼倉庫中拉取需要構建的代碼;
          • Sonar scanner,用于構建前或構建后對代碼進行掃描;
          • Git parameter,基于Git的參數化構建;
          • HTML Publisher plugin,用于在Jenkins中配置HTML格式的報告;
          • Groovy Label Assignment plugin,用于執行Groovy代碼;
          • NodeJS plugin,配置JavaScript的運行環境,作為前端代碼的打包工具或構建工具;

          2.3、插件安裝

          安裝插件的步驟:在面板界面左側的導航欄中選擇Manager Jenkins ---> System Configuration ---> Manager Plugins,在插件管理頁面中點擊“可選插件”選項卡,然后在輸入框中填寫需要安裝的插件名字。

          三、全局工具配置

          全局工具配置主要對一些常用工具的名稱、版本、路徑和配置文件進行設定。在面板左側的導航欄中點擊“系統管理”,進入到“管理Jenkins”界面,選擇界面中的System Configuration ---> Global Tool Configuration后進入到“全局工具配置”界面,依次對Maven配置、JDK、Git、Maven、NodeJS、Sonar Scanner等進行配置。

          3.1、Maven配置

          主要用于Maven的主配置文件settings.xml的設定。settings.xml包含倉庫鏡像、本地鏡像和認證信息等。一般默認的路徑有兩種:Global Maven Settings --- ${M2_HOME}/conf/settings.xml;User Maven Settings --- ${user.HOME}/.m2/settings.xml。如果兩個文件都存在,會對內容進行合并,優先應用當前目錄下settings.xml中的設定。

          3.2、JDK

          如果已經安裝過JDK,這里需要配置JDK的JAVA_HOME。

          3.3、Git

          Git的配置也很重要,因為大多數的任務都要獲取Git倉庫中的代碼,所以這里需要配置Git的執行路徑。

          3.4、Maven

          主要用于配置Maven的主目錄,可以添加多個,用Name來區分。如果系統中已經安裝Maven,這里直接填寫MAVEN_HOME對應的路徑,Jenkins會在Master節點上進行檢查,查看該目錄是否有效。

          3.5、SonarQube Scanner

          SonarQube Scanner用于代碼的靜態質量掃描,可以自動安裝,也可以手動將其安裝在Master服務器上。這里采用的是自動安裝,在“版本”下拉選框中選擇所要安裝的版本號即可。

          3.6、NodeJS

          NodeJS是一個JavaScript的運行環境,作為打包工具或者構建工具。如果要在Jenkins中實現編譯、打包前端代碼,則需要安裝此軟件。

          四、系統配置

          在Jenkins主面板左側的導航欄中選擇“系統管理”,進入到“管理Jenkins”界面,點擊此界面中“系統配置”模塊下的“系統配置”選項,進入到“配置”界面。

          4.1、Jenkins Location

          此項是可選的,指定安裝Jenkins的HTTP地址。這個值用來在郵件中生產Jenkins鏈接。此項是有必要的,因為Jenkins無法探測到自己的URL地址。

          4.2、SonarQube servers

          配置SonarQube所在服務器的信息,建立Jenkins和SonarQube之間的通信。

          Name:自定義一個適合的名字;

          Server URL:SonarQube所在服務器的URL(IP或域名加端口,端口號默認為9000);

          Server authentication token:這里填寫SonarQube服務器當前用戶的令牌。

          SonarQube令牌的生成方法:登陸SonarQube服務器,選擇“頭像”--->“我的賬號”--->“安全”--->在“生成令牌”文本框中輸入自定義的名稱,然后點擊“生成”按鈕。生成的令牌ID只會顯示一次,所以如果有需要,可以進行備份

          生成SonarQube當前用戶的令牌ID后,回到Jenkins的系統配置界面,并定位到“SonarQube servers”模塊,點擊“Server authentication token”選項的“添加”按鈕,選擇“Jenkins”,進入到“添加憑據”窗口。

          類型:選擇Secret text;

          Secret:填入SonarQube當前用戶生成的令牌ID;

          ID:自定義一個名稱。

          填寫完畢后,點擊“添加”按鈕,然后在“Server authentication token”的下拉選框中選擇相應的憑據即可。

          4.3、GitLab

          配置將要構建的代碼所在的GitLab服務器信息,建立Jenkins和GitLab服務器之間的通信。

          Connection name:自定義一個名稱;

          Gitlab host URL:GItLab所在服務器的HTTP地址;

          Credentials:添加GitLab API token,該token由GItLab生成。

          GitLab API token的生成方法:進入GitLab主頁,點擊頁面右上角的頭像,在出現的懸框中點擊“Settings”,進入到設置界面。在設置界面左側的導航欄中點擊“Access Token”,進入“Access Token”界面。

          Name:自定義一個名稱;

          Expires at:添加生成token的時間(非必填項);

          Scopes:勾選api復選框;

          Create personal access token:點擊此按鈕后會生成一個token,且生成的token會展示在“Active Personal Access Tokens”列表中。

          生成GitLab API token后,回到Jenkins的系統配置界面,并定位到GitLab模塊。點擊Credentials的“添加”按鈕,選擇“jenkins”,進入到“添加憑據”窗口。

          類型:選擇GitLab API token;

          API token:填入在GitLab中生成的API token;

          ID:自定義一個名稱(非必填項)。

          所需的信息配置完畢后,點擊“Test Connection”按鈕,測試Jenkins和GitLab之間的連接是否成功。

          4.4、Publish over SSH

          若要將構建后生成的jar包(后端)或dist目錄文件(前端)推送到遠程服務器中,需配置此模塊。在此我們選擇用戶名和密碼來連接遠程服務器。

          Name:自定義一個名稱。在Job中使用Publish over SSH插件時,此名稱將出現在“SSH Server”中“Name”選項的下拉列表中;

          Hostname:服務器的主機名或IP地址;

          Username:服務器的用戶名;

          Remote Directory:遠程服務器上真實存在的目錄,而且“Username”指定的用戶要有訪問此文件夾的權限,插件將把文件推送到此目錄下;

          Use password authentication, or use a different key:勾選此選項,并在“Passphrase / Password”中輸入與Username匹配的密碼。

          配置完后點擊“Test Configuration”,測試是否可以連接成功。

          4.5、Extended E-mail Notification

          在Jenkins的使用中郵件提醒是一個常用功能,Jenkins默認安裝了 Mailer Plugin插件用于實現此功能,但 Mailer Plugin功能簡單不能滿足一些復雜需求,如:自定義郵件標題、內容等。Extended E-mail Notification(ext mail)是一個功能更為齊全,使用也更為復雜的插件。下面對此插件的配置做簡要的說明。

          SMTP Server:SMTP服務器的地址;

          SMPT Port:SMTP的端口號,默認為25;

          SMTP Username:即在Jenkins Location模塊中填寫的“系統管理員郵件地址”;

          SMTP Password:“系統管理員郵件地址”所對應的密碼;

          Default user E-mail suffix:默認的郵箱后綴;

          Default Content Type:默認的郵件內容格式;

          Default Recipients:默認收件人的郵箱地址(可填寫多個,中間用英文逗號隔開即可);

          Default Subject:郵件標題。例如,$PROJECT_NAME - Build # $BUILD_NUMBER - $BUILD_STATUS!。其中,$PROJECT_NAME為構建項目名稱,$BUILD_NUMBER為構建編號,$BUILD_STATUS為構建狀態;

          Default Content:郵件內容;

           1 <!DOCTYPE html>  
           2 <html>  
           3 <head>  
           4 <meta charset="UTF-8">  
           5 <title>${ENV, var="JOB_NAME"}-第${BUILD_NUMBER}次構建日志</title>  
           6 </head>  
           7    
           8 <body leftmargin="8" marginwidth="0" topmargin="8" marginheight="4"  
           9     offset="0">  
          10     <table width="95%" cellpadding="0" cellspacing="0"  
          11         style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">  
          12         <tr>  
          13             <td>(本郵件由Jenkins系統自動發布,請勿回復!)</td>  
          14         </tr>  
          15         <tr>  
          16             <td><h2>  
          17                     <font color="#0000FF">構建結果 - ${BUILD_STATUS}</font>  
          18                 </h2></td>  
          19         </tr>  
          20         <tr>  
          21             <td><br />  
          22             <b><font color="#0B610B">構建信息</font></b>  
          23             <hr size="2" width="100%" align="center" /></td>  
          24         </tr>  
          25         <tr>  
          26             <td>  
          27                 <ul>  
          28                     <li>項目名稱: ${PROJECT_NAME}</li>  
          29                     <li>構建編號: 第${BUILD_NUMBER}次構建</li>  
          30                     <li>構建狀態: ${BUILD_STATUS}</li>  
          31                     <li>觸發原因: ${CAUSE}</li>  
          32                     <li>構建日志: <a href="${BUILD_URL}console">${BUILD_URL}console</a></li>  
          33                     <li>構建  Url : <a href="${BUILD_URL}">${BUILD_URL}</a></li>  
          34                     <li>工作目錄 : <a href="${PROJECT_URL}ws">${PROJECT_URL}ws</a></li>  
          35                     <li>項目  Url : <a href="${PROJECT_URL}">${PROJECT_URL}</a></li>  
          36                 </ul>  
          37             </td>  
          38         </tr>  
          39         <tr>  
          40             <td><b><font color="#0B610B">Changes Since Last  
          41                         Successful Build:</font></b>  
          42             <hr size="2" width="100%" align="center" /></td>  
          43         </tr>  
          44         <tr>  
          45             <td>  
          46                 <ul>  
          47                     <li>歷史變更記錄 : <a href="${PROJECT_URL}changes">${PROJECT_URL}changes</a></li>  
          48                 </ul> ${CHANGES_SINCE_LAST_SUCCESS,reverse=true, format="Changes for Build #%n:<br />%c<br />",showPaths=true,changesFormat="<pre>[%a]<br />%m</pre>",pathFormat="    %p"}  
          49             </td>  
          50         </tr>  
          51         <tr>  
          52             <td><b>Failed Test Results</b>  
          53             <hr size="2" width="100%" align="center" /></td>  
          54         </tr>  
          55         <tr>  
          56             <td><pre style="font-size: 11pt; font-family: Tahoma, Arial, Helvetica, sans-serif">$FAILED_TESTS</pre>  
          57                 <br /></td>  
          58         </tr>  
          59         <tr>  
          60             <td><b><font color="#0B610B">構建日志 (最后 100行):</font></b>  
          61             <hr size="2" width="100%" align="center" /></td>  
          62         </tr>  
          63         <!-- <tr>  
          64             <td>Test Logs (if test has ran): <a  
          65                 href="${PROJECT_URL}ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip">${PROJECT_URL}/ws/TestResult/archive_logs/Log-Build-${BUILD_NUMBER}.zip</a>  
          66                 <br />  
          67             <br />  
          68             </td>  
          69         </tr> -->  
          70         <tr>  
          71             <td><textarea cols="80" rows="30" readonly="readonly"  
          72                     style="font-family:Courier New">${BUILD_LOG, maxLines=100}  

          五、創建Maven項目

          5.1、新建任務

          首先進入Jenkins主界面,在面板左側的導航欄中點擊“新建任務”,進入“新建任務”界面。

          進入“新建任務”界面后,在“任務名稱”文本框中輸入一個合法的名稱(該名稱最好能簡短、清晰地描述所要構建的項目,且不能與已有的任務名稱重合),然后選擇“構建一個Maven項目”,點擊左下角的“確定”按鈕,進入任務配置界面。

          5.2、General

          在“General”選項卡下勾選“丟棄舊的構建”,填寫需要保留的構建天數和構建的最大個數。若不及時清理舊的構建,則會消耗服務器的磁盤空間。

          5.3、源碼管理

          在“源碼管理”模塊中選擇Git。無論是GitHub還是私有的GitLab,一般都支持兩種模式:SSH模式和HTTP模式。

          5.3.1 HTTP模式

          Repository URL:要構建的項目在GitLab中的HTTP地址。首先進入到所要構建的項目在GitLab中的主界面,在項目的URL下拉選框中選擇“HTTP”,并點擊右側的“復制”按鈕,將復制的HTTP地址粘貼到“Repository URL”文本框中即可。

          Credentials:點擊右側的“添加”按鈕,選擇“Jenkins”選項后會彈出一個“添加憑據”彈窗。

          添加憑據時,類型選擇“Username with password”,然后在“用戶名”文本框中輸入GitLab的登陸賬戶,“密碼”文本框中輸入與賬戶相匹配的密碼,“ID”文本框中填入自定義的名稱,但不能與已有的憑據ID重合。填寫完畢后,點擊“添加”按鈕,所添加的憑據就會出現在“Credentials”的下拉選框中,在選框中選擇相應的憑據即可。

          5.3.2 SSH模式

          首先登陸Jenkins所在的master服務器,檢查在~/.ssh目錄下是否有已生成的公鑰和私鑰。其中,公鑰的文件名為id_rsa.pub,私鑰的文件名為id_rsa。若公鑰和私鑰都存在,則將公鑰拷貝到GitLab中,私鑰拷貝到Jenkins中。

          1)將公鑰拷貝到GitLab

          首先登陸到GitLab中,點擊頁面右上角的頭像,選擇Settings-->SSH Keys,進入到“SSH Keys”界面。

          Key:將Jenkins所在master服務器上的公鑰(id_rsa.pub)拷貝到此文本框中;

          Title:填寫一個適合的名稱;

          Add key:點擊此按鈕將公鑰添加到GitLab中;

          Your SSH keys:添加到GitLab的公鑰會顯示在此列表中。

          2)添加Jenkins全局憑據

          首先登陸到Jenkins中,選擇系統管理-->Manager Credentials-->全局憑據-->添加憑據,進入到“添加憑據”界面。

          類型:選擇“SSH Username with private key”;

          ID:填寫一個獨一無二的名稱;

          描述:簡短、清晰的描述此憑據的作用;

          Username:填寫Master服務器的用戶名,如root;

          Private Key:將Master服務器上的私鑰(id_rsa)拷貝到此文本框中。

          設置好全局憑據后,將GitLab中項目的SSH地址復制到Jenkins中相應job配置頁面的“源碼管理”模塊中。在“Credentials”中選擇相應的全局憑據。

          Branches to build:要構建的代碼在Git倉庫中的分支名。由于我們要將dev分支(開發分支代碼,具體名稱視Gitlab中的情況而定)的代碼merge到test分支(測試分支代碼,具體名稱視Gitlab中的情況而定)上,所以此處填寫dev。若不需要在構建前執行merge操作,則此處填寫實際要構建的代碼分支名稱即可。

          5.3.3 Additional Behaviours

          1)Merge before build

          由于我們要在構建前將dev分支的代碼merge到test分支上,因此要在“Additional Behaviours”中新增一個“Merge before build”模塊。若不需要在構建前執行merge操作,則可省略此步驟。

          Name of repository:遠程代碼倉庫的名稱,即所要構建的代碼分支所在的倉庫,默認填寫origin即可;

          Branch to merge to:代碼將要merge到的分支。由于我們要將dev分支的代碼merge到test分支,因此該處填寫test;

          Merge strategy:默認選擇default即可;

          Fast-forward mode:默認選擇--ff即可。

          2)Custom user name/e-mail address

          當在任務中配置了“Merge before build”或向遠程Git倉庫中push版本標簽時,會出現無法識別用戶的情況,如下圖所示:

          要解決這個問題,需要在“Additional Behaviours”的“新增”下拉選框中選擇“Custom user name/e-mail address”選項,添加Gitlab用戶名和對應的電子郵箱。

          查看Gitlab用戶名和電子郵箱的方法:進入到Gitlab主頁,點擊右上角的頭像,在出現的下拉選框中選擇“Settings”進入到設置界面。在設置界面中即可看到用戶名和對應的郵箱。然后將用戶名和郵箱粘貼到“Custom user name/e-mail address”中相應的文本框中即可。

          5.4、構建觸發器

          若不需要自動觸發項目進行構建,可忽略此步驟。

          5.4.1 Git事件觸發構建

          定位到 “構建觸發器”模塊,勾選“Build when a change is pushed to GitLab.”,并記下這一選項末尾的“GitLab webhook URL”。

          此外,還要點擊該選項中的“高級”按鈕,隨后點擊“Secret token”項的 “Generate” ,生成 Secret token。保存這里生成的 Secret token,它將用于后面 GitLab 的配置。

          下面對各項進行簡要介紹:

          1)Enabled GitLab triggers

          Push Events:當有代碼Push到Git倉庫時,自動觸發Jenkins構建;

          Opened Merge Request Events:當在Git中新建一個Merge請求時,自動觸發Jenkins構建;

          Accepted Merge Request Events:當在GitLab中建立的Merge請求被接受后,自動觸發Jenkins構建。例如,在GItLab中,當dev01分支的代碼請求merge到dev分支時,若此請求被成功處理,就會觸發Jenkins自動構建,Jenkins會將dev分支的代碼merge到test分支;

          Closed Merge Request Events:當在GitLab中建立的Merge請求被關閉時,自動觸發Jenkins構建。

          2)保持默認選項

          3)Allowed branches

          此項用于篩選可以觸發任務自動構建的代碼分支。勾選“Filter branches by name”,在“inclued”文本框中填寫允許自動觸發任務構建的代碼分支名稱,名稱之間用英文逗號分隔。

          配置GitLab:此處以merge觸發為例,即當Git倉庫中發生Merge事件時,觸發Jenkins自動構建。打開GItLab,進入到相應的項目頁面中,在頁面左側的導航欄中選擇Settings--->Integrations,進入到“Integrations Settings”界面。在該界面中,在“URL”文本框中輸入“GitLab webhook URL”尾部的HTTP地址;在“Secret Token”中輸入在Jenkins中生成的Secret token;在“Trigger”中勾選“Merge Request events”,然后點擊“Add Webhook”按鈕。

          點擊“Add webhook”按鈕后,添加的webhook會出現在“webhooks”列表中。在列表中選擇新添加的webhook,在其右邊的“Test”下拉列表中選擇相應的Trigger(即Merge requests events),點擊后在頁面上方如果出現“Hook executed successfully:HTTP 200”的提示,則表明配置成功。

          在GitLab中建立Merge請求。首先,登陸GitLab服務器,選擇相應的項目并進入到該項目頁面,在頁面左側的導航欄中選擇“Merge Requests”,進入到“Merge Requests”界面。在該界面的右上角點擊“New Merge Request”,新建一個Merge請求。

          在Merge請求頁面中,選擇相應的源項目、目標項目,以及源分支和目標分支。

          點擊“Compare branches and continue”,會進入到下一個頁面,在此頁面中可以填寫更為詳細的merge requests信息。

          點擊“Submit合并請求”按鈕,進入下一個頁面,在該頁面中可以編輯或關閉此次merge請求。

          當所指定的源分支中的代碼發生更改后(即執行了git commit命令),在此頁面中會出現一個“Merge”按鈕。點擊此按鈕后,源分支上的代碼就會被merge到目標分支上。同時,會觸發Jenkins自動執行構建任務,將dev分支上的代碼merge到test分支上。

          5.4.2 定時構建

          定時構建的選項包括“輪詢SCM”和“定時構建”。定時構建適用于每日構建或每周構建的任務,可以通過設定具體的時間點和時間段來執行指定的任務。構建任務的內容填寫在“日程表”文本框中,而且填寫完畢后下方還會提示上次運行和下次運行的時間點,用于驗證配置是否正確。

          定時構建的語法是* * * * *。

          • 第一個*表示分鐘,取值范圍是0~59。例如,5 * * * *表示每個小時的第5分鐘會構建一次;H/15 * * * *或*/15 * * * *表示每隔15分鐘構建一次;
          • 第2個*表示小時,取值范圍是0~23。例如,H 8 * * *表示每天8點構建一次;H 8-18/2 * * *表示每天8到18點每隔2個小時構建一次;H 8,12,22 * * *表示每天8點、12點、22點分別構建一次;
          • 第3個*表示每月的第幾天,取值范圍是1~31。H 8 4 * * 表示在每個月第4天的第8點構建一次;
          • 第4個*表示第幾個月,取值范圍是1~12。H 8 4 3 *表示在每年3月的第4天的8點構建一次;
          • 第5個*表示一周中的第幾天,取值范圍是0~7,其中0和7表示的都是周日。例如,H 8-18/2 * * 1-5表示周一到周五每天8點~18點每隔兩小時構建一次。

          5.4.3 其它工程構建后觸發

          當所要構建的兩個或多個項目之間存在關聯時,可以勾選此選項。在“關注的項目”文本框中可以填寫多個已存在的項目,項目之間用英文的逗號分隔。例如,任務B要在任務A構建成功后自動構建,可在“關注的項目”文本框中填寫A,同時選擇“只有構建穩定時觸發”,即只有項目A成功構建才會自動觸發B構建。

          5.5、構建環境

          5.5.1 構建前清理工作空間

          若要在構建前清理工作空間,以免工作空間中的內容對本次構建產生影響和及時清理磁盤空間,可勾選“Delete workspace before build starts”選項。

          5.5.2 生成格式化的版本號

          Jenkins默認的構建版本號只是簡單的構建總次數,不包含有年月日及當日構建次數等信息,可勾選“Create a formatted version number”選項自定義所需要的構建版本號。

          Environment Variable Name:填寫一個合適的名稱,此名稱可作為全局環境變量被引用;

          Version Number Format String:填寫自定義的格式化構建版本號,如${JOB_NAME}_${BUILD_DATE_FORMATTED, "yyyyMMdd"}_${BUILDS_TODAY},其中,${JOB_NAME}為項目名稱,${BUILD_DATE_FORMATTED, "yyyyMMdd"}為格式化后的日期,${BUILDS_TODAY}為今日構建次數;

          Skip Builds worse than:當本次構建任務的狀態比此處所選的還要糟糕時,則本次構建不計入構建總次數。例如,此處選擇“SUCCESS”,但本次任務的構建狀態為“FAILURE”,則本次構建不計入今日(或周、月、年)構建總次數;

          Build Display Name:當勾選“Use the formatted version number for build display name”時,自定義的構建版本號會替代原來的“#XXX”顯示在任務欄中,如下圖所示。

          其他選項保持默認即可。

          5.6、Pre Build

          若構建前要利用Sonar Scanner對代碼執行靜態質量掃描操作,則需要在“Add pre-build step”下拉選框中選擇“Execute SonarQube Scanner”選項。

          下面對 “Execute SonarQube Scanner”各項做簡要的介紹:

          Task to run:自定義一個名稱(非必填項);

          JDK:在 JDK 選擇框中選擇 SonarQube Scanner 使用的 JDK(注意這里必須是 JDK 不能是 JRE);

          Path to project properties:非必填項。這里可以指定一個 sonar-project.properties 文件,如果不指定的話會使用項目默認的 properties 文件;

          Analysis properties:這里需要輸入一些配置參數用來傳遞給 SonarQube,這里的參數優先級高于sonar-project.properties文件里面的參數,所以可以在這里來配置所有的參數以替代 sonar-project.properties 文件。下面介紹一些常用的參數:

          • sonar.login=admin:sonarqube用戶名,默認為admin;
          • sonar.password=admin:與sonarqube用戶名相匹配的密碼,默認為admin;
          • sonar.projectKey=opanalysis:在sonarqube界面中創建項目時填寫的“項目標識”;
          • sonar.projectName=opanalysis:在sonarqube界面中創建項目時填寫的“顯示名”;
          • sonar.language=java:指定要分析的開發語言(特定的開發語言對應了特定的規則);
          • sonar.projectVersion=$BUILD_VERSION:項目版本,可使用Jenkins環境變量;
          • sonar.sourceEncoding=UTF-8:源碼的編碼格式;
          • sonar.sources=$WORKSPACE:指定需要分析的源碼位置。這里的$WORKSPACE 所指示的是當前Jenkins項目的目錄,即相對于jenkins的workspace路徑;
          • sonar.java.binaries=$WORKSPACE:指定需要分析的代碼編譯后生成的class文件的位置,相對于jenkins的workspace路徑。

          Additional arguments:非必填項。此輸入框中可以輸入一些附加的參數,示例中的-X意思是進入SonarQube Scanner的Debug模式,這樣會輸出更多的日志信息;

          JVM Options:非必填項。可以輸入在執行 SonarQube Scanner 時需要的JVM參數。

          projectKey和projectName的生成方法:生成sonar.projectKey和sonar.projectName時需要登陸SonarQube界面。在SonarQube界面中新建一個項目時,會要求輸入“項目標識”和“顯示名”,“項目標識”即“sonar.projectKey”,“顯示名”即“sonar.projectName”。

          在SonarQube界面中新建項目的步驟:

          5.7、Build

          Root POM:最上層pom.xml文件的路徑,這里是相對于${WORKSPACE}的路徑。如果不做設置,默認是在工作目錄的根目錄下,填寫pom.xml即可。如果不是默認路徑,例如,在${WORKSPACE}/my-project/pom.xml下,這里寫上/my-project/pom.xml。

          Goals and options:這里就是mvn指令后面的部分,如clean package,也可以帶參數。比如,要跳過單元測試,就使用-Dmaven.test.skip=true。

          5.8、構建后操作

          在“構建后操作步驟”中添加“Git Publisher”和“Send build artifacts over SSH”。其中,“Git Publisher”的作用是將在Jenkins中merge后的代碼push到遠程倉庫中相應的分支。“Send build artifacts over SSH”的作用是將編譯打包后的文件(如war包、jar包)推送到遠程服務器。

          5.8.1 Git Publisher

          Branch to push:代碼merge成功后要push到的分支的名稱。在我們的示例中,Jenkins在執行構建任務時,將dev分支上的代碼merge到了test分支上。merge成功后,還需要將合并后的代碼push到遠程倉庫中指定的分支上。此處我們將合并后的代碼push到了test分支上;

          Target remote name:遠程代碼倉庫的名稱,即上面所填寫的代碼分支所在的Git倉庫。

          Tags:在將merge后的代碼push到遠程倉庫中指定的分支時,還可以為此次提交的代碼打上一個tag,此tag也會同時被push到遠程倉庫中。點擊“Add Tags”按鈕,填寫相應的配置信息。

          5.8.2 Send build artifacts over SSH

          在這個模塊中配置相應的信息,將構建后編譯生成的jar包推送到遠程服務器上指定的目錄。也可編寫shell腳本,對應用進行部署。

          Name:選擇在Jenkins“系統管理--->系統設置”中設置的SSH Server的名字;

          Source files:拷貝到遠程服務器上的文件。需要上傳的文件必須位于當前的workspace中,否則會上傳失敗。如果只執行命令而不需要傳輸文件時,此處可為空;

          Remove prefix:在“Source files”配置的路徑中要移除的前綴。在Source files文本框中填入的地址,會默認在服務器下創建相同的目錄,所以要將我們不需要的前綴在這里剔除掉,只傳輸XXX.jar;

          Remote directory:遠程服務器接收文件的目錄,此目錄是相對于“SSH Server”中的“Remote directory”的,如果不存在將會自動創建;

          Exec command:文件傳輸任務執行完畢后,在遠程服務器上執行的腳本(可填寫腳本所在目錄)。

          Exec command中的腳本:

           1 #! /bin/bash
           2 #!/bin/bash
           3 export PROJECT_HOME="/opt/opanalysis"
           4 export JAR_HOME="$PROJECT_HOME/new-jar"
           5 export BACKUP_HOME="$PROJECT_HOME/backup-jar"
           6 export ANALYSIS=op-analysis.jar
           7 export TEAMBITION=op-teambition.jar
           8 export CAS=op-cas.jar
           9 export GATEWAY=op-gateway.jar
          10 export LOG_HOME="/opt/opanalysis/logs"
          11 export ANALYSIS_log="$LOG_HOME/op-analysis.log"
          12 export TEAMBITION_log="$LOG_HOME/op-teambition.log"
          13 export CAS_log="$LOG_HOME/op-cas.log"
          14 export GATEWAY_log="$LOG_HOME/op-gateway.log"
          15 BACKUP_FILE=v${BUILD_VERSION}_$(date +%Y-%m-%d_%H:%M:%S)
          16 echo "****** Backup old jar ******"
          17 mkdir $BACKUP_HOME/$BACKUP_FILE
          18 cp $JAR_HOME/*.jar $BACKUP_HOME/$BACKUP_FILE
          19 echo "****** Remove old jar ******"
          20 find $JAR_HOME -type f -name "*.jar" -print0 | xargs -0 rm -rf
          21 echo "****** Copy new jar ******"
          22 cp $PROJECT_HOME/op-analysis/target/$ANALYSIS $JAR_HOME
          23 cp $PROJECT_HOME/op-teambition/target/$TEAMBITION $JAR_HOME
          24 cp $PROJECT_HOME/op-cas/target/$CAS $JAR_HOME
          25 cp $PROJECT_HOME/op-gateway/target/$GATEWAY $JAR_HOME
          26 if [ -e $JAR_HOME/$ANALYSIS -a -e $JAR_HOME/$TEAMBITION -a -e $JAR_HOME/$CAS -a -e $JAR_HOME/$GATEWAY ]; then
          27     echo "The new jars were successfully replicated"
          28 else
          29     echo "The new jars replication failed"
          30     exit 1
          31 fi
          32 echo "****** Stop the old processes ******"
          33 P_ID=$(ps -ef | grep -w $ANALYSIS | grep -v "grep" | awk '{print $2}')
          34 if [ "$P_ID" == "" ]; then
          35     echo "$ANALYSIS process does not exist or has stopped successfully"
          36 else
          37     kill -9 $P_ID
          38     echo "$ANALYSIS was successfully killed"
          39 fi      
          40 P_ID=$(ps -ef | grep -w $TEAMBITION | grep -v "grep" | awk '{print $2}')
          41 if [ "$P_ID" == "" ]; then
          42     echo "$TEAMBITION process does not exist or has stopped successfully"
          43 else
          44     kill -9 $P_ID
          45     echo "$TEAMBITION was successfully killed"
          46 fi      
          47 P_ID=$(ps -ef | grep -w $CAS | grep -v "grep" | awk '{print $2}')
          48 if [ "$P_ID" == "" ]; then
          49     echo "$CAS process does not exist or has stopped successfully"
          50 else
          51     kill -9 $P_ID
          52     echo "$CAS was successfully killed"
          53 fi     
          54 P_ID=$(ps -ef | grep -w $GATEWAY | grep -v "grep" | awk '{print $2}')
          55 if [ "$P_ID" == "" ]; then
          56     echo "$GATEWAY process does not exist or has stopped successfully"
          57 else
          58     kill -9 $P_ID
          59     echo "$GATEWAY was successfully killed"
          60 fi
          61 echo "****** Old processes stop success ******"
          62 echo "****** Start op-analysis.jar... ******"
          63 nohup java -jar $JAR_HOME/$ANALYSIS > $ANALYSIS_log 2>&1 &
          64 EXEXUTE_STATUS_ANALYSIS=$?
          65 sleep 10
          66 if [ $EXEXUTE_STATUS_ANALYSIS -eq 0 -a $(ps -ef | grep -w $ANALYSIS | grep -v "grep" | wc -l) -ne 0 ]; then
          67     echo "$ANALYSIS started successfully"
          68 else
          69     echo "$ANALYSIS failed to start"
          70 fi
          71 echo "****** Start op-teambition.jar... ******"
          72 nohup java -jar $JAR_HOME/$TEAMBITION > $TEAMBITION_log 2>&1 &
          73 EXECUTE_STATUS_TEAMBITION=$?
          74 sleep 10
          75 if [ $EXECUTE_STATUS_TEAMBITION -eq 0 -a $(ps -ef | grep -w $TEAMBITION | grep -v "grep" | wc -l) -ne 0 ]; then
          76     echo "$TEAMBITION started successfully"
          77 else
          78     echo "$TEAMBITION failed to start"
          79 fi
          80 echo "****** Start op-cas.jar... ******"
          81 nohup java -jar $JAR_HOME/$CAS > $CAS_log 2>&1 &
          82 EXECUTE_STATUS_CAS=$?
          83 sleep 10
          84 if [ $EXECUTE_STATUS_CAS -eq 0 -a $(ps -ef | grep -w $CAS | grep -v "grep" | wc -l) -ne 0 ]; then
          85     echo "$CAS started successfully"
          86 else
          87     echo "$CAS failed to start"
          88 fi
          89 echo "****** Start op-gateway.jar... ******"
          90 nohup java -jar $JAR_HOME/$GATEWAY > $GATEWAY_log 2>&1 &
          91 EXECUTE_STATUS_GATEWAY=$?
          92 sleep 10
          93 if [ $EXECUTE_STATUS_GATEWAY -eq 0 -a $(ps -ef | grep -w $GATEWAY | grep -v "grep" | wc -l) -ne 0 ]; then
          94     echo "$GATEWAY started successfully"
          95 else
          96     echo "$GATEWAY failed to start"
          97 fi
          98 echo "****** Over ******" 

          5.8.3 Editable Email Notification

          在“增加構建后操作步驟”下拉選框中選擇“Editable Email Notification”,選擇后會在“構建后操作”中出現“Editable Email Notification”模塊。

          六、分布式構建

          6.1、Jenkins運行模式--Master/Slave

          Jenkins支持Master/Slave這種分布式運行模式。將安裝Jenkins的機器作為Master節點,然后用戶通過界面配置來添加Slave節點。在用戶配置具體任務的時候可以選擇Master機器本身或者某個Slave節點來運行。Jenkins在實際運行任務的時候,將作業分布到指定的Master或Slave節點上,使得單個節點安裝的Jenkins服務器能夠管理多個節點,運行大批量的任務,以及為它們提供不同的系統環境和配置。

          6.2、通過界面添加Slave節點

          創建和配置Jenkins Slave節點。選擇 系統管理-->節點管理--->新建節點 選項,可以創建全新的Slave節點,也可以從已有的Jenkins節點復制。

          6.2.1 配置節點的一些基本信息

          名稱:節點獨一無二的名稱,自行命名;

          描述:節點的描述;

          執行器數量:在該節點可以并行運行的最大任務數量,建議和CPU的內核數相等,這里設置的值太高會導致節點負荷過大,在運行多個任務時,任務執行耗時過長;

          遠程工作目錄:指定Slave節點的workspace目錄,但是一些重要的數據會保存在Master節點上,一些源碼和文件會直接放置在運行的Slave節點上,因此這里需要指定一個目錄;

          標簽:用來表示節點的群組。例如,如果節點都是Windows系統的節點,可以提供“Windows Node”作為標簽,在配置任務時可以不用指定具體的節點,而指定對應的群組;

          用法:節點有兩種使用模式。默認是Use this node as much as possible。在這種模式下,如果任務沒有指定具體的運行節點,那么會隨機指派一個可用節點。當節點配置為這種模式時,在需要的時候可以被Jenkins隨機調用。還有一種模式是Only build jobs with label expressions matching this node。在這種模式下,只有當任務指定使用該節點時,才會使用該節點,可以用于資源受嚴格控制的場景及專門用于某些任務。

          6.2.2 Master節點和Slave節點的連接方式

          這里主要介紹Launch slave agents via SSH連接方式(配置節點前必須安裝SSH Agent Plugin插件,否則不能出現Launch slave agents via SSH選項)。

          啟動方式:選擇Launch slave agents via SSH;

          主機:填寫Slave機器的IP地址;

          Credentials:添加憑證信息

          類型:選擇SSH Username with private key;

          ID:填寫一個獨一無二的ID名;

          描述:填寫能清楚描述此憑證的信息;

          Username:填寫Master節點所在服務器的用戶名;

          Private Key:填寫Master節點所在服務器的私鑰。

          在配置Slave節點信息之前,需要將Master節點服務器上的公鑰推送到Slave節點服務器上:

           1 # 生成公鑰和私鑰
           2 ssh-keygen -t rsa
           3 # 進入到公鑰和私鑰所在的目錄  
           4 cd ~/.ssh  
           5 # 查看生成的公鑰
           6 cat id_rsa.pub
           7 # 查看生成的私鑰 
           8 cat id_rsa
           9 # 將公鑰推送到Slave節點服務器上
          10 ssh-copy-id -i ~/.ssh/id_rsa.pub root@172.16.239.51  

          若沒有登陸Master節點服務器的權限,可以在Slave節點所在服務器的~/.ssh目錄下新建一個authorized_keys的文件,并將Master節點服務器的公鑰粘貼在此文件中。

          6.3、配置節點的工具執行路徑

          在系統的全局配置中,我們會設定一些工具的執行路徑。如果在Slave節點上工具的執行路徑與全局配置不同,就需要重新選擇工具名稱,給予新的路徑,覆蓋全局配置中的默認路徑。建議在系統的全局工具配置中已有的工具都要在Slave節點所在的服務器上安裝,否則構建任務的時候會出錯。

          6.4、在Slave節點上運行任務

          選擇一個要在Slave節點上運行的任務,進入到其設置界面,定位到界面中的General模塊,勾選“限制項目的運行節點”,在出現的文本框中輸入Slave節點的名稱,應用并保存該配置,當構建該任務時,會自動在該Slave節點上運行。

          6.5、構建過程中可能出現的問題

          (1)無法從遠程Git倉庫中拉取代碼

          需要將GitLab所在服務器的IP地址和對應的域名添加到Slave服務器的hosts文件中:

          # 編輯hosts文件
          vim /etc/hosts  

          (2)無法將Sonar Scanner的代碼掃描結果發送到Sonar Qube上進行展示

          需要將Sonar Qube的用戶名和對應的登陸密碼添加到Analysis properties中:

          (3)無法找到Maven的配置文件

          在slave服務器中,maven的配置文件(settings.xml)的路徑需要和master服務器上的路徑一致,否則構建時會出錯。

          七、前端項目構建和部署

          在對前端項目進行構建之前,需要在Jenkins的Master服務器上安裝NodeJs、在Jenkins上安裝NodeJS插件。此外還要在測試服務器上安裝Nginx。

          進入到測試服務器,在nginx的安裝目錄下找到nginx.conf文件,并使用vim命令對該文件進行編輯。

          7.1、新建任務

          首先進入Jenkins主界面,在面板左側的導航欄中點擊“新建任務”,進入“新建任務”界面。

          進入“新建任務”界面后,在“任務名稱”文本框中輸入一個合法的名稱(該名稱最好能簡短、清晰地描述所要構建的項目,且不能與已有的任務名稱重合),然后選擇“構建一個自由風格的軟件項目”,點擊左下角的“確定”按鈕,進入任務配置界面。

          7.2、General

          請參考5.2節

          7.3、源碼管理

          請參考5.3節

          7.4、構建觸發器

          請參考5.4節

          7.5、構建環境

          前端代碼在構建時需要NodeJS進行編譯、打包,所以要在“構建環境”中配置NodeJS環境。安裝NodeJS插件后,會在“構建環境”模塊中出現“Provide Node & npm bin/ folder to PATH“選項,勾選此選項。

          NodeJS Installation:在“全局工具配置”界面中指定NodeJS安裝路徑時所填寫的名稱會出現在此下拉列表中,在列表中選擇所需的名稱即可;

          npmrc file:選擇“- use system default –”;

          Cache location:選擇“Default (~/.npm or %APP_DATA%\npm-cache)”。

          “構建環境”模塊中的其他選項配置請參考5.5節。

          7.6、構建

          7.6.1 執行shell

          在“構建”模塊的“增加構建步驟”下拉選框中選擇“執行shell”選項,然后在“執行shell”的“命令”文本框中輸入編譯、打包前端代碼的命令。

          命令如下:

           1 #!/bin/bash
           2 export WORKSPACE_HOME="/var/lib/jenkins/workspace/operation-analysis-front"
           3 # 進入項目的工作空間  
           4 cd $WORKSPACE_HOME
           5 # 執行npm install后,npm會根據在package.json中對各種依賴的定義去安裝這些依賴  
           6 npm install
           7 # 打包項目代碼。打包完成后會生成一個dist目錄,所要部署的文件就存放在dist目錄下  
           8 npm run test
           9 # 進入到dist目錄 
          10 cd $WORKSPACE_HOME/dist
          11 # 刪除舊的壓縮文件  
          12 rm -f dist.tar.gz
          13 # 對新的部署文件進行打包壓縮  
          14 tar -zcvf dist.tar.gz *  

          7.6.2 Execute SonarQube Scanner

          請參考5.6節。不同的是前端代碼的掃描對象為JavaScript,因此代碼語言要設置成js,即sonar.language=js。

          7.7、構建后操作

          7.7.1 Git Publisher

          請參考5.8.1節

          7.7.2 Send build artifacts over SSH

          在這個模塊中配置相應的信息,將構建后編譯生成的dist目錄下的部署文件推送到遠程服務器上指定的目錄。

          Name:選擇在Jenkins“系統管理--->系統設置”中設置的SSH Server的名字;

          Source files:拷貝到遠程服務器上的文件。需要上傳的文件必須位于當前的workspace中,否則會上傳失敗。可填寫相對于workspace的路徑名。例如,由于我們將dist目錄下的文件打包成了一個壓縮包,所以此處填寫dist/dist.tar.gz即可;

          Remove prefix:在“Source files”配置的路徑中要移除的前綴。在Source files文本框中填入的地址,會默認在服務器中創建相同的目錄,所以要將我們不需要的前綴在這里剔除掉,例如,去掉dist;

          Remote directory:遠程服務器接收文件的目錄,此目錄是相對于“SSH Server”中的“Remote directory”的,如果不存在將會自動創建;

          Exec command:文件傳輸任務執行完畢后,在遠程服務器上執行的腳本(可填寫腳本所在目錄)。

          Exec command中的腳本如下:

           1 #!/bin/bash  
           2 export PROJECT_HOME="/usr/local/operation_analysis/op-web-package"  
           3 export DIST_HOME="$PROJECT_HOME/dist"  
           4 export BACKUP_HOME="$PROJECT_HOME/backup-dist"  
           5 export TARGET_HOME="/opt/opanalysis-front"  
           6 BACKUP_FILE="v${BUILD_VERSION}_$(date +%Y-%m-%d_%H:%M:%S)"  
           7 echo "****** Backup old dist ******"  
           8 mkdir $BACKUP_HOME/$BACKUP_FILE  
           9 cp -r $DIST_HOME $BACKUP_HOME/$BACKUP_FILE  
          10 echo "****** Remove old dist ******"  
          11 rm -rf $DIST_HOME/*
          12 echo "****** Copy new dist ******"  
          13 mv $TARGET_HOME/dist.tar.gz $DIST_HOME  
          14 tar -zxvf $DIST_HOME/dist.tar.gz -C $DIST_HOME  
          15 rm -rf $DIST_HOME/dist.tar.gz  

          八、SonarQube的安裝

          1、配置JDK

          useradd java
          passwd java
          cd /home/java
          wget https://www.oracle.com/webapps/redirect/signon?nexturl=https://download.oracle.com/otn/java/jdk/8u271-b09/61ae65e088624f5aaa0b1d2d801acb16/jdk-8u271-linux-x64.tar.gz
          tar -zxvf jdk-8u271-linux-x64.tar.gz  
          vim /etc/profile  
          export JAVA_HOME=/home/java/jdk1.8.0_271  
          export PATH=$JAVA_HOME/bin:$PATH  
          source /etc/profile  
          java -version
          ln -s /home/java/jdk1.8.0_271/bin/java /usr/bin/java

          2、下載并安裝SonarQube

          wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-7.6.zip
          cp sonarqube-7.6 /opt  
          cd /opt/sonarqube/conf
          # 修改sonar的配置文件
          vim sonar.properties 
          sonar.jdbc.username=sonar  
          sonar.jdbc.password=sonar
          sonar.login=admin
          sonar.password=admin  
          sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
          # 添加sonar用戶(必須以非root用戶啟動sonarqube)
          useradd sonar
          passwd sonar  
          chown -R sonar:sonar /opt/sonarqube/
          chmod -R 755 /opt/sonarqube
          su sonar
          # 啟動sonarqube
          cd /opt/sonarqube/bin/linux-x86-64/  
          ./sonar.sh console

          安裝過程中可能會出現的問題:

          1)Encounteredanerrorrunningmain:java.nio.file.AccessDeniedExcepti

          解決辦法:刪除sonarqube/temp、sonarqube/logs目錄下的所有文件即可;

          2)java.sql.SQLException:CannotcreatePoolableConnectionFactory(Accessdenied)

          數據庫賬號授權有問題。

          解決辦法:刪除sonar的庫表,賬號,重新進行建表與授權。

          安裝sonar-scanner:

          cd /usr/local

          # 下載sonar scanner

          wget https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-4.4.0.2170-linux.zip

          # 解壓

          tar -zxvf sonar-scanner-cli-4.4.0.2170-linux.zip

          # 進入到配置文件目錄下

          cd sonar-scanner-4.4.0.2170-linux/conf

          # 修改sonar-scanner.properties文件:

          sonar.host.url=http://localhost:9000(localhost修改為sonarqube所在的IP地址)

          九、安裝MySQL

          [root@localhost /]# rpm -qa | grep mysql  
          # 若已安裝了MySQL,執行刪除命令  
          [root@localhost /]# rpm -e --nodeps mysql-libs-5.1.73-5.el6_6.x86_64  
          # 再次執行查詢命令,查看是否刪除成功  
          [root@localhost /]# rpm -qa | grep mysql  
          # 查詢所有MySQL對應的文件夾  
          [root@localhost /]# whereis mysql  
          mysql: /usr/bin/mysql /usr/include/mysql  
          [root@localhost lib]# find / -name mysql  
          /data/mysql  
          /data/mysql/mysql  
          # 刪除相關目錄或文件  
          [root@localhost /]#  rm -rf /usr/bin/mysql /usr/include/mysql /data/mysql /data/mysql/mysql   
          # 驗證是否刪除完畢  
          [root@localhost /]# whereis mysql  
          mysql:  
          [root@localhost /]# find / -name mysql  
          [root@localhost /]#   
          # 檢查MySQL用戶和用戶組是否存在,如果沒有則創建  
          [root@localhost /]# cat /etc/group | grep mysql  
          [root@localhost /]# cat /etc/passwd | grep mysql  
          [root@localhost /]# groupadd mysql  
          [root@localhost /]# useradd -r -g mysql mysql  
          # 下載MySQL  
          [root@localhost /]#  wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz  
          # 執行解壓縮命令  
          [root@localhost /]#  tar xzvf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz  
          [root@localhost /]# ls  
          mysql-5.7.24-linux-glibc2.12-x86_64  
          mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz  
          [root@localhost /]# mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/  
          [root@localhost /]# cd /usr/local/  
          [root@localhost /]# mv mysql-5.7.24-linux-glibc2.12-x86_64 mysql  
          [root@localhost /]# mkdir /usr/local/mysql/data  
          # 更改mysql目錄下所有的目錄及文件所屬的用戶和用戶組,以及權限  
          [root@localhost /]# chown -R mysql:mysql /usr/local/mysql  
          [root@localhost /]# chmod -R 755 /usr/local/mysql  
          # 編譯安裝并初始化mysql,務必記住初始化輸出日志末尾的密碼(數據庫管理員臨時密碼)  
          [root@localhost /]# cd /usr/local/mysql/bin  
          [root@localhost bin]# ./mysqld --initialize --user=mysql --datadir=/usr/local/mysql/data --basedir=/usr/local/mysql  
          # 測試啟動mysql服務器  
          [root@localhost /]# /usr/local/mysql/support-files/mysql.server start  
          # 添加軟連接,并重啟mysql服務  
          [root@localhost /]#  ln -s /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql   
          [root@localhost /]#  ln -s /usr/local/mysql/bin/mysql /usr/bin/mysql  
          [root@localhost /]#  service mysql restart  
          #登陸mysql,修改密碼(密碼為初始化mysql時生成的臨時密碼)  
          [root@localhost /]#  mysql -u root -p  
          Enter password:  
          mysql>set password for root@localhost = password('yourpass');  
          # 設置開機自啟動  
          [root@localhost /]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld  
          [root@localhost /]# chmod +x /etc/init.d/mysqld  
          [root@localhost /]# chkconfig --add mysqld  
          [root@localhost /]# chkconfig --list  

          十、安裝Jenkins

          # yum的repos中默認是沒有Jenkins的,需要先將Jenkins存儲庫添加到yum repos  
          sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo  
          sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key  
          yum install jenkins  
          #安裝完畢后進入jenkins配置文件  
          vi /etc/sysconfig/jenkins  
          JENKINS_USER="root"  
          JENKINS_PORT="8081"  
          service jenkins start  

          十一、安裝NodeJS

          #下載壓縮包
          cd /usr/local
          wget https://nodejs.org/dist/latest-v12.x/node-v12.19.0-linux-x64.tar.xz
          tar -xvf node-v12.19.0-linux-x64.tar.xz
          mv node-12.19.0 node
          #進入到node目錄的bin中,檢查是否安裝成功
          cd node/bin
          ./node -v
          #配置軟鏈接,使全局都可以使用node命令
          ln -s /usr/local/node/bin/node /usr/bin/node  
          ln -s /usr/local/node/bin/npm /usr/bin/npm
          #配置node文件安裝路徑
          cd /usr/local/node
          mkdir node_global
          mkdir node_cache
          npm config set prefix “node_global”
          npm config set cache “node_cache”
          #在全局下查看node和npm版本
          node -v
          npm -v

          十二、安裝Nginx

           1 #環境安裝
           2 yum -y install gcc gcc-c++ autoconf automake make  
           3 yum -y install make zlib-devel gcc-c++ libtool openssl openssl-devel
           4 #下載壓縮包
           5 cd /usr/local  
           6 wget http://nginx.org/download/nginx-1.9.9.tar.gz  
           7 #解壓壓縮包
           8 tar -zxvf nginx-1.9.9.tar.gz
           9 #進入nginx目錄
          10 cd nginx-1.9.9  
          11 #設置安裝目錄為/usr/local/nginx
          12 ./configure --prefix=/usr/local/nginx
          13 #編譯、安裝
          14 make
          15 make install
          16 #啟動nginx服務 
          17 cd /usr/local/nginx/sbin
          18 ./nginx

          修改Nginx配置文件:

           1 cd /usr/local/nginx/conf  
           2 vim nginx.conf  
           3 server {  
           4         listen 8801;  
           5         root   /usr/share/nginx/html;  
           6   
           7         # Load configuration files for the default server block.  
           8         include /etc/nginx/default.d/*.conf;  
           9   
          10         location / {  
          11              root /usr/local/operation_analysis/op-web-package/dist;  
          12         }  
          13   
          14         location /op-analysis {  
          15              proxy_pass http://172.16.239.51:8101/op-analysis;  
          16         }  
          17   
          18         error_page 404 /404.html;  
          19             location = /40x.html {  
          20         }  
          21   
          22         error_page 500 502 503 504 /50x.html;  
          23             location = /50x.html {  
          24         }  
          25     }  

          十三、接口自動化集成

          13.1、安裝JDK

           1 useradd java  #添加java用戶
           2 passwd java
           3 cd /home/java
           4 wget https://www.oracle.com/webapps/redirect/signon?nexturl=https://download.oracle.com/otn/java/jdk/8u271-b09/61ae65e088624f5aaa0b1d2d801acb16/jdk-8u271-linux-x64.tar.gz
           5 tar -zxvf jdk-8u271-linux-x64.tar.gz  
           6 vim /etc/profile  
           7 export JAVA_HOME=/home/java/jdk1.8.0_271  
           8 export PATH=$JAVA_HOME/bin:$PATH  
           9 source /etc/profile  
          10 java -version
          11 ln -s /home/java/jdk1.8.0_271/bin/java /usr/bin/java 

          13.2、安裝Maven

          官網下載地址:http://maven.apache.org/download.cgi

          1 tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local/maven  
          2 vim /etc/profile  
          3 export M2_HOME=/usr/local/maven/apache-maven-3.6.3  
          4 export PATH=$PATH:$M2_HOME/bin  
          5 source /etc/profile  
          6 mven -version  

          13.3、Maven工程構建

          13.4、Maven工程子目錄創建

          創建maven工程后,在工程目錄下創建如下所需的文件夾

          src/test/resources:存放報告模板文件

          src/test/jmeter:存放jmeter配置文件及測試腳本

          說明:

          1)這里的resources下放的是報告模板文件:jmeter-results-report-apitest.xsl等,以及模板用到的資源文件:collapse.png和expand.png (從 apache-jmeter-3.3\extras下復制而來);

          2)jmeter.properties等是jmeter配置文件(從apache-jmeter-3.3\bin下復制而來),后綴.jmx為jmeter腳本(后續只需要把本地調試通過的jmeter腳本放入如圖這個目錄就可以了);

          3)如果properties文件有過更改,則把相關的propertie文件也復制到jmeter文件夾里,否則系統會使用默認的jmeter配置文件。

          13.5、JMeter配置文件修改

          jmeter執行結果文件默認保存的不是xml格式,無法轉化成html格式。

          jmeter執行結果文件默認有很多執行數據是不保存的,而測試報告需要這些數據。

          打開jmeter.properti文件,做如下修改:

          1)去掉注釋(#),修改csv為xml。

          2) 添加jtl文件結果參數

           1 jmeter.save.saveservice.data_type=true  
           2 jmeter.save.saveservice.label=true  
           3 jmeter.save.saveservice.response_code=true  
           4 # response_data is not currently supported for CSV output  
           5 jmeter.save.saveservice.response_data=true  
           6 # Save ResponseData for failed samples  
           7 jmeter.save.saveservice.response_data.on_error=false  
           8 jmeter.save.saveservice.response_message=true  
           9 jmeter.save.saveservice.successful=true  
          10 jmeter.save.saveservice.thread_name=true  
          11 jmeter.save.saveservice.time=true  
          12 jmeter.save.saveservice.subresults=true  
          13 jmeter.save.saveservice.assertions=true  
          14 jmeter.save.saveservice.latency=true  
          15 jmeter.save.saveservice.connect_time=true  
          16 jmeter.save.saveservice.samplerData=true  
          17 jmeter.save.saveservice.responseHeaders=true  
          18 jmeter.save.saveservice.requestHeaders=true  
          19 jmeter.save.saveservice.encoding=false  
          20 jmeter.save.saveservice.bytes=true  
          21 jmeter.save.saveservice.url=true  
          22 jmeter.save.saveservice.filename=true  
          23 jmeter.save.saveservice.hostname=true  
          24 jmeter.save.saveservice.thread_counts=true  
          25 jmeter.save.saveservice.sample_count=true  
          26 jmeter.save.saveservice.idle_time=true  

          13.6、編輯pom.xml文件

            1 <project xmlns="http://maven.apache.org/POM/4.0.0"  
            2          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
            3          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">  
            4     <modelVersion>4.0.0</modelVersion>  
            5   
            6     <groupId>APITest</groupId>  
            7     <artifactId>JMeter</artifactId>  
            8     <version>0.0.1-SNAPSHOT</version>  
            9   
           10     <name>JMeterTest</name>  
           11     <url>http://maven.apache.org</url>  
           12     <dependencies>  
           13         <dependency>  
           14             <groupId>junit</groupId>  
           15             <artifactId>junit</artifactId>  
           16             <version>3.8.1</version>  
           17             <scope>test</scope>  
           18         </dependency>  
           19         <dependency>  
           20             <groupId>javax.servlet</groupId>  
           21             <artifactId>servlet-api</artifactId>  
           22             <version>3.0-alpha-1</version>  
           23         </dependency>  
           24         <dependency>  
           25             <groupId>mysql</groupId>  
           26             <artifactId>mysql-connector-java</artifactId>  
           27             <version>5.1.13</version>  
           28         </dependency>  
           29         <!-- <dependency> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_jdbc</artifactId>  
           30             <version>2.11</version> </dependency> <dependency> <groupId>com.oracle</groupId>  
           31             <artifactId>ojdbc14</artifactId> <version>10.2.0.5</version> </dependency> -->  
           32         <!-- MySql 5.5 Connector -->  
           33     </dependencies>  
           34     <properties>  
           35         <jmeter.result.jtl.dir>${project.build.directory}\jmeter\results</jmeter.result.jtl.dir>  
           36         <jmeter.result.html.dir>${project.build.directory}\jmeter\html</jmeter.result.html.dir>  
           37         <jmeter.result.html.dir1>${project.build.directory}\jmeter\html1</jmeter.result.html.dir1>  
           38         <jmeter.result.html.dir2>${project.build.directory}\jmeter\html2</jmeter.result.html.dir2>  
           39         <ReportName>TestReport</ReportName>  
           40     </properties>  
           41     <pluginRepositories>  
           42         <pluginRepository>  
           43             <id>Codehaus repository</id>  
           44             <url>http://repository.codehaus.org/</url>  
           45             <releases>  
           46                 <enabled>true</enabled>  
           47                 <updatePolicy>always</updatePolicy>  
           48             </releases>  
           49             <snapshots>  
           50                 <enabled>true</enabled>  
           51                 <updatePolicy>always</updatePolicy>  
           52             </snapshots>  
           53         </pluginRepository>  
           54     </pluginRepositories>  
           55     <build>  
           56         <finalName>vet2</finalName>  
           57         <plugins>  
           58             <plugin>
           59         <!—核心插件,用來執行jmx腳本,注意版本號-->
           60                 <groupId>com.lazerycode.jmeter</groupId>  
           61                 <artifactId>jmeter-maven-plugin</artifactId>  
           62                 <version>2.7.0</version>  
           63                 <executions>  
           64                     <execution>  
           65                         <id>test</id>  
           66                         <phase>verify</phase>  
           67                         <goals>  
           68                             <goal>jmeter</goal>  
           69                         </goals>  
           70                         <!-- <configuration> <resultsFileFormat>csv</resultsFileFormat> </configuration> -->  
           71                     </execution>  
           72                 </executions>  
           73                 <configuration>
           74           <!-- 設置jmeter生成結果文件格式 -->
           75                     <resultsFileFormat>xml</resultsFileFormat>
           76           <!-- 設置忽略失敗是否停止運行 -->  
           77                     <ignoreResultFailures>true</ignoreResultFailures>
           78           <!-- 設置結果是否有時間戳 -->  
           79                     <testResultsTimestamp>flase</testResultsTimestamp>  
           80                     <generateReports>false</generateReports>  
           81                     <testFilesIncluded>
           82             <!-- 指定運行的jmeter腳本 -->  
           83                         <jMeterTestFile>*.jmx</jMeterTestFile>  
           84                     </testFilesIncluded>  
           85                 </configuration>  
           86             </plugin>  
           87             <!-- <plugin> <groupId>org.apache.jmeter</groupId> <artifactId>ApacheJMeter_jdbc</artifactId>  
           88                 <version>2.11</version> </plugin> -->  
           89   
           90             <plugin>  
           91                 <artifactId>maven-compiler-plugin</artifactId>  
           92                 <configuration>  
           93                     <source>1.8</source>  
           94                     <target>1.8</target>  
           95                     <encoding>UTF-8</encoding>  
           96                     <compilerArguments>  
           97                         <extdirs>src\test\jmeter\lib</extdirs>  
           98                     </compilerArguments>  
           99                 </configuration>  
          100             </plugin>  
          101   
          102             <plugin>
          103         <!--根據xsl模版把jtl文件轉換成html,官網地址: http://www.mojohaus.org/xml-maven-plugin/examples/transform-saxon.html--> 
          104                 <groupId>org.codehaus.mojo</groupId>  
          105                 <artifactId>xml-maven-plugin</artifactId>  
          106                 <version>1.0.2</version>  
          107                 <executions>  
          108                     <execution>  
          109                         <phase>verify</phase>  
          110                         <goals>  
          111                             <goal>transform</goal>  
          112                         </goals>  
          113                     </execution>  
          114                 </executions>  
          115                 <configuration>  
          116                     <transformationSets>  
          117                         <transformationSet>  
          118                             <dir>${jmeter.result.jtl.dir}</dir>  
          119                             <stylesheet>src/test/resources/jmeter-results-detail-report_21.xsl</stylesheet>  
          120                             <outputDir>${jmeter.result.html.dir}</outputDir>  
          121                             <fileMappers>  
          122                                 <fileMapper  
          123                                         implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">  
          124                                     <targetExtension>html</targetExtension>  
          125                                 </fileMapper>  
          126                             </fileMappers>  
          127                         </transformationSet>  
          128                         <transformationSet>
          129               <!-- 可以根據不同的模版,同時生成多個html報告 -->  
          130                             <dir>${jmeter.result.jtl.dir}</dir>  
          131                             <stylesheet>src/test/resources/jmeter.results.shanhe.me.xsl</stylesheet>  
          132                             <outputDir>${jmeter.result.html.dir1}</outputDir>  
          133                             <fileMappers>  
          134                                 <fileMapper  
          135                                         implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">  
          136                                     <targetExtension>html</targetExtension>  
          137                                 </fileMapper>  
          138                             </fileMappers>  
          139                         </transformationSet>  
          140                         <transformationSet>  
          141                             <dir>${jmeter.result.jtl.dir}</dir>  
          142                             <stylesheet>src/test/resources/jmeter-results-report-apitest.xsl</stylesheet>  
          143                             <outputDir>${jmeter.result.html.dir2}</outputDir>  
          144                             <fileMappers>  
          145                                 <fileMapper  
          146                                         implementation="org.codehaus.plexus.components.io.filemappers.FileExtensionMapper">  
          147                                     <targetExtension>html</targetExtension>  
          148                                 </fileMapper>  
          149                             </fileMappers>  
          150                         </transformationSet>  
          151                     </transformationSets>  
          152                 </configuration>  
          153             </plugin>  
          154             <plugin>  
          155                 <groupId>org.apache.maven.plugins</groupId>  
          156                 <artifactId>maven-dependency-plugin</artifactId>  
          157                 <executions>  
          158                     <execution>  
          159                         <id>copy-dependencies</id>  
          160                         <phase>prepare-package</phase>  
          161                         <goals>  
          162                             <goal>copy-dependencies</goal>  
          163                         </goals>  
          164                         <configuration>  
          165                             <outputDirectory>${project.build.directory}/jmeter/lib</outputDirectory>  
          166                             <overWriteReleases>false</overWriteReleases>  
          167                             <overWriteSnapshots>false</overWriteSnapshots>  
          168                             <overWriteIfNewer>true</overWriteIfNewer>  
          169                         </configuration>  
          170                     </execution>  
          171                 </executions>  
          172             </plugin>  
          173             <plugin>  
          174                 <groupId>org.apache.maven.plugins</groupId>  
          175                 <artifactId>maven-jar-plugin</artifactId>  
          176                 <configuration>  
          177                     <archive>  
          178                         <manifest>  
          179                             <addClasspath>true</addClasspath>  
          180                             <classpathPrefix>lib/</classpathPrefix>  
          181                             <mainClass>theMainClass</mainClass>  
          182                         </manifest>  
          183                     </archive>  
          184                 </configuration>  
          185             </plugin>  
          186             <!-- 把resources文件夾下面的文件拷貝到jmeter/html目錄下 -->  
          187             <plugin>  
          188                 <artifactId>maven-resources-plugin</artifactId>  
          189                 <executions>  
          190                     <execution>  
          191                         <id>copy-resources-html</id>  
          192                         <phase>compile</phase>  
          193                         <goals>  
          194                             <goal>copy-resources</goal>  
          195                         </goals>  
          196                         <configuration>  
          197                             <!-- test可以在環境變量中定義,也可以將下面寫成絕對地址 -->  
          198                             <outputDirectory>${project.build.directory}/jmeter/html</outputDirectory>  
          199                             <resources>  
          200                                 <resource>  
          201                                     <!-- basedir標識所有工程 -->  
          202                                     <directory>${basedir}/src/test/resources</directory>  
          203                                     <filtering>true</filtering>  
          204                                 </resource>  
          205                             </resources>  
          206                         </configuration>  
          207                     </execution>  
          208                 </executions>  
          209             </plugin>  
          210             <!-- 把resources文件夾下面的文件拷貝到jmeter/lib/ext目錄下 -->  
          211             <plugin>  
          212                 <artifactId>maven-resources-plugin</artifactId>  
          213                 <executions>  
          214                     <execution>  
          215                         <id>copy-resources-lib</id>  
          216                         <phase>compile</phase>  
          217                         <goals>  
          218                             <goal>copy-resources</goal>  
          219                         </goals>  
          220                         <configuration>  
          221                             <!-- test可以在環境變量中定義,也可以將下面寫成絕對地址 -->  
          222                             <outputDirectory>${project.build.directory}/jmeter/lib/ext</outputDirectory>  
          223                             <resources>  
          224                                 <resource>  
          225                                     <!-- basedir標識所有工程 -->  
          226                                     <directory>${basedir}/src/test/lib</directory>  
          227                                     <filtering>false</filtering>  
          228                                 </resource>  
          229                             </resources>  
          230                         </configuration>  
          231                     </execution>  
          232                 </executions>  
          233             </plugin>  
          234   
          235         </plugins>  
          236         <defaultGoal>clean</defaultGoal>  
          237     </build>  
          238 </project>  

          Maven配置說明:

          jmeter.result.jtl.dir:生成.jtl格式的測試報告路徑

          jmeter.result.html.dir:生成.html格式的測試報告路徑

          jmeter-maven-plugin:jmeter執行jmx腳本核心插件

          jmeterExtensions:配置jmeter擴展依賴包

          kg.apc:jmeter-plugins-json:2.6:jmeter用來做json數據斷言用的插件

          testFilesDirectory:指定jmx文件夾

          testFilesIncluded:指定可執行測試腳本

          testFilesExcluded:指定不可執行測試腳本

          13.7、插件安裝

          需要安裝的插件:HTML Publisher plugin、Groovy Label Assignment plugin。

          因為Jenkins安全默認把如下功能都關閉了,需要 Groovy 插件執行 Groovy 腳本開啟:

          1、javascript
          2、html上的內置插件
          3、內置css或從其它網站的css
          4、從其它網站的圖片
          5、AJAX

          構建配置時,填寫如下Groovy腳本,每次構建后執行這段腳本開啟如上功能:

          System.setProperty("hudson.model.DirectoryBrowserSupport.CSP", "")。

          13.8、Jenkins構建任務

          1)構建一個maven項目。

          2)在General模塊中勾選“Groovy script to restrict where this project can be run”,并在“Groovy Script”中輸入上述的代碼。

          3)源碼管理

          4)構建配置

          5)構建后操作

          十四、git相關知識

          14.1、創建版本庫

          首先需要創建一個版本庫,用于存儲該項目本身及其歷史。為此,我們需要在該項目目錄中使用init命令。對于一個帶版本庫的項目目錄,我們通常稱之為工作區:

          >cd d:/projects/first-steps

          >git init

          Init命令會在上述目錄中創建一個名為.git的隱藏目錄,并在其中創建一個版本庫。

          接下來,我們需要將foo.txt和bar.txt這兩個文件添加到版本庫中去。第一步,我們要先用add命令來確定哪些文件應被包含在下次提交中。第二步,再用commit命令將修改傳送到版本庫中:

          >git add bar.txt foo.txt

          >git commit --meaasge “Sample project imported”

          如果我們對工作區中的文件進行了修改,status命令會顯示出該項目自上次提交以來所發生的所有修改:

          >git status

          如果我們還想看到更多細節性的內容,也可以通過diff命令來顯示其每個被修改的行:

          >git diff foo.txt

          所有的修改都必須要先被歸檔成一次新的提交。我們要對修改過的文件和新文件執行add命令,并對要刪除的文件使用rm命令:

          >git add foo.txt bar.html

          >git rm bar.txt

          現在再次調用status命令,我們會看到所有的修改已經被納入了下一次提交中:

          >git status

          然后用commit命令提交這些修改:

          >git commit –message “Some changes”

          log命令可用來顯示項目的歷史,所有的提交都會按時間順序被降序排列出來:

          >git log

          在Git中,每個開發者擁有的是一個屬于他/她自己的、自帶獨立版本庫的工作區,因此這已經是一個不依賴于中央服務器的、完整的版本控制系統了。開發者們可以通過交換各自版本庫中的提交來實現項目合作。

          14.2、克隆版本庫

          新開發者首先要有一個屬于他/她自己的版本庫副本(也稱為克隆體)。該副本中包含了所有的原始信息與整個項目的歷史信息。下面,我們用clone命令來創建一個克隆體:

          >git clone d:/projects/first-steps d:/projects/first-steps-clone

          現在的項目結構為:

          現在我們來修改一下first-steps/foo.txt文件,并執行以下操作來創建一次新提交:

          > cd d:/projects/first-steps

          > git add foo.txt

          > git commit --message "A change in the original."

          現在,新的提交已經被存入了我們原來的first-steps版本庫中,但其克隆版本庫(first-stepsclone)中依然缺失這次提交。我們再來修改克隆版本庫中的first-steps-clone/bar.html文件,并執行以下操作:

          > cd d:/projects/first-steps-clone

          > git add bar.html

          > git commit --message "A change in the clone."

          現在,我們在兩個版本庫中各做了一次新的提交。接下來,我們要用pull命令將原版本庫中的新提交傳遞給它的克隆體。由于之前我們在創建克隆版本庫時,原版本庫的路徑就已經被存儲在了它的克隆體中,因此pull命令知道該從哪里去取回新的提交。

          > cd d:/projects/first-steps-clone

          > git pull

          pull命令從原版本庫中取回了新的修改,將它們與克隆體中的本地修改進行了對比,并在工作區中合并了兩邊的修改,創建了一次新的提交。這個過程就是所謂的合并(merge)

          在拉回(pull)、合并(merge)的過程完成之后,我們可以用一個新的log命令來查看結果:

          > git log --graph

          在沒有參數的情況下,pull命令只在克隆版本庫中能發揮作用,因為只有該克隆體中有默認的原版本庫的連接。當我們執行pull操作時,也可以用參數來指定任意版本庫的路徑,以便從某一特定開發分支中提取相關修改。下面的指令能讓我們將克隆體中的修改pull到原版本庫中:

          > cd /projects/first-steps #切換到原版本庫

          > git pull /projects/first-steps-clone master #將克隆體中的修改pull到原版本中

          14.3、分支

          在一個Git版本庫中,總是唯一存在著一個活動分支。我們可以用branch命令(不帶選項)來列出當前所有的分支。其中用星號(*)凸顯的就是當前的活躍分支:

          > git branch

          a-branch

          * master

          still-a-branch

          一般情況下,活動分支將會被繼續用于接受所有新的提交,并將分支指針移動至最近的那次提交。當然,我們也可以用checkout命令來改變當前的活躍分支:

          > git checkout a-branch

          下面,我們來創建一個新的分支

          1)為當前提交創建分支:

          >git branch a-branch

          2)切換到新分支:

          >git checkout a-branch

          快捷方式,創建并切換分支:

          >git checkout -b a-branch

          通常情況下,我們可以用checkout命令在分支之間來回切換。但是,如果這時候工作區還存在著一些修改,我們就必須要先決定好如何處理這部分修改。

          我們可以通過branch -d命令來刪除分支:

          1)刪除一個已被終止的分支:

          >git branch -d a-branch

          2)刪除一個打開的分支:

          如果我們在試圖刪除一個分支時自己還未轉移到不同的分支(例如master分支)上,Git就會給出一個警告,并拒絕該刪除操作。如果你堅持要刪除該分支的話,就需要在命令中使用-D選項:

          > git brach -D a-branch

          14.4、合并分支

          使用merge命令來進行分支合并是Git中最重要的操作之一。我們可以通過指定分支名稱來選擇待合并修改的分支。然后,Git會基于合并的內容來創建一次新的提交。

          git merge命令用于合并指定分支到當前分支:

          >git checkout test # 切換到test分支

          >git merge dev # 將dev分支合并到test分支

          14.5、創建標簽

          1)創建一個普通的標簽

          在下面的例子中,我們會為master分支上的當前版本創建一個名為1.2.3.4的標簽,并將其注釋為“Freshly built.”:

          > git tag 1.2.3.4 master -m "Freshly built."

          2)推送某單一標簽

          推送操作通常不會自動傳送標簽。但如果我們明確指定了某個標簽名,該標簽就可以被傳送了:

          > git push origin V1.0.0

          3)將標簽傳送到指定的分支(test)上:

          >git push origin test V1.0.0

          14.6、git常用命令

          1、遠程倉庫相關命令

          檢出倉庫:$ git clone git://github.com/jquery/jquery.git
          查看遠程倉庫:$ git remote -v
          添加遠程倉庫:$ git remote add [name] [url]
          刪除遠程倉庫:$ git remote rm [name]
          修改遠程倉庫:$ git remote set -url --push [name] [newUrl]
          拉取遠程倉庫:$ git pull [remoteName] [localBranchName]
          推送遠程倉庫:$ git push [remoteName] [localBranchName]

          如果想把本地的某個分支test提交到遠程倉庫,并作為遠程倉庫的master分支,或者作為另外一個名叫test的分支,如下:

          $git push origin test:master // 提交本地test分支作為遠程的master分支
          $git push origin test:test // 提交本地test分支作為遠程的test分支

          2、分支(branch)操作相關命令

          查看本地分支:$ git branch

          查看遠程分支:$ git branch -r

          創建本地分支:$ git branch [name] ----注意新分支創建后不會自動切換為當前分支

          切換分支:$ git checkout [name]

          創建新分支并立即切換到新分支:$ git checkout -b [name]

          刪除分支:$ git branch -d [name] ---- -d選項只能刪除已經參與了合并的分支,對于未有合并的分支是無法刪除的。如果想強制刪除一個分支,可以使用-D選項:$git branch -D [name]

          合并分支:$ git merge [name] ----將名稱為[name]的分支與當前分支合并

          創建遠程分支(本地分支push到遠程):$ git push origin [name]

          3、版本(tag)操作相關命令

          查看版本:$ git tag

          創建版本:$ git tag [name]

          刪除版本:$ git tag -d [name]

          查看遠程版本:$ git tag -r

          合并遠程倉庫的tag到本地:$ git pull origin --tags

          上傳本地tag到遠程倉庫:$ git push origin --tags

          創建帶注釋的tag:$ git tag -a [name] -m 'yourMessage'

          對指定的commit ID創建版本:$ git tag -a [name] [commit ID] -m ‘yourMessage’

          查看版本的詳細信息:$ git show [name]

          4、其它命令

          改變文件名字:$ git mv old-filename new-filename

          刪除文件:$ git rm filename

          查看本地目錄和暫存區之間文件的差異:$ git diff filename

          查看暫存區和本地倉庫之間文件的差異:$ git diff --cached filename

          查看提交日志:$ git log、$ git log --oneline、$ git log -n

          本地文件誤操作回退:

          使用暫存區內容覆蓋本地目錄:$ git checkout filename

          本地文件提交至暫存區后的回退操作:

          1)本地倉庫覆蓋暫存區:$ git reset HEAD filename

          2)暫存區覆蓋本地目錄:$ git checkout -- filename

          多次提交后會回退到某個版本:

          $ git log --oneline #查看版本號

          $ git reset --hard <版本號> #回退到指定的版本號

          十五、分支管理模式

          15.1、開發階段

          1) 除了master分支創建一個供所有開發人員開發的dev分支;

          2) 開發人員在dev分支上進行工作,隨時隨地commit,每天push一次到服務器;

          3) push代碼前需要進行pull操作,因為有可能在之前有別的成員先進行了push操作,如果有沖突還需要進行沖突解決;

          4) 每天上班后所有成員對dev進行pull操作,獲取所有成員push的代碼,有沖突需要解決;

          5) 團隊Leader每天將dev合并一次到master

          15.2、測試階段

          1) 測試進入后就需要添加test分支;

          2) 在開發人員將代碼pushdev分支后,可以在dev基礎上創建test分支,測試人員以test分支搭建測試環境,開始測試;

          3) 開發人員在接收到bug后,直接在測試分支上修改,然后讓測試人員進行驗證;

          4) 每天團隊Leader將測試分支上修改的bug合并到dev分支上,這樣所有團隊成員當天修復的bug都會在第二天被團隊其他人pull下來;

          5) 團隊Leader每天將dev合并一次到master

          15.3、上線階段

          1) 系統上線后試運行階段會存在兩種改動:bug和優化需求,bug通常當天解決晚上部署,優化需求通常周末部署;

          2) bug當天能修復的就直接在test分支上修復,然后進行測試,驗證通過后合并到master

          3) bug當天不能修復的就針對該bug創建一個分支,修復完后合并到test分支進行測試,驗證通過后合并到master

          4) 每個優化需求都以master分支為基礎創建一個feature分支,完成后合并到dev分支,開發人員可以先交叉測試,然后將dev合并到test進行測試,驗證通過后合并到master

          5) master始終是一個干凈的,可發布的分支。

          15.4、merge request模式

          1) 需求或是Bug都是用Issue來表示;

          2) 雖然Issue不支持多層級,但結合里程碑、標簽等還是可以很好的對任務和Bug進行管理;

          3) 管理員和團隊成員都可以進行Issue的創建;

          4) 任務的接收者對Issue創建Merge Request

          5) 完成任務后推送代碼到Merge Request對應的分支;

          6) 管理員對代碼進行Merge

          15.5、merge request工作流程

          1)設置重要分支受保護

          2)創建issue

          3)任務創建后,開發人員就可以根據該任務創建Merge Request

          ------------------------------

          初始化版本庫,并提交到遠程服務器端

          mkdir WebApp

          cd WebApp

          git init本地初始化

          touch README

          git add README添加文件

          git commit -m 'first commit'

          git remote add origin git@github.com:daixu/WebApp.git增加一個遠程服務器端

          上面的命令會增加URL地址為'git@github.com:daixu/WebApp.git',名稱為origin的遠程服務器庫,以后提交代碼的時候只需要使用origin別名即可。



          原文地址:https://www.cnblogs.com/gltou/p/15329634.html

          、為什么用命令行模式

          使用GUI方式啟動jmeter,運行線程較多的測試時,會造成內存和CPU的大量消耗,導致客戶機卡死;

          所以一般采用的方式是在GUI模式下調整測試腳本,再用命令行模式執行;

          命令行方式支持在多個環境下使用,windosw的dos環境下,也可以在linux環境上執行。

          注意:使用命令執行jmeter腳本必須使用jmeter 3.0及以上版本

          2、怎么用

          2.1、執行命令

          jmeter -n -t <testplan filename> -l <listener filename>
          
          示例: jmeter -n -t testplan.jmx -l test.jtl
          
          示例含義:表示以命令行模式運行testplan.jmx文件,輸出的日志文件為test.jtl

          2.2、參數介紹

          Jmeter官方手冊給的介紹如下:

          -h, –help -> prints usage information and exit
          -n, –nongui -> run JMeter in nongui mode
          -t, –testfile <argument> -> the jmeter test(.jmx) file to run
          -l, –logfile <argument> -> the file to log samples to
          -r, –runremote -> Start remote servers (as defined in remote_hosts)
          -H, –proxyHost <argument> -> Set a proxy server for JMeter to use
          -P, –proxyPort <argument> -> Set proxy server port for JMeter to use

          中文釋義:

          -h 幫助 -> 打印出有用的信息并退出
          
          -n 非 GUI 模式 -> 在非 GUI 模式下運行 JMeter
          
          -t 測試文件 -> 要運行的 JMeter 測試腳本文件
          
          -l 日志文件 -> 記錄結果的文件
          

          -R 遠程執行 -> 遠程執行機的IP(ip地址)如果有多個ip時,使用-R 192.168.2.170,192.168.2.171(分布式使用)

          -r 遠程執行 -> 在Jmter.properties文件中指定的所有遠程服務器(分布式使用)
          
          -H 代理主機 -> 設置 JMeter 使用的代理主機
          
          -P 代理端口 -> 設置 JMeter 使用的代理主機的端口號

          2.3、執行過程

          命令:jmeter -n -t C:\Users\yzs\Desktop\Unione_performance.jmx -l report-result.jtl

          不在jmeter安卓目錄執行腳本的前提是配置了jmeter的環境變量。

          2.4、報告查看

          上述的命令有測試結果保存到D:\report中,在GUI模式下查看測試報告:

          1、在測試計劃下,添加對應的測試報告元件,舉例增加了:查看結果樹、聚合報告

          2、在“所有數據寫入一個文件”,選擇加載對應的結果文件

          3、下面就會有對應的表格展示,具體見下圖

          2.5、命令行傳遞變量值

          設置線程組的線程數和循環次數。

          注意格式:

          ${__P(threadNum)}

          ${__P(threadCount)}

          其中P前面是兩個下劃線,()內就是變量名

          執行時,在命令行中用-J參數給變量賦值即可:

          jmeter -n -t C:\Users\yzs\Desktop\Unione_performance.jmx -J threadNum=10 -J threadCount=2 -l report-result.jtl

          此次測試相當于:10個線程,循環2次,共計20個請求。

          3、生成HTML報告

          生成HTML報告有2種方式,一種是直接在命令行加上-o參數,另一種是已有jtl結果文件,運行命令生成報告

          3.1、命令行直接生成報告

          jmeter -n -t 【Jmx腳本位置】-l 【中間文件result.jtl位置】-e -o 【報告指定文件夾】
          -e:測試結束后,生成測試報告
          -o:指定測試報告的存放位置

          注意:-o后面跟的文件夾一定是不存在的或者是空文件夾

          3.2、已有jtl結果文件,運行命令生成報告

          jmeter -g【已經存在的.jtl文件的路徑】-o 【用于存放html報告的目錄】

          注意:經實操,windows系統上,以上2種方法都可以生成HTML測試報告,但是在Linux系統上第1種方法,沒有生成報告,只有第二種方法才可以(具體原因后面在慢慢找吧)

          3.3、HTML報告注解

          用瀏覽器打開index.html

          報告詳解

          Dashboard:(重點查看)
          Test and Report informations:指的是測試和報告信息

          • File:測試結果的保存文件名稱
          • Start Time:測試開始時間
          • End Time:測試結束時間
          • Filter for display展示過濾器

          APDEX(Application Performance Index):應用程序性能滿意度的標準

          其中,

          • “Apdex”范圍在0-1之間,1表示達到所有用戶均滿意,越接近1滿意度越高
          • “toleration threshold”:耐受閾值(0.5秒)
          • “frustration threshold”:挫敗閾值(1.5秒)

          Requests Summary:請求的通過率(OK)與失敗率(KO),百分比顯示

          Statistics:數據分析,基本將Summary Report和Aggrerate Report的結果合并(平均響應時間、TPS在此查看)

          Errors:錯誤情況,依據不同的錯誤類型,將所有錯誤結果展示

          關于Apdex的補充:

          性能指數,Apdex(Application Performance Index)是一個國際通用標準,Apdex 是用戶對應用性能滿意度的量化值。它提供了一個統一的測量和報告用戶體驗的方法,把最終用戶的體驗和應用性能作為一個完整的指標進行統一度量。下圖表示為通用用戶滿意度區域,0代表沒有滿意用戶,1則代表所有用戶都滿意。實際業務系統開發過程中,1是團隊的追求目標。

          若所有請求的Apdex值都接近1,說明用戶滿意度優秀,也從側面說明了服務器響應速度快。
          通常而言,
          最低要求超過0.5,當然項目組可設定具體需求。

          Charts:(輔助分析)

          主要有如下特點:
          (1)將測試過程中經常使用的數據,用圖表的形式展示,讓測試結果更加直觀
          (2)每個圖表數據,有兩種展示形式
          (3)支持請求樣例過濾顯示
          (4)支持導出PNG圖片格式

          Over Time Charts

          • Response Times Over Time:每秒鐘響應時間,X軸表示的是系統運行的時刻,Y軸表示的是響應時間,F(X,Y)表示系統隨著時間的推移,系統的響應時間的變化,可以看出響應時間穩定性
          • Bytes Throughput Over Time:字節接收與發送的數量,每秒傳輸字節吞吐量,表明Jmeter在測試時,隨著時間推移發送和接收的字節數
          • Latencies Over Time:延遲時間

          Throughput Charts

          • Hits Per Second: 每秒點擊率
          • Codes Per Second:每秒狀態碼數量
          • Transactions Per Second:每秒事務量
          • Response Time Vs Request:響應時間點請求的成功與失敗數
          • Latency Vs Request:延遲時間點請求的成功與失敗數

          Response Times Charts

          • Response Time Percentiles:響應時間百分比
          • Active Threads Over Time:激活線程數
          • Time Vs Threads:響應時間用戶數, X軸表示的是活動線程數,也就是并發訪問的用戶數,Y軸表示的是響應時間,F(X,Y)表示在某種并發量的情況下,系統的響應時間是多少
          • Response Time Distribution:響應時間分布

          3.4、HTML報告的自定義配置

          JMeter3.0開始在bin目錄新增了reportgenerator.properties文件保存了所有關于圖形化HTML報告生成模塊的默認配置,要變更配置,建議不要直接編輯該文件,而是推薦在user.properties中去配置和覆蓋。

          3.4.1總體配置

          總體配置都是以jmeter.reportgenerator.為前綴,如:jmeter.reportgenerator.overall_granularity=60000

          • overall_granularity:定義采樣點粒度,默認為60000ms,通常在穩定性以外的測試中,我們可能需要定義更細的粒度,比如1000ms,我們可以在user.properties文件末尾添加如下配置
          # Change this parameter if you want to change the granularity of over time graphs.
          jmeter.reportgenerator.overall_granularity=6000
          • report_title:定義報告的標題,我們可能需要將標題定義為實際測試項名稱
          • apdex_satisfied_threshold:定義Apdex評估中滿意的閾值(單位ms)
          • apdex_tolerated_threshold: 定義Apdex評估中可容忍的閾值

          Apdext = (Satisfied Count + Tolerating Count / 2) / Total Samples


          另外,在jmeter.properties中,有關于集合報告中的三個百分位的默認值:

          aggregate_rpt_pct1 : Defaults to 50
          aggregate_rpt_pct2 : Defaults to 70
          aggregate_rpt_pct3 : Defaults to 99

          3.5、HTML報告的定制

          JMeter的HTML報告生成時是使用了固定的模板,模板文件路徑為./bin/report-template。
          進入該目錄可以看到報告的每個頁面都有一個.fmkr模板文件,包括index.html.fmkr和./content/pages路徑下的幾個文件。通過查看這些模板文件,就可以知道怎樣去進行報告的輕度定制,比如將一些文本修改得更易懂,或者修改為中文等

          頁面的title
          默認為"Apache JMeter Dashboard"
          可以由reportgenerator.properties中的jmeter.reportgenerator.report_title來統一定義,這種方式就是所有頁面的title都使用同一個。
          也可以直接修改對應的.fmkr文件中的title標簽中雙引號內的值,如<title>${reportTitle!"想要設置的title"}</title>,這中方式可以為每個頁面單獨定義title
          圖表的名稱
          當前版本下,各圖表的名稱是直接在模板文件中定義,要修改也是直接修改模板文件中對應元素的值即可
          如要修改Transactions Per Second圖表的名稱,可以直接在./content/pages/Throughput.html.fmkr文件中修改,效果如下圖

          、搭建環境準備文件

          JDK:jdk1.8.0_231

          Ant:apache-ant-1.10.7

          Jmeter: apache-jmeter-5.2.1

          Jenkins: jenkins-2.70

          二、安裝相關包

          1.安裝jdk

          ① 使用xshell連接服務器

          ②在linux進入/opt目錄,使用 mkdir java 創建一個java目錄

          ③ 通過xftp把jdk安裝包放進java目錄

          ④cd到java目錄,解壓jdk安裝包: tar -zxvf jdk-8u231-linux-x64.tar.gz

          ⑤ vi /ect/profile 用i編輯,在最下面加入環境變量:

          export JAVA_HOME=/opt/java/jdk1.8.0_231 #注:這個是jdk路徑

          export JRE_HOME=${JAVA_HOME}/jre

          export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH

          export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin

          export PATH=$PATH:${JAVA_PATH}

          ⑥加入后ECS,再 :wq! 保存即可

          ⑦保存完后,使用 source /etc/profile 命令使得配置生效

          ⑧驗證環境變量是否生效,cd到~ 輸入javac 或是 java -version 不會出現command not found錯誤即安裝成功

          2.安裝jmeter

          Jmeter是需要有jdk環境才可以正常運行,上面已經按照好jdk環境了。接下來jmeter就比較簡單。通過xftp先把jmeter、Ant、Jenkins、Tomcat8等都直接放到linux的 /opt 目錄下。

          ①解壓jmeter的文件:

          unzip apache-jmeter-5.2.1.zip (如果顯示無unzip命令,則執行安裝:yum -y install unzip)

          ② vi /ect/profile 用i編輯,在最下面加入環境變量:(參考jdk操作)

          export JMETER_HOME=/opt/apache-jmeter-5.2.1

          export CLASSPATH=$JMETER_HOME/lib/ext/ApacheJMeter_core.jar:$JMETER_HOME/lib/jorphan.jar:$CLASSPATH

          export PATH=$JMETER_HOME/bin:$PATH:$HOME/bin

          ③使用 source /etc/profile 命令使得配置生效

          ④驗證是否安裝成功: 切換到cd / 輸入指令 jmeter -v

          顯示如下則安裝成功:

          3.安裝ant

          ① 解壓ant : unzip apache-ant-1.10.7-bin.zip

          ②配置環境變量:vi /etc/profile

          在最后一行加入:(命令G 跳到最后一行)

          export ANT_HOME=/opt/apache-ant-1.10.7

          export PATH=$ANT_HOME/bin:$PATH

          重啟配置: source /etc/profile

          ③驗證安裝是否成功切換到其他目錄 指令 ant -version

          4.安裝tomcat

          tomcat是需要有jdk環境才可以正常運行。

          ① 解壓unzip apache-tomcat-8.5.49.zip

          ②cd /opt/apache-tomcat-8.5.49/bin

          進入bin目錄后 ./startup.sh 運行(若報錯: -bash: ./startup.sh: Permission denied 說明權限不夠,如果你是root賬號,直接執行指令: chmod u+x *.sh 賦予權限即可)

          tomcat默認端可是8080

          啟動成功后,可以在瀏覽器打開(ip地址是linux的ip地址http://192.168.1.130:8080)

          (打不開的話,請嘗試關閉Linux防火墻)

          關閉防火墻 systemctl stop firewalld.service

          開啟防火墻 systemctl start firewalld.service

          禁止防火墻開機啟動 systemctl disable firewalld.service

          查看默認防火墻狀態 firewall-cmd --state

          ③關閉 ./shutdown.sh 關閉后即不可訪問,先關閉,等配置好Jenkins后再重啟

          三、配置環境

          1.Tomcat配置Jenkins

          ①將Jenkins.war 復制到tomcat的webapp目錄下后啟動tomcat :

          cd /opt

          cp jenkins.war apache-tomcat-8.5.49/webapps/

          cd /opt/apache-tomcat-8.5.49/bin/

          ./startup.sh

          ②瀏覽器輸入: http://192.168.1.130:8080/jenkins 打開jenkins頁面: (地址為你服務器的地址)

          根據指引操作:

          cat /root/.jenkins/secrets/initialAdminPassword

          復制密碼粘貼進去

          選擇推薦插件即可:

          然后進入安裝頁面:(安裝需要些時間)

          安裝完成后: (可以選擇使用admin帳戶繼續)

          Admin默認密碼就是 :cat /root/.jenkins/secrets/initialAdminPassword

          可以先跳過URL配置,登錄好后頁面:

          2.Ant配置Jmeter

          ①為了方便管理,在Jmeter主目錄下創建一個report文件夾

          cd /opt/apache-jmeter-5.2.1

          mkdir report

          ②進入report目錄創建 cd report/

          ③ 創建3個文件夾 分別為jtl、html(存放測試報告目錄)、run(存放測試腳本目錄)

          mkdir jtl html run

          ④ 把jmeter目錄下的extras目錄下的ant-jmeter-1.1.1.jar文件復制到ant目錄下的lib文件夾中

          cp /opt/apache-jmeter-5.2.1/extras/ant-jmeter-1.1.1.jar /opt/apache-ant-1.10.7/lib

          ⑤ 配置ant的編譯文件 build.xml

          將編譯好的build.xml放置Jmeter目錄的report目錄下

          代碼如下:請看備注進行修改

          <?xml version="1.0" encoding="UTF-8"?>

          <project name="ant-jmeter-test" default="run" basedir=".">

          <tstamp>

          <format property="time" pattern="yyyyMMddhhmm" />

          </tstamp>

          <!-- 需要改成自己本地的 Jmeter 目錄-->

          <property name="jmeter.home" value="/opt/apache-jmeter-5.2.1" />

          <!-- 發送給哪些人-->

          <property name="mail_to" value="xxxx@163.com"/>

          <!-- 抄送給哪些人,多個用逗號隔開/-->

          <!--property name="mail_cc" value="++++1@163.com,++++2@163.com"/-->

          <property name="report.title" value="接口測試報告"/>

          <!-- jmeter生成jtl格式的結果報告的路徑-->

          <property name="jmeter.result.jtl.dir" value="/opt/apache-jmeter-5.2.1/report/jtl/" />

          <!-- jmeter生成html格式的結果報告的路徑-->

          <property name="jmeter.result.html.dir" value="/opt/apache-jmeter-5.2.1/report/html/" />

          <!-- 生成的報告的前綴-->

          <property name="ReportName" value="TestReport" />

          <property name="jmeter.result.jtlName" value="${jmeter.result.jtl.dir}/${ReportName}${time}.jtl" />

          <property name="jmeter.result.htmlName" value="${jmeter.result.html.dir}/${ReportName}${time}.html" />

          <!--定義次build.xml要執行全部的任務-->

          <target name="run">

          <antcall target="test" />

          <antcall target="report" />

          <antcall target="mail" />

          </target>

          <!--第一個任務,執行test-->

          <target name="test">

          <taskdef name="jmeter" classname="org.programmerplanet.ant.taskdefs.jmeter.JMeterTask" />

          <jmeter jmeterhome="${jmeter.home}" resultlog="${jmeter.result.jtlName}">

          <!-- 聲明要運行的腳本。"*.jmx"指包含此目錄下的所有jmeter腳本-->

          <testplans dir="/opt/apache-jmeter-5.2.1/report/run/" includes="*.jmx" />

          <property name="jmeter.save.saveservice.output_format" value="xml"/>

          </jmeter>

          </target>

          <!--引入外部jar包-->

          <path id="xslt.classpath">

          <fileset dir="${jmeter.home}/lib" includes="xalan*.jar"/>

          <fileset dir="${jmeter.home}/lib" includes="serializer*.jar"/>

          </path>

          <!--執行第二個任務,生成報告-->

          <target name="report">

          <tstamp><format property="report.datestamp" pattern="yyyy/MM/dd HH:mm"/></tstamp>

          <xslt

          classpathref="xslt.classpath"

          force="true"

          in="${jmeter.result.jtlName}"

          out="${jmeter.result.htmlName}"

          style="${jmeter.home}/extras/jmeter-results-report_21.xsl">

          <param name="dateReport" expression="${report.datestamp}"/>

          </xslt>

          <!-- 因為上面生成報告的時候,不會將相關的圖片也一起拷貝至目標目錄,所以,需要手動拷貝 -->

          <copy todir="${jmeter.result.html.dir}">

          <fileset dir="${jmeter.home}/extras">

          <include name="collapse.png" />

          <include name="expand.png" />

          </fileset>

          </copy>

          </target>

          <!--將控制臺輸出到文本中-->

          <record name="${jmeter.result.html.dir}/${ReportName}${time}.txt" loglevel="info" append="no" action="start"/>


          <!--執行第三個任務,發送郵件-->

          <target name="mail">

          <!--讀取輸出的控制臺日志文件并寫入郵件正文-->

          <loadfile property="email_content" srcFile="${jmeter.result.html.dir}/${ReportName}${time}.txt" encoding="UTF-8"/>

          <loadfile property="output" srcFile="${jmeter.result.html.dir}/${ReportName}${time}.html" encoding="UTF-8"/>

          <!-- 此處配置SMTP服務器 POP3授權碼 發送郵箱地址 端口 發送郵箱主題-->

          <mail tolist="${mail_to}" mailhost="smtp.163.com" mailport="465"

          user="jxxx@163.com" password="jxxx7" ssl="true" subject="jmeter 測試報告 ${ReportName}${time}"

          messagemimetype="text/html">

          <from address="jxxxr@163.com" />

          <fileset dir="${jmeter.result.html.dir}">

          <include name="${ReportName}${time}.html"/>

          </fileset>

          <message>

          這是用Ant自動發送的測試報告

          ${ReportName}${time}

          ${output}

          </message>

          </mail>

          </target>

          </project>

          3.配置jmeter.properties文件

          vi /opt/apache-jmeter-5.2.1/bin/jmeter.properties

          /csv 找到這個位置(改jmeter.save.saveservice.output_format=csv

          為jmeter.save.saveservice.output_format=xml,并去掉前面的注釋符號#)

          修改后 ecs :wq!保存:

          4.配置javax.mail 的jar包支持發送email

          ①下載jar包地址:

          https://javaee.github.io/javamail/#Download_JavaMail_Release

          ②把下載好的jar包上傳到 /opt/apache-ant-1.10.7/lib 就是放到ant的lib目錄下

          5.運行ant

          Ant是可以運行多個腳本,不需要單個腳本一個個運行。

          ①把已經寫好的腳本放進report/run的目錄下

          ②cd /opt/apache-jmeter-5.2.1/report 后直接ant即可

          ③到html查看結果:

          ④用xshell同步到本機打開

          以上Jmeter+Ant已完成,接下來看看配置Jenkins。

          6.Jenkins配置jdk、ant路徑

          進入Global Tool Configuration(全局工具配置)

          ①找打jdk安裝位置:

          Jdk別名隨意取 jdk1.8.0_231

          Jdk路徑找到安裝在linux的路徑 /opt/java/jdk1.8.0_231

          設置完記得應用保存

          ② 找到Ant安裝位置:

          Name 可以隨意取 ant

          ANT_HOME /opt/apache-ant-1.10.7

          設置完記得應用保存

          7.新建Jenkins任務并執行

          ①根據以下圖,填寫后名稱后,選擇后類型后確定

          ②選擇構建觸發器--增加構建步驟 選擇invoke Ant

          ③Ant Version 可以選擇你配置進去的不要用default

          Targets 填寫run

          Build File 填入在linux的build.xml路徑

          填寫完成后應用保存。

          ④ 點擊構建

          可以查看控制臺輸出:

          若遇到([mail] Failed to send email: 554 DT:SPM 163 smtp12,EMCowAAXH_upCepd6CsACg報錯,只需要把build.mxl文件發送人抄送一份給自己)

          以上已完成了最基礎的構建。

          之后再寫Jenkins構建完成或是失敗后的郵件提醒及定時執行功能。

          原文鏈接:https://blog.csdn.net/Static_at/java/article/details/104022516


          主站蜘蛛池模板: 精品一区二区三区在线播放| 无码日韩人妻AV一区免费l| 国产美女一区二区三区| 天堂Aⅴ无码一区二区三区| 国产av一区二区三区日韩| 一本大道在线无码一区| 综合一区自拍亚洲综合图区| 精品人妻一区二区三区四区| 日韩经典精品无码一区| bt7086福利一区国产| 国产精品99无码一区二区| 一区二区免费视频| 精品少妇一区二区三区在线| 无码人妻一区二区三区免费n鬼沢| 亚洲欧美日韩一区二区三区在线| 久久精品国产亚洲一区二区三区| 亚洲老妈激情一区二区三区| 国产精品一区二区在线观看| 中文字幕一区一区三区| 少妇精品久久久一区二区三区 | 亚洲AV无码一区二区三区在线| 国产一区二区三区四| 亚洲av乱码一区二区三区香蕉| 无码人妻精品一区二区三区久久| 国产成人久久一区二区三区| 竹菊影视欧美日韩一区二区三区四区五区| 国产免费无码一区二区| 久久无码人妻精品一区二区三区| 国产视频福利一区| 国产在线一区二区综合免费视频| 国产内射999视频一区| 亚洲A∨精品一区二区三区下载| 怡红院一区二区在线观看| 一区二区三区免费视频观看| 91一区二区三区| 波多野结衣AV一区二区三区中文 | 中文字幕精品一区二区日本| 国产精品揄拍一区二区| 免费一区二区无码视频在线播放 | 亚洲日本va一区二区三区| 精品少妇人妻AV一区二区|