你們好,我是小菜,一個渴望在互聯網行業作到蔡不菜的小菜。可柔可剛,點贊則柔,白嫖則剛! 死鬼~看完記得給我來個三連哦!java
本文主要介紹Jenkins
若有須要,能夠參考node
若有幫助,不忘 點贊 ❥git
微信公衆號已開啓,小菜良記,沒關注的同窗們記得關注哦!程序員
「唉,天天提交完代碼都得本身打包再部署到測試環境和開發環境,好麻煩啊!都快變成運維了」web
「啊?哦!確實,天天打包部署確實都成爲了工具人了」shell
一段簡白的對話快速的隱滅在辦公室中,卻引起了個人思考,「這麼麻煩的過程確定已經有了很好的解決方案,畢竟程序員是面向懶惰編程
,本身對 Jenkins 這個工具備所耳聞已經好久了,看來今天得對它下手
了」數據庫
說幹就幹,今天我們就來求索一下 JenKins,看完你不妨也給大家項目整一個,給本身多增長點划水
的時間!apache
讀前須知: 本文較長,從安裝到使用,一步步帶你超神!微信公衆號關注:
[ 小菜良記 ]
,帶你領略技術風騷!編程
Jenkins是一個開源軟件
項目,是基於java
開發的一種持續集成
工具,用於監控持續重複的工做,旨在提供一個開放易用的軟件平臺,使軟件的持續集成變成可能。
簡單來講,它就是一個 持續集成 的工具!json
持續集成(Continuous Integration),簡稱 CI。頻繁地將代碼集成到主幹以前,必須經過自動化測試,只要有一個測試用例失敗,就不能集成。經過持續集成,團隊能夠快速從一個功能到另一個功能。
好處:
咱們先經過這張圖來看到 Jenkins 在其中起到的做用:
整套步驟下來,做爲開發人員咱們只須要提交下代碼,剩下的工做都交給了 Jenkins ,真是美滋滋,怎麼沒有早點上這個工具的車!
磨刀不誤砍柴工,沒刀的狀況下說再多都是虛的。咱們就先來看下 Jenkins 是如何安裝的吧!
由於 Jenkins 是 java 寫的,因此要運行起來必需要配置 java 運行環境。這裏就不贅訴 JDK 的安裝過程了
咱們能夠進入下載頁面選擇咱們要安裝的版本:下載地址, 咱們這裏使用的版本是 :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插件須要鏈接默認官網下載,速度很是慢:
而後咱們添加一個管理員帳號來管理:
看到如下頁面就說明設置成功了:
微信公衆號關注: 小菜良記 ,帶你領略技術風騷!
工欲善其事,必先利其器
貼心的小菜是不會讓你遭受等待的痛苦的,首先咱們進入 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
經過以上步驟,咱們就能夠愉快的安裝插件了!
在 Jenkins 中咱們也能夠進行用戶權限管理,這個時候咱們須要藉助插件 Role-based Authorization Strategy
Role-based Authorization Strategy
插件將受權策略切換爲 "Role-Based Strategy"
更改完受權策略,咱們就能夠來建立用戶了,進入系統管理頁面中的Manage Users
這裏咱們建立了兩個用戶,分別是 cbuc1
和 cbuc2
建立好用戶,咱們就能夠來建立角色了,在系統管理頁面進入 Manage and Assign Roles
角色主要分爲 Global roles(全局角色) 和 Item roles(項目角色)
Global roles(全局角色): 管理員等高級用戶能夠建立基於全局的角色
Item roles(項目角色): 針對某個或者某些項目的角色
咱們系統如今已經存在了兩個用戶,而後咱們就能夠給這兩個用戶綁定對應的角色
什麼是憑證呢? 憑證 能夠用來存儲須要密文保護的數據庫密碼,GitLab 密碼信息,Docker 私有倉庫的登陸密碼。保存了這些信息後,Jenkins 就能夠和這些第三方的應用進行交互。固然,這仍是得藉助 Jenkins 的插件!
首先安裝 Credentials Binding
插件
安裝好插件後,在系統首要的菜單欄中就會多了個 憑證 菜單
點擊進去,咱們能夠看到能夠添加的憑證有 5 種:
咱們平時比較經常使用的類型爲:Username with password
和 SSH Username with private key
咱們若是要使用 Jenkins 從 GitLab 拉取項目代碼,咱們就得使用憑證來驗證。
咱們須要在 Jenkins 中安裝 Git插件 來拉取項目代碼
而後咱們在服務器上也須要安裝 Git 工具:
# 安裝命令
yum install git -y
# 驗證命令
git --version
咱們可使用 用戶密碼 登陸後拉取項目代碼,這個時候咱們須要用到 憑證的 Username with password 類型:
建立成功咱們就能夠測試是否可用,咱們先建立一個 FreeStyle 項目
而後在 GitLab 中複製咱們項目的 URL
在 Credentials 中選擇咱們剛剛建立的憑證,保存配置後,咱們點擊 Build Now 來構建項目:
這個時候在控制檯能夠看到輸出
而後在進入服務器的 /var/lib/jenkins/workspace
目錄中看到咱們拉取的項目:
說明咱們已經成功使用 用戶密碼 憑證模式拉取到 Git項目了
除了用帳號密碼方式來驗證 Git ,咱們還能夠用 SSH密鑰 來驗證,步驟流程以下:
從圖上咱們能夠得知,第一步須要生成 公私鑰,咱們在 Jenkins服務器 上輸入如下指令生成:
ssh-keygen -t rsa
輸入指令後,一路回車,即可在 /root/.ssh/
目錄下生成公私鑰:
而後咱們把生成的公鑰放在 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項目了
咱們如今開發中的項目大部分都是 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
而後設置 Maven 的 settings.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 咱們也須要配置 JDK 和 Maven 的關聯.
進入 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 構建成功:
若是咱們的項目是打成 war 包的形式,那麼咱們須要藉助 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 的安裝,而後接下來就能夠進行部署了
Deploy to container
插件在項目的 configure 中配置
而後點擊構建,查看控制檯輸出:
顯示已經部署成功,而後訪問項目頁面,能夠看到 war 包項目部署成功:
上面說完了 war 包項目是如何部署的,可是咱們如今項目用到比較多的仍是 SpringBoot ,這個時候打出來的是 jar 類型,可是 SpringBoot 裏面內置了 tomcat 容器,這樣子咱們就不須要藉助外部 tomcat 容器的使用了。
而後在項目的 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 了!
Jenkins 中自動構建項目的類型有不少,經常使用的有如下三種:
每種類型的構建其實均可以完成同樣的構建過程與結果,只是在操做方式、靈活度等方面有所區別,其中流水線類型靈活度比較高,其餘兩種類型咱們在上面的例子中都已經嘗試過了,下面咱們就來介紹如何構建流水線項目。
Pipeline 就是一套運行在 Jenkins 上的工做流框架,將原來獨立運行與單個或者多個節點的任務鏈接起來,實現單個任務難以完成的複雜流程編排和可視化工做
建立 Pipeline 項目以前咱們須要安裝 Pipeline 插件:
而後在建立項目的時候便會多了 Pipeline 類型:
選擇好項目類型以後咱們就能夠在項目中的 configure 進行配置了:
Pipeline 項目是統一經過 Pipeline 腳原本管理,這樣也更好的提升靈活性
Hello World
模板:
pipeline {
agent any
stages {
stage('Hello') {
steps {
echo 'Hello World'
}
}
}
}
stages: 表明整個流水線的全部執行階段,一般 stages 只有1個,裏面包含多個 stagestage: 表明一個階段內須要執行的邏輯,steps 裏面是 shell 腳本,git 拉取代碼,ssh 遠程發佈等任意內容
聲明式 Pipeline
模板:
pipeline { agent any stages { stage('拉取代碼') { steps { echo '拉取代碼' } } stage('編譯構建') { steps { echo '編譯構建' } } stage('項目部署') { steps { echo '項目部署' } } } }
你也徹底不用擔憂不會書寫 Pipeline 腳本,咱們能夠點擊 [Pipeline Syntax]
跳轉到 Pipeline 代碼生成頁面
書寫好腳本後點擊構建,能夠看到整個構建過程:
若是咱們須要部署到不一樣環境,好比生產環境和開發環境,咱們還能夠在項目的 configure 中進行配置:
完成以上配置後,點擊保存,這個時候咱們就能夠在構建的時候選擇須要部署的服務器了
而後咱們就能夠從 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 腳本文件的位置:
而後咱們點擊構建,能夠看到結果也是成功的:
上面咱們講完了幾種項目的構建方式,其中都是經過手動點擊構建進行構建的,咱們也能夠經過觸發器來構建
經常使用的有:
其餘工程構建後觸發。在選項中填寫咱們關注的項目,其中也支持3個選擇以供選擇:
Trigger only if build is stable: 僅在項目穩定構建時執行Trigger even if the build is unstable: 即便項目構建不穩定也執行
Trigger even if the build fails: 即便項目構建失敗也執行
定時構建。語法類型如 cron 表達式,定時字符串從左往右分別爲: 分 時 日 月 周
輪詢 SCM。指定時間掃描本地代碼倉庫的代碼是否有變動,若是代碼有變動就觸發項目構建。
遠程觸發構建。經過使用咱們定義的密鑰,而後訪問構建地址:http://192.168.100.131:8888/job/test01/build?token=123123
剛纔咱們看到在Jenkins的內置構建觸發器中,輪詢SCM能夠實現Gitlab代碼更新,項目自動構建,可是該方案的性能不佳。那有沒有更好的方案呢? 有的。就是利用Gitlab的webhook實現代碼push到倉庫,當即觸發項目自動構建。
完成自動觸發構建咱們須要在 Jenkins 安裝插件:GitLab Hook
和 GitLab
而後咱們在 Build Trigger 中就能夠看到多了一個選項:
複製這串 WebHook 地址,跟着到 GitLab 頁面進行設置:
路徑步驟:Admin Area -> Settings -> Network
而後咱們在對應的項目中進行設置:
最後再回到 Jenkins 頁面中作如下配置:Manage Jenkins->Configure System
作完以上配置,咱們就能夠愉快的代碼進行自動觸發構建了!
END
這篇文章較長,都是滿滿的乾貨,從安裝到使用,一步步帶你入 運維
的坑,學完這篇快給你的項目用上吧!路漫漫,小菜與你一同求索!
今天的你多努力一點,明天的你就能少說一句求人的話!我是小菜,一個和你一塊兒學習的男人。
💋
微信公衆號已開啓,小菜良記,沒關注的同窗們記得關注哦!