jenkins是基於java開發的一種持續集成工具,用於監控持續重複的工做,功能包括。java
一、持續的軟件版本發佈/測試node
二、監控外部調用執行項目linux
Jenkins其實很早以前就有了,最近火起來的緣由是,你們都在關注devops,關注如何來作持續集成,持續交付,如何來作CI/CD。Jenkins做爲持續集成的工具,他其實只是一個平臺或者是一個大的框架,它的工做徹底就是依靠插件,也就是說你想使用什麼功能,你就找到什麼樣的插件。ios
一、我在工做中部署jenkins的最大好處就是每次在開發、測試環境代碼,都無須運維部署
,而是相關的開發人員,測試人員登陸jenkins傳入須要部署的tag便可,整個部署過程無須運維參與,解放運維勞動力。git
二、安卓,IOS自動打包:雖然打包和運維關係不大,可是運維實現自動打包,使得產品同窗,運營和測試同窗能夠每日驗證產品開發進度以及及時反饋開發功能的方向是否正確
,對公司貢獻仍是不小的。web
因爲咱們在使用jenkins以前,有自動化部署的shell腳本和上線流程,使用jenkins也就是讓開發,測試人員能夠經過一個web界面來執行腳本,實現部署。shell
咱們公司一個產品線有四個環境,開發環境,測試環境,預上線環境,生產環境。除了生產環境以外都是經過jenkins來部署代碼。數據庫
咱們在生產實踐中,jenkins使用到了下面三種部署方式:後端
jenkins觸發式構建:用於開發環境部署,開發人員push代碼或者合併代碼到gitlab項目的master分支,jenkins就部署代碼到對應服務器。api
jenkins參數化構建:用於測試環境預上線環境部署,開發push代碼或者合併代碼到gitlab項目的master分支以後,並不會部署代碼,而是須要登陸到jenkins的web界面,點擊構建按鈕,傳入對應的參數(好比參數須要構建的tag,須要部署的分支)而後纔會部署。
jenkins定時構建:用於APP自動打包,定時構建是在參數化構建的基礎上添加的,開發人員能夠登陸jenkins手動傳入tag進行打包,若是不手動打包,那麼jenkins就天天凌晨從gitlab拉取最新的APP代碼打包。
補充一下:jenkins不光能夠用來部署代碼,還能夠這麼玩(雖然我沒有這麼幹過,可是你有興趣能夠試試):
一、各類服務的備份也能夠放到jenkins上面,天天使用jenkins定時備份,還能夠在jenkins看天天備份的輸出信息。
二、各類開發須要找你的工做,好比同步生產數據庫到開發環境,這個也能夠放到jenkins上面,開發每次須要同步,就登陸jenkins找到數據庫同步的job,點擊構建,就自動同步了。
(1)獲得領導的支持,我在公司推進jenkins部署APP自動打包,能夠說是前段,後端,移動端,測試,產品等人員都須要溝通,這種狀況下獲得領導的支持在推進好處仍是大大的。
(2)大家公司的代碼須要一個分支管理規範,代碼沒有一個好的分支管理規範,自動部署是玩不了的。能夠參考Git 分支管理最佳實踐看看那種方式適合大家公司。
(3)使用jenkins以前,你須要有經過shell實現自動化部署代碼的成功經驗。
(4)持續集成最好有自動化測試,沒有也行,可是最好讓開發人員提供一些api的監控腳本,每次構建以後驗證部署是否正常。
(1)jenkins的安裝配置
(2)jenkins插件自動/手動安裝
(3)jenkins觸發式構建配置
(4)jenkins參數化構建配置
(5)jenkins定時構建配置
(6)jenkins用戶權限配置
操做系統:Centos 7.2
jenkins版本:2.33
gitlab版本:8.13.6
兩臺服務器:
192.168.100.10:jenkins Server
192.168.100.11 :gitlab Server
(1)jenkins是java編寫的,因此須要先安裝jdk,這裏使用yum安裝。
yum -y install java-1.8.0 java-devel-1.8.0
jenkins還須要從gitlab拉取代碼,因此咱們須要安裝git命令行客戶端
[root@node1 ~]# yum -y install git
(2)安裝jenkins
cd /etc/yum.repos.d/ wget http://pkg.jenkins.io/redhat/jenkins.repo rpm --import http://pkg.jenkins.io/redhat/jenkins.io.key yum install -y jenkins systemctl start jenkins
(3)訪問jenkins
在瀏覽器打開輸入http://IP:8080/訪問jenkins。
爲了安全考慮,須要解鎖jenkins,把/var/lib/jenkins/secrets/initialAdminPassword文件內容複製到administrator password下方便可。
[root@Jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword 2862d2ffc9aa40e1b80039e8ad9810ea
(4)選擇安裝的插件:只須要安裝gitlab plugin,git plugin,還有ssh plugin插件便可,其餘插件無須安裝。
gitlab 和 git插件:咱們的代碼都放在gitlab上面,這兩個插件用來作源碼管理。
ssh插件:須要使用jenkins來執行shell命令。
建立admin用戶:按照提示填寫便可
密碼建立完成以後就能夠登陸jenkins了。
若是在安裝jenkins的時候沒有安裝相關插件,能夠按照以下方式安裝(已經安裝,則不須要)
一、安裝gitlab插件,直接在系統管理>插件管理中搜索gitlab相關插件安裝便可。
二、shell插件:仍是剛纔的位置搜索ssh 選擇ssh plugin插件安裝便可。
插件下載地址:http://updates.jenkins-ci.org/download/plugins/
若是有插件一直安裝失敗的狀況,能夠從jenkins官網下載插件,而後導入到jenkins。
示例:我從官方下載gitlab-plugin插件到本地,而後導入到jenkins中。
在jenkins插件管理->高級選擇上傳插件進行安裝。
(1)jenkins生成密鑰對
設置jenkins的shell終端爲/bin/bash
[root@node1 ~]# grep jenkins /etc/passwd jenkins:x:993:990:Jenkins Continuous Integration Server:/var/lib/jenkins:/bin/bash
登陸到jenkins用戶生成密鑰
[root@node1 ~]# su - jenkins bash-4.2$ ssh-keygen -t rsa bash-4.2$ cat .ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCwIdUk3+V8aL2/oMfvwCxp5AiyctL4bnYFnsKOcQz8w/MuAehy9/EEeT0HNQCSs0NQ3veFurWlKUB4tntNA7bMcZS/UWBSXh2uAJQCMcXbIWfdngaQwVVP+s5WvDbtL5Jk6mQch22aIIw4JaJh4L8dl1oyviwoBgOnscXVC/kDWgFM4BrHC4QNyzt6PdtuzX3RkMa4w7bqDvUWMqIyRBScW1fbfJeAwAK1tCQ7ZjfAoTcWpmoBlurH1P6SuWR3rYIPyhGDqjPQnlohqSX/vCrLWoHoYazETHfW2azzzBSGqMeCw3hlbSV/12kRQv0kGfnbhmnHZ1CBgX23N3ktqtzL jenkins@node1.fblinux.com
把這個密鑰添加到gitlab還有jenkins服務器的root用戶
爲何把jenkins公鑰添加到root用戶?
由於jenkins執行部署操做,會出現不少權限問題,一個一個解決比較麻煩(並且不一樣項目權限問題都不一樣),就算sudo受權也是須要授予最少10幾條命令的權限,並且不能保證之後不會出現新的命令,因此我直接讓jenkins用戶經過root方式執行部署操做,簡單粗暴。
(1)添加公鑰到gitlab服務器,用來clone代碼
添加完成以後從gitlab服務器clone下本身的工程,會在.ssh/known_hosts添加gitlab服務器記錄
-bash-4.2$ git clone git@192.168.100.11:root/jenkins_test.git
(2)添加公鑰到jenkins服務器root用戶,用來執行部署腳本
-bash-4.2$ ssh-copy-id -i .ssh/id_rsa.pub root@192.168.100.10 root@192.168.100.10's password:
(1)準備一個測試腳本,看開發如何提交代碼就執行這個構建操做。
[root@node1 ~]# cat /shell/deploy/test/jenkins_trigger.sh #!/bin/bash echo "部署腳本被執行" [root@node1 ~]# chmod +x /shell/deploy/test/jenkins_trigger.sh
注意:若是是生產配置,直接把這個腳本換成對應項目的上線腳本便可,jenkins配置無須修改。
(2)建立一個觸發構建的項目,選擇自由軟件風格便可
(3)源碼管理選擇git,而後只須要在repository url中輸入git倉庫地址便可。
(4)構建,選擇execute shell,執行部署腳本便可
(5)觸發器配置:即gitlab有提交操做,則自動部署,這裏只須要設置一個認證的token便可,gitlab調用觸發器,須要使用 JENKINS_URL/job/new_cms/build?token=TOKEN_NAME便可
(6)在系統管理–>用戶管理–>查看用戶id和token,須要把用戶id和API Token加入觸發器中,作用戶驗證
根據觸發器驗證令牌和用戶id+token會生成一個下面的url,只須要訪問這個URL地址jenkins就會自動部署對應項目的代碼。
http://admin:984c9edf027e750f0587808fab0c3f9b@192.168.100.10:8080/job/jenkins_trigger/build?token=hehe
(7)gitlab配置webhooks,每次提交代碼就訪問這個url,執行構建
URL這裏輸入上面上面用戶ID+API token+job token生成的URL地址便可。觸發工做選擇,push event,merge request event便可。
(8)在jenkins全局在jenkins全局安全設置中取消勾選「防止跨站點請求僞造,否則jenkins會認爲gitlab的請求不合法。
(9)添加完成測試:點擊test模擬提交操做,看看是否會執行自動構建
若是執行成功會返回以下顯示,說明執行鉤子成功
Jenkins查看,能夠看到構建也是成功的。
(1)準備一個測試的腳本
#!/bin/bash git_pro(){ echo "拉取$1代碼" } git_pro $1
(2)建立一個參數化構建的項目
(3)選擇構建的參數:這裏設置一個tag參數,就是每次執行job以前都須要傳入這個tag
(4)設置執行部署的腳本
(5)選擇建立的job執行構建
Tag處傳入須要部署的tag便可
構建完成查看構建的結果
定時構建通常用在安卓,ios打包,天天凌晨會拉取安卓,ios進行編譯打包,並自動推送到共享。
示例:在上面的參數化構建示例上添加以下觸發器,就是天天凌晨1:30分自動執行安卓或ios打包腳本,上面的參數化構建默認值是master就是天天從代碼倉庫的master分支拉取最新的代碼打包。
如今各類job已經設置好了,可是若是開發測試人員須要部署一個tag到服務器進行測試,那麼就須要登陸jenkins,這個時候就須要給開發和測試人員建立一個能夠執行job的用戶,方法以下。
系統管理–>用戶管理–>新建用戶,按照提示填入信息便可