別當工具人了,手摸手教會你 Jenkins !

你們好,我是小菜,一個渴望在互聯網行業作到蔡不菜的小菜。可柔可剛,點贊則柔,白嫖則剛! 死鬼~看完記得給我來個三連哦!java

本文主要介紹 Jenkins

若有須要,能夠參考node

若有幫助,不忘 點贊git

微信公衆號已開啓,小菜良記,沒關注的同窗們記得關注哦!程序員

「唉,天天提交完代碼都得本身打包再部署到測試環境和開發環境,好麻煩啊!都快變成運維了」web

「啊?哦!確實,天天打包部署確實都成爲了工具人了」shell

一段簡白的對話快速的隱滅在辦公室中,卻引起了個人思考,「這麼麻煩的過程確定已經有了很好的解決方案,畢竟程序員是面向懶惰編程,本身對 Jenkins 這個工具備所耳聞已經好久了,看來今天得對它下手了」數據庫

說幹就幹,今天我們就來求索一下 JenKins,看完你不妨也給大家項目整一個,給本身多增長點划水的時間!apache

讀前須知: 本文較長,從安裝到使用,一步步帶你超神!

微信公衆號關注: [ 小菜良記 ] ,帶你領略技術風騷!編程

1、Jenkins 是什麼

Jenkins是一個 開源軟件項目,是基於 java開發的一種 持續集成工具,用於監控持續重複的工做,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。

簡單來講,它就是一個 持續集成 的工具!json

1. 持續集成

持續集成(Continuous Integration),簡稱 CI。頻繁地將代碼集成到主幹以前,必須經過自動化測試,只要有一個測試用例失敗,就不能集成。經過持續集成,團隊能夠快速從一個功能到另一個功能。

好處:

  • 下降風險,因爲持續集成不斷去構建,編譯和測試,能夠很早發現問題
  • 減小重複性的工做
  • 持續部署,提供可部署單元包
  • 持續交付可供使用的版本

2. Jenkins 持續集成

咱們先經過這張圖來看到 Jenkins 在其中起到的做用:

  • 首先,開發人員將代碼提交到 Git 倉庫
  • 而後 Jenkins 使用 Git 插件來拉取 Git 倉庫的代碼,而後配合 JDK、Maven 等軟件完成代碼編譯,測試、審查、、測試和打包等工做
  • 最後 Jenkins 將生成的 jar/war 推送到 測試/生產 服務器 ,供用戶訪問

整套步驟下來,做爲開發人員咱們只須要提交下代碼,剩下的工做都交給了 Jenkins ,真是美滋滋,怎麼沒有早點上這個工具的車!

2、Jenkins 安裝

磨刀不誤砍柴工,沒刀的狀況下說再多都是虛的。咱們就先來看下 Jenkins 是如何安裝的吧!

1. 安裝JDK

由於 Jenkinsjava 寫的,因此要運行起來必需要配置 java 運行環境。這裏就不贅訴 JDK 的安裝過程了

2. 下載安裝 Jenkins

  • 下載

咱們能夠進入下載頁面選擇咱們要安裝的版本:下載地址, 咱們這裏使用的版本是 :jenkins-2.190.3-1.1.noarch.rpm

  • 安裝

而後把下載好的 rpm 包上傳到咱們的服務器,經過 rpm -ivh jenkins-2.190.3-1.1.noarch.rpm 進行安裝,而後編輯 etc 目錄下的 jenkins 配置文件:vim /etc/sysconfig/jenkins,須要改的地方以下(也能夠選擇不改):

 JENKINS_USER="root"
 JENKINS_PORT="8888"

  • 啓動

systemctl start jenkins

  • 訪問

經過瀏覽器訪問 http://服務器IP:8888/,看到如下頁面說明啓動成功了

而後咱們在服務器上從指定文件中獲取密碼,進行下一步。

這一步咱們能夠先跳過插件安裝,由於Jenkins插件須要鏈接默認官網下載,速度很是慢:

而後咱們添加一個管理員帳號來管理:

看到如下頁面就說明設置成功了:

微信公衆號關注: 小菜良記 ,帶你領略技術風騷!

3、Jenkins 使用

1. 插件加速

工欲善其事,必先利其器

貼心的小菜是不會讓你遭受等待的痛苦的,首先咱們進入 Jenkins -> Manage Jenkins -> Manage Plugins ,點擊 install

而後咱們在安裝 Jenkins 的服務器上進入 /var/lib/jenkins/updates 目錄,能夠看到有個 default.json 文件,第一步:咱們須要替換裏面的部分字段,輸入命令以下:

 sudo sed -i 's#updates.jenkins.io/download/plugins#mirrors.tuna.tsinghua.edu.cn/jenkins/plugins#g' default.json && sudo sed -i 's#www.google.com#www.baidu.com#g' default.json

第二步:咱們進入到 /var/lib/jenkins目錄,編輯 hudson.model.UpdateCenter.xm,將裏面的 https://updates.jenkins.io/update-center.json修改成 http://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json

最後一步: 輸入如下命令進行重啓 Jenkins

 systemctl restart jenkins

經過以上步驟,咱們就能夠愉快的安裝插件了!

2. 用戶管理

Jenkins 中咱們也能夠進行用戶權限管理,這個時候咱們須要藉助插件 Role-based Authorization Strategy

  • 首先安裝 Role-based Authorization Strategy 插件

  • 開啓全局安全配置

將受權策略切換爲 "Role-Based Strategy"

  • 建立用戶

更改完受權策略,咱們就能夠來建立用戶了,進入系統管理頁面中的Manage Users

這裏咱們建立了兩個用戶,分別是 cbuc1cbuc2

  • 建立角色

建立好用戶,咱們就能夠來建立角色了,在系統管理頁面進入 Manage and Assign Roles

角色主要分爲 Global roles(全局角色)Item roles(項目角色)

Global roles(全局角色): 管理員等高級用戶能夠建立基於全局的角色

Item roles(項目角色): 針對某個或者某些項目的角色

咱們系統如今已經存在了兩個用戶,而後咱們就能夠給這兩個用戶綁定對應的角色

3. 憑證管理

什麼是憑證呢? 憑證 能夠用來存儲須要密文保護的數據庫密碼,GitLab 密碼信息,Docker 私有倉庫的登陸密碼。保存了這些信息後,Jenkins 就能夠和這些第三方的應用進行交互。固然,這仍是得藉助 Jenkins 的插件!

1)安裝

首先安裝 Credentials Binding 插件

安裝好插件後,在系統首要的菜單欄中就會多了個 憑證 菜單

點擊進去,咱們能夠看到能夠添加的憑證有 5 種:

  1. Username with password :用戶名和密碼
  2. SSH Username with private key: 使用 SSH 用戶和密鑰
  3. Secret file: 須要保密的文本文件,使用時 Jenkins 會將文件複製到一個臨時目錄中,再將文件路徑設置到一個變量中,等構建結束後,所複製的 Secret file 就會被刪除
  4. Secret text: 須要保存的一個加密的文本串,如釘釘機器人或 GitHubapi token
  5. Certificate: 經過上傳證書文件的方式

咱們平時比較經常使用的類型爲:Username with passwordSSH Username with private key

2)Git 憑證管理

咱們若是要使用 JenkinsGitLab 拉取項目代碼,咱們就得使用憑證來驗證。

  • 安裝 Git 插件

咱們須要在 Jenkins 中安裝 Git插件 來拉取項目代碼

而後咱們在服務器上也須要安裝 Git 工具

 # 安裝命令
 yum install git -y
 # 驗證命令
 git --version

1. 方式1:用戶密碼類型

咱們可使用 用戶密碼 登陸後拉取項目代碼,這個時候咱們須要用到 憑證的 Username with password 類型

建立成功咱們就能夠測試是否可用,咱們先建立一個 FreeStyle 項目

而後在 GitLab 中複製咱們項目的 URL

Credentials 中選擇咱們剛剛建立的憑證,保存配置後,咱們點擊 Build Now 來構建項目:

這個時候在控制檯能夠看到輸出

而後在進入服務器的 /var/lib/jenkins/workspace 目錄中看到咱們拉取的項目:

說明咱們已經成功使用 用戶密碼 憑證模式拉取到 Git項目了

2. 方式2:SSH密鑰類型

除了用帳號密碼方式來驗證 Git ,咱們還能夠用 SSH密鑰 來驗證,步驟流程以下:

從圖上咱們能夠得知,第一步須要生成 公私鑰,咱們在 Jenkins服務器 上輸入如下指令生成:

ssh-keygen -t rsa 輸入指令後,一路回車,即可在 /root/.ssh/ 目錄下生成公私鑰:

  • id_rsa:私鑰文件
  • id_rsa.pub:公鑰文件

而後咱們把生成的公鑰放在 GitLab 中,root帳戶登陸->點擊頭像->Settings->SSH Keys,複製 id_rsa.pub 中的內容,點擊 "Add key"

而後咱們再回到 Jenkins 系統頁面中添加憑證,選擇 SSH Username with private key ,把剛剛生成的私有文件內容複製過來

添加後就會生成一條憑證

建立成功咱們就能夠測試是否可用,咱們先建立一個 FreeStyle 項目

而後在 GitLab 中複製咱們項目的 URL

Credentials 中選擇咱們剛剛建立的憑證,保存配置後,咱們點擊 Build Now 來構建項目:

這個時候在控制檯能夠看到輸出

而後在進入服務器的 /var/lib/jenkins/workspace 目錄中看到咱們拉取的項目:

說明咱們已經成功使用 SSH Username with private key 憑證模式拉取到 Git項目了

4. 項目管理

1)Maven 安裝

咱們如今開發中的項目大部分都是 Maven 項目,使用 Maven 項目,咱們就須要進行 依賴管理,所以咱們應當在服務器上安裝 Maven 來下載項目依賴。

  • 安裝 Maven

咱們能夠從 Maven 官網上下載壓縮包,而後上傳到服務器上進行解壓

tar -xzf apache-maven-3.6.0-bin.tar.gz

  • 配置環境變量

vim /etc/profile

 export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk
 export MAVEN_HOME=/home/maven/apache-maven-3.6.2
 export PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin

編輯後使配置文件生效:

 source /etc/profile

驗證:

 mvn -v

而後設置 Mavensettings.xml

 # 建立本地倉庫目錄
 mkdir /data/localRepo
 vim /home/maven/apache-maven-3.6.2/conf/settings.xml

將本地倉庫改成: /root/repo/

添加阿里雲私服地址:alimaven aliyun maven http://maven.aliyun.com/nexus/content/groups/public/ central

  • Jenkins配置

Jenkins 咱們也須要配置 JDKMaven 的關聯.

進入 Jenkins -> Global Tool Configuration -> JDK

進入 Jenkins -> Global Tool Configuration -> Maven

添加全局變量

進入Manage Jenkins->Configure System->Global Properties,添加三個全局變量

JAVA_HOME、M2_HOME、PATH+EXTRA

而後咱們進入項目中點擊 configure

而後添加 shell 執行腳本:

保存後從新構建,查看控制檯,能夠看到 mvn 構建成功:

2)war 包部署

若是咱們的項目是打成 war 包的形式,那麼咱們須要藉助 tomcat 容器來運行,那麼咱們首先即是要先安裝一個 tomcat

Tomcat 安裝

咱們將事先下載好的 Tomcat 安裝包上傳到服務器上,經過 tar -xzf apache-tomcat-8.5.47.tar.gz 解壓,而後運行 bin目錄下的 start.sh啓動 Tomcat ,看到如下結果則說明啓動成功:

下一步咱們須要配置Tomcat用戶角色權限,默認狀況下Tomcat是沒有配置用戶角色權限的

首先咱們須要修改 tomcat/conf/tomcat-users.xml 文件:

(複製)內容以下:

 <role rolename="tomcat"/>
 <role rolename="role1"/>
 <role rolename="manager-script"/>
 <role rolename="manager-gui"/>
 <role rolename="manager-status"/>
 <role rolename="admin-gui"/>
 <role rolename="admin-script"/>
 <user username="tomcat" password="tomcat" roles="manager-gui,manager-script,tomcat,admin-gui,admin-script"/>

而後修改 /tomcat/webapps/manager/META-INF/context.xml 文件,將如下內容註釋:

而後進入tomcat 頁面,點擊進入:

帳號密碼都是 tomcat

成功頁面以下:

這樣子咱們就完成了 tomcat 的安裝,而後接下來就能夠進行部署了

Tomcat 部署
  • jenkins 中安裝 Deploy to container 插件
  • 添加 Tomcat 憑證

  • 構建配置

在項目的 configure 中配置

而後點擊構建,查看控制檯輸出:

顯示已經部署成功,而後訪問項目頁面,能夠看到 war 包項目部署成功:

3)jar 包部署

上面說完了 war 包項目是如何部署的,可是咱們如今項目用到比較多的仍是 SpringBoot ,這個時候打出來的是 jar 類型,可是 SpringBoot 裏面內置了 tomcat 容器,這樣子咱們就不須要藉助外部 tomcat 容器的使用了。

  • 首先咱們在 Jenkins 中下載 Maven 插件,這個時候新建項目的時候會有個 Maven 項目的選項

而後在項目的 configure 中做以下配置:

Repository URL:庫地址 Credentials:憑證 Branch Specifier (blank for ‘any’):分支

Run only if build succeeds:在構建成功時執行後續步驟 Add post-build step:添加構建後的步驟 Send files or execute commands over SSH:經過ssh發送文件或執行命令
  • 安裝 Publish Over SSH 插件

由於咱們要部署的服務器與 Jenkins 不在同一個服務器上,因此咱們須要這個插件來遠程部署

安裝好插件後咱們須要先配置遠程服務器,在 Jenkins 服務器上輸入 ssh-copy-id 遠程服務器IP 將公鑰拷貝到遠程服務器上,而後在 Jenkins 系統配置中添加服務器信息,以下:

完成以上步驟後,咱們就能夠回到項目的 configure 中添加咱們剛剛配置的服務器信息:

Name:SSH Servers中配置的服務器 Source files:源文件 Remove prefix:刪除前綴 Remote directory:上傳到服務器的目錄 Exec command:執行的腳本

完成以上步驟,咱們就能夠愉快的點擊 Build Now 了!

4)流水線項目

Jenkins 中自動構建項目的類型有不少,經常使用的有如下三種:

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

每種類型的構建其實均可以完成同樣的構建過程與結果,只是在操做方式、靈活度等方面有所區別,其中流水線類型靈活度比較高,其餘兩種類型咱們在上面的例子中都已經嘗試過了,下面咱們就來介紹如何構建流水線項目。

1. 概念

Pipeline 就是一套運行在 Jenkins 上的工做流框架,將原來獨立運行與單個或者多個節點的任務鏈接起來,實現單個任務難以完成的複雜流程編排和可視化工做

2. 優勢
  • 代碼Pipeline 以代碼的形式實現,一般被檢入源代碼控制,使團隊可以編輯,審查和迭代其傳送流程。
  • 持久性: 不管是計劃內的仍是計劃外的服務器重啓,Pipeline 都是可恢復的
  • 可中止: Pipeline 可接收交互式輸入,以肯定是否繼續執行 Pipeline
  • 多功能: Pipeline 支持現實世界中複雜的持續交付要求,它支持 fork/join 、循環執行、並行執行任務的功能
  • 可擴展: Pipeline 插件支持其 DSL 的自定義擴展,以及與其餘插件集成的多個選項
3. 建立

建立 Pipeline 項目以前咱們須要安裝 Pipeline 插件:

而後在建立項目的時候便會多了 Pipeline 類型:

選擇好項目類型以後咱們就能夠在項目中的 configure 進行配置了:

  • 首先老樣子配置好 git 地址,跟上面同樣,這裏很少做贅訴
  • 而後配置 Pipeline 腳本

Pipeline 項目是統一經過 Pipeline 腳原本管理,這樣也更好的提升靈活性

Hello World 模板:

 pipeline {
  agent any
  stages {
  stage('Hello') {
  steps {
  echo 'Hello World'
  }
  }
  }
 }

stages: 表明整個流水線的全部執行階段,一般 stages 只有1個,裏面包含多個 stage

stage: 表明一個階段內須要執行的邏輯,steps 裏面是 shell 腳本,git 拉取代碼,ssh 遠程發佈等任意內容

聲明式 Pipeline 模板:

 pipeline {
  agent any
  stages {
      stage('拉取代碼') {
          steps {
            echo '拉取代碼'
          }
      }
      stage('編譯構建') {
          steps {
            echo '編譯構建'
          }
      }
      stage('項目部署') {
          steps {
            echo '項目部署'
          }
      }
  }
}

你也徹底不用擔憂不會書寫 Pipeline 腳本,咱們能夠點擊 [Pipeline Syntax] 跳轉到 Pipeline 代碼生成頁面

書寫好腳本後點擊構建,能夠看到整個構建過程:

若是咱們須要部署到不一樣環境,好比生產環境和開發環境,咱們還能夠在項目的 configure 中進行配置:

  • 首先須要安裝 Extended Choice Parameter 插件
  • 而後在配置中添加 Extended Choice Parameter 參數

完成以上配置後,點擊保存,這個時候咱們就能夠在構建的時候選擇須要部署的服務器了

而後咱們就能夠從 Pipeline 腳本中讀取咱們選擇的參數,貼上該項目的構建腳本,以下:

 node {
  //git憑證ID
  def git_auth = "7fdb3fa3-74eb-4862-b36f-c03701f71250"
  //git的url地址
  def git_url = "git@192.168.100.131:cbuc_group/cbuc_web.git"
  //獲取當前選擇的服務器名稱
  def selectedServers = "${publish_server}".split(",")
 ​
      stage('開始拉取代碼') {
        checkout([$class: 'GitSCM', branches: [[name: '*/v3.0']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: git_auth, url: git_url]]])
      }
      stage('開始打包') {
        sh "mvn -Dmaven.test.skip=true clean package"
      }
      stage('開始遠程部署') {
          //遍歷全部服務器,分別部署
          for(int j=0;j<selectedServers.length;j++){
          //獲取當前遍歷的服務器名稱
          def currentServerName = selectedServers[j]
          //生產環境部署目錄
          def pro_address = "/home/pro/java"
          //開發環境部署目錄
          def dev_address = "/home/dev/java"
         ​
          //根據不一樣的profile來部署服務器
          if(currentServerName=="pro"){
          sshPublisher(publishers: [sshPublisherDesc(configName: 'pro_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: 'sh build.sh', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: pro_address, remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/cbuc_web-0.0.1-SNAPSHOT.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
          }else if(currentServerName=="dev"){
          sshPublisher(publishers: [sshPublisherDesc(configName: 'dev_server', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "sh build.sh", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: dev_address, remoteDirectorySDF: false, removePrefix: 'target', sourceFiles: 'target/cbuc_web-0.0.1-SNAPSHOT.jar')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
      }
    }
  }
}

還有一種狀況就是若是部署 Jenkins 的服務器宕機了,這個時候就會丟失 Pipeline 腳本文件,從新書寫是一件很麻煩的事情,那麼咱們就能夠將腳本文件放到咱們的項目的根目錄下,而後在 configure 中配置 Pipeline 腳本文件的位置:

而後咱們點擊構建,能夠看到結果也是成功的:

5)構建觸發器

上面咱們講完了幾種項目的構建方式,其中都是經過手動點擊構建進行構建的,咱們也能夠經過觸發器來構建

經常使用的有:

1. Build After Other Projects Are Built

其餘工程構建後觸發。在選項中填寫咱們關注的項目,其中也支持3個選擇以供選擇:

Trigger only if build is stable: 僅在項目穩定構建時執行

Trigger even if the build is unstable: 即便項目構建不穩定也執行

Trigger even if the build fails: 即便項目構建失敗也執行

2. Build Periodically

定時構建。語法類型如 cron 表達式,定時字符串從左往右分別爲: 分 時 日 月 周

3. Poll SCM

輪詢 SCM。指定時間掃描本地代碼倉庫的代碼是否有變動,若是代碼有變動就觸發項目構建。

4. Trigger builds remotely

遠程觸發構建。經過使用咱們定義的密鑰,而後訪問構建地址:http://192.168.100.131:8888/job/test01/build?token=123123

5. 自動觸發構建

剛纔咱們看到在Jenkins的內置構建觸發器中,輪詢SCM能夠實現Gitlab代碼更新,項目自動構建,可是該方案的性能不佳。那有沒有更好的方案呢? 有的。就是利用Gitlabwebhook實現代碼push到倉庫,當即觸發項目自動構建。

完成自動觸發構建咱們須要在 Jenkins 安裝插件:GitLab HookGitLab

而後咱們在 Build Trigger 中就能夠看到多了一個選項:

複製這串 WebHook 地址,跟着到 GitLab 頁面進行設置:

路徑步驟:Admin Area -> Settings -> Network

而後咱們在對應的項目中進行設置:

最後再回到 Jenkins 頁面中作如下配置:Manage Jenkins->Configure System

作完以上配置,咱們就能夠愉快的代碼進行自動觸發構建了!

END

這篇文章較長,都是滿滿的乾貨,從安裝到使用,一步步帶你入 運維 的坑,學完這篇快給你的項目用上吧!路漫漫,小菜與你一同求索!

看完不讚,都是壞蛋

今天的你多努力一點,明天的你就能少說一句求人的話!

我是小菜,一個和你一塊兒學習的男人。 💋

微信公衆號已開啓,小菜良記,沒關注的同窗們記得關注哦!

相關文章
相關標籤/搜索