l 一個開發單打獨鬥,擼代碼,開發網站,自由自在;php
l 多個開發同時開發一個網站,同時改一份代碼。可是同時改一個文件會致使衝突。前端
l 採用分支結構,天天上班第一件事克隆代碼,下班前最後一件事合併代碼。(上一篇文章有寫到)java
l 好景不長,開發愈來愈多,代碼文件愈來愈多。天天下班前合併代碼時,發現不少合併失敗的文件。最後天天加班3小時人工合併代碼。git
l 解決方法:將代碼合併的週期縮短,之前一天,如今一小時,半小時。。。。。web
l 隨時隨地將代碼合併,這種方法叫作持續集成。shell
持續集成(英語:Continuous integration,簡稱CI)api
持續集成指的是,頻繁地(一天屢次)將代碼集成到主幹。瀏覽器
它的好處主要有兩個:tomcat
Ø 快速發現錯誤。每完成一點更新,就集成到主幹,能夠快速發現錯誤,定位錯誤也比較容易。服務器
Ø 防止分支大幅偏離主幹。若是不是常常集成,主幹又在不斷更新,會致使之後集成的難度變大,甚至難以集成。
l 初級運維很苦逼,剛開始開發天天合併一次代碼,而後運維把代碼pull下來測試就能夠了。
l 可是,後來開發引進持續集成方法論,開發們都「彈冠相慶」。
l 運維感受好苦逼,一天到晚不停的測試代碼。
l 運維就想有沒有辦法自動化?
l 藉助一個自動化的部署工具,叫作JENKINS。
l 開發上傳本身的代碼到GITLAB,gitlab發消息通知Jenkins,隨後Jenkins從倉庫拉取代碼。最後全自動部署到測試服務器進行相關測試,並將測試結果通知運維和開發。
l 還有偷懶的方法,直接把這個工具交給開發使用,今後就能夠高枕無憂了。
l 這種自動測試的方法叫作持續交付。
持續交付(英語:Continuous delivery,簡稱CD),指的是:頻繁地將軟件的新版本,交付給質量團隊或者用戶,以供評審。若是評審經過,代碼就進入生產階段。
持續交付能夠看做持續集成的下一步。它強調的是,無論怎麼更新,軟件是隨時隨地能夠交付的。
l 代碼測試經過了,該到生產環境部署了;
l 部署時要麼成功,要麼失敗回滾;
l 可使用自動化部署工具或批量管理工具(ansible)
l 這裏有個方法叫作持續部署。
持續部署(英語:Continuous Deployment,縮寫爲 CD)是持續交付的下一步,指的是代碼經過評審之後,自動部署到生產環境。
持續部署的目標是,代碼在如什麼時候刻都是可部署的,能夠進入生產階段。
Jenkins是一個用Java編寫的開源的持續集成工具。在與Oracle發生爭執後,項目從Hudson項目獨立。
Jenkins提供了軟件開發的持續集成服務。它運行在Servlet容器中(例如Apache Tomcat)。它支持軟件配置管理(SCM)工具(包括AccuRev SCM、CVS、Subversion、Git、Perforce、Clearcase和RTC),能夠執行基於Apache Ant和Apache Maven的項目,以及任意的Shell腳本和Windows批處理命令。Jenkins的主要開發者是川口耕介。Jenkins是在MIT許可證下發布的自由軟件。
推薦的硬件配置 1 GB的RAM 50 GB的驅動器空間
系統環境 [root@jenkins ~]# cat /etc/redhat-release CentOS Linux release 7.2.1511 (Core) [root@jenkins ~]# uname -r 3.10.0-327.el7.x86_64 [root@jenkins ~]# getenforce Disabled [root@jenkins ~]# systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead)
軟件要求 Java 8--不管是Java運行時環境(JRE)仍是Java開發工具包(JDK)均可以。 可使用open jdk |
常規安裝方法:使用RPM包安裝
RPM包下載地址:
官方倉庫 https://pkg.jenkins.io/redhat-stable/
清華大學開源軟件鏡像站 https://mirrors.tuna.tsinghua.edu.cn/jenkins/redhat/
下載相應的數據包便可,我這裏使用的是jenkins-2.73.1-1.1.noarch.rpm
yum安裝jdk yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel
安裝rpm包 rpm -ivh jenkins-2.73.1-1.1.noarch.rpm
啓動 /etc/init.d/jenkins start
檢查端口信息 [root@jenkins ~]# ss -lntup |grep java tcp LISTEN 0 50 :::8080 :::* users:(("java",pid=1715,fd=159))
RPM包安裝的內容 [root@Jenkins ~]# rpm -ql jenkins /etc/init.d/jenkins # 啓動文件 /etc/logrotate.d/jenkins # 日誌分割配置文件 /etc/sysconfig/jenkins # jenkins主配置文件 /usr/lib/jenkins # 存放war包目錄 /usr/lib/jenkins/jenkins.war # war 包 /usr/sbin/rcjenkins # 命令 /var/cache/jenkins # war包解壓目錄 jenkins網頁代碼目錄 /var/lib/jenkins # jenkins 工做目錄 /var/log/jenkins # 日誌
配置文件說明 [root@Jenkins ~]# grep "^[a-Z]" /etc/sysconfig/jenkins JENKINS_HOME="/var/lib/jenkins" #jenkins工做目錄 JENKINS_JAVA_CMD="" JENKINS_USER="jenkins" # jenkinx啓動用戶 JENKINS_JAVA_OPTIONS="-Djava.awt.headless=true" JENKINS_PORT="8080" # 端口 JENKINS_LISTEN_ADDRESS="" JENKINS_HTTPS_PORT="" JENKINS_HTTPS_KEYSTORE="" JENKINS_HTTPS_KEYSTORE_PASSWORD="" JENKINS_HTTPS_LISTEN_ADDRESS="" JENKINS_DEBUG_LEVEL="5" JENKINS_ENABLE_ACCESS_LOG="no" JENKINS_HANDLER_MAX="100" # 最大鏈接 JENKINS_HANDLER_IDLE="20" JENKINS_ARGS="" |
瀏覽器訪問: http://10.0.0.64:8080
解鎖Jenkins,密碼從命令行中獲取 [root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword 618377eec2ba4731a37f7ae80903c076 |
輸入受權密碼,而後點擊下一步
稍等一會來到安裝插件選擇的頁面,將此頁面關閉,在安裝完成Jenkins後安裝插件。
關閉安裝插件選擇後,選擇開始使用Jenkins
安裝完成,顯示界面
安裝Jenkins插件
系統管理 >> 管理插件
選擇本身須要的插件進行安裝便可,也可選擇所有安裝。
插件安裝完成後插件安裝目錄的內容 [root@jenkins ~]# ls /var/lib/jenkins/plugins/ ace-editor icon-shim.jpi pipeline-stage-view ace-editor.jpi jackson2-api pipeline-stage-view.jpi ……省略若干 handlebars pipeline-stage-step.jpi ws-cleanup handlebars.jpi pipeline-stage-tags-metadata ws-cleanup.jpi icon-shim pipeline-stage-tags-metadata.jpi |
至此Jenkins安裝完成
系統管理 >> 系統設置 >> Maven項目配置
系統管理 >> 系統設置 >> Jenkins Location
向下拉,找到郵件通知,配置郵件的smtp信息
配置完成後點擊 Test configuration 進行測試,測試成功後,點擊保存
建立一個新的任務
輸入項目的名稱,選擇構建自由風格的軟件
gitlab的詳細安裝方法參照:版本控制系統
建立公鑰和私鑰
[root@gitlab ~]# cat /root/.ssh/id_rsa -----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAq/uH2b/N40EAwp4I5roiRcNB9Jxh3wAlbsYGS7M6pWuFRWSC jgsl83sYYR1vrx+1LNNwF7LC+4BcUmYOvG8/rIQV89joRbpcIrHSEKm1hagblgLY UqykJZ1iBczPZc11/33yOsWJRz+4vHPjc9wtCK5u5Zz9zOSCaWCLgg7inNDUho0K caajGJMzahgpGApPqwfCP2mb/buPYjgg+iNFpBKWy9oc6Ee4FDIv1ssuoCmoNQst zpouxUtfXRqHyE5hul5RQ3Ec0R/ac/Hgc285Spl9Ro7J3RBCwiJhyyo5kZr6KXRe Se29cH1mHB30vmfkksdqwniBeM8cyHzvqLJ5AwIDAQABAoIBAE52C41ZBwo1nq4r QS5aHsarBQ0exzvgqjM2XqrsksXjHsMAztsU1PSW5RFxR4Giupo/wDTfljr9XaEt 9G0dZ/RBsm40OAuPsPcXHxoBAtJ+Vk+C7sQRBTYv7gdtX/U23i14fSk4858wwAwh 5tP10AnU4r0YeWWfnquKozrrpZEaqUjtbqGRXdo+larXpmagp9iSGUW6e7ln1ACY imikXSVc6PtU0rVMrMbCT6J3LleUZeKnkd2QZa3SRurVmUB5s62L08htHRoNbENy Gv++47q0xK9lF6IcAqpBvIOaoN4nqMdYpXTt5Ee4ls+0YLnLh896JTH0orJpxltK eRLds+kCgYEA1sAM3F26m1GroYuxsE0+viSPMfFCapLv8hcbQg0GjdjuLAoxqNRj jYKqDl+xEOIe4d5zLKNw5nszUf98th+KHhhLl651W41MYIImnyU2jr3Z2JrA2UoM XsykALRwb4sFcPUhzs1xmPA3HkSPyqcpWQrcYq4xokL+NB35CE7mAVUCgYEAzQR1 eyeFUtyj4My1SNDmR0FSzB88C+ynJQr13sDfmmKFT+C28uY8DDHdspQhGsPH7Q5O 4Rf2cC28iJUwZNMzfD5054Y7UN45Ft91j6ru8SPDgo7dwyrcDXuvWSPicmKj06b9 6qsYJuJ5nWJP412qd0Ok0OvA638apexpPO9qcPcCgYAh/x9KF5B+HCzGkz3bAi+H nHQK3P29r2tK8PuAtl0uQYRa9nYsGwtzkJbpVZ7LZHCtIzEqhOlPo3tZZM/SaSXN Y907swOjLbhEovYIRbTgXg/JqZ4UCBPzQgRIlEgkcGa5HiVu/rkYFBc1tHbrBxGV phGDkb4LyP1DNOeCuDLTTQKBgQCscVevoupNbDCbYRQKj0tiG9vcvVjwXrmoOrPc DTcG0F95dHXtkSJoz3i+QEIoFQ0Qo7xNMK6kZJPz/iiaZdskYhRKuWki+Afk6Ugk 843PXlmQc0Ksalx1KteujrRlqfpKiGeC/y5tZokMjCjOAXbkogz7fZDjhCGR9mv+ SRKquQKBgF3zVifL/+jifBBz2O0k/02LOcdmUNSwqnTOF7Lnwczr33BJF9UVVTH1 nfOjZIUPM+D7pT3JuCevhFr5XxWQCCS67NIXrSEv6nDwDPz7EQ4Q04SPf88wL64j 2bdQjVT4UoBJzM4/mSDVBHrWoRWqzDszqeBcyNib2Cu3GllKwuT9 -----END RSA PRIVATE KEY----- |
在gitlab中添加公鑰id_rsa.pub
在jenkins中添加私鑰id_rsa
在首頁中,點擊項目名稱的下拉監聽
選擇源碼管理,先將gitlab的項目地址複製過來
選擇SSH密鑰和證書,而後選擇直接輸入,將私鑰複製到下框中便可
添加完成後,點擊保存
選擇剛纔建立的證書,完成後,選擇構建
選擇構建——拉到最底部,選擇使用shell腳本
腳本內容
建立測試環境
[root@Jenkins ~]# mkdir -p /data/www [root@jenkins ~]# chown -R jenkins.jenkins /data/www/ |
選擇構建後的操做,讓每次構建完成後都將結果發送給管理員
回到主頁,點擊右側的按鈕進行測試
部署完成
查看部署日誌
查看部署結果
[root@jenkins www]# ls README.md |
該功能會使用到一個插件 gitlab plugin
配置gitlab認證
添加一個新的憑證
從gitlab的設置中將 token複製過來
將複製的token粘貼到api token中,點ok
在系統配置中找到Gitlab 將信息進行填寫,Credentials 選擇剛剛建立對的便可
打開項目,編輯項目的構建觸發器
在gitlab上配置鏈接jenkins ,將Jenkins的Secret token 與Build URL 複製到gitlab中
保存以前先進程測試,測試成功後進行保存
在gitlab進行上傳文件,能夠測試。
在日誌中顯示是 Started by GitLab push by Administrator 即表示自動集成成功
l 純手動scp上傳代碼。
l 純手動登錄,Git pull 或者SVN update。
l 純手動xftp上傳代碼。
l 開發發送壓縮包,rz上傳,解壓部署代碼。
l 全程運維參與,佔用大量時間。
l 若是節點多,上線速度慢。
l 人爲失誤多,目錄管理混亂。
l 回滾不及時,或者難以回退。
上線方案示意圖
1、開發人員需在我的電腦搭建LAMP環境測試開發好的網站代碼,而且在辦公室或 IDC機房的測試環境測試經過,最好有專職測試人員。
2、程序代碼上線要規定時間,例如:三天上線一次,如網站需常常更新可天天下午 17點上線,這個看網站業務性質而定,原則就是影響用戶體驗最小。
3、代碼上線以前需備份,網站程序出了問題方便回退,另外,從上線技巧上講,上傳代碼時儘量先傳到服務器網站臨時目錄,傳完整後一步mv過去,或者經過In作軟連接— 線上更新代碼的思路。若是嚴格更新,把應用服務器從集羣節點平滑下線,而後更新。
4、儘可能由運維人員管理上線,對於代碼的功能性,開發人員更在乎,而對於代碼的性 能優化和上線後服務器的穩定,運維更在乎服務器的穩定,所以,若是網站宕機問題歸運維管,就要讓運維上線,這樣更規範科學。不然,開發隨意更新,出了問題運維負責,這樣就錯了,運維永遠沒法擡頭。
JAVA代碼環境,上線時,有數臺機器同時須要更新或者分批更新
1. 本地開發人員取svn代碼。當天上線提交到trunk,不然,長期項目單開分支開發,而後在合併主線(trunk)
2. 辦公內網開發測試時,由開發人員或配置管理員經過部署平臺jenkins實現統一部署,(即在部署平臺上控制開發機器從svn取代碼,編譯,打包,發佈到開發機,包名如idc_dep.war).
3. 開發人員通知或和測試人員一塊兒測試程序,沒有問題後,由配置管理員打上新的tag標記。這裏要注意,不一樣環境的配置文件是隨代碼同時發佈的。
4. 配置管理員,根據上一步的tag標記,checkout出上線代碼,並配置好IDC測試環境的全部配置,執行編譯,打包(mvn,ant)(php不須要打包),而後發佈到IDC內的統一分發服務器。
5. 配置管理員或SA上線人員,把分發的程序代碼內容推送到相關測試服務器(包名如idc_test.war),而後通知開發及測試人員進行測試。若是有問題向上回退,繼續修改。
6. 若是IDC測試沒有問題,繼續打好tag標記,此時,配置管理員,根據上步的tag標記,checkout出測試好的代碼,並配置好IDC正式環境的全部配置,執行編譯,打包(mvn,ant)(php不須要打包),而後發佈到IDC內的統一分發服務器主機,準備批量發佈。
7. 配置管理員或SA上線人員,把分發的內容推送到相關正式服務器(包名如idc_product.war),而後通知開發及測試人員進行測試。若是有問題直接發佈回滾指令。
IDC正式上線的過程對於JAVA程序,能夠是AB組分組上線的思路,即平滑下線一半的服務器,而後發佈更新代碼,重啓測試,無問題後,掛上更新後的服務器,同時再平滑下線另外一半的服務器,而後發佈更新代碼測試(或者直接發佈後,重啓,掛上線)
對於PHP上線方法:發佈代碼時(也須要測試流程)能夠直接發佈到正式線臨時目錄 ,而後mv或更改link的方式發佈到正式上線目錄 ,不須要重啓http服務。這是新朗,趕集的上線方案。
對於java上線方法:較大公司須要分組平滑上線(如從負載均衡器上摘掉一半的服務器),發佈代碼後,重啓服務器測試,沒問題後,掛上上好線的一半,再下另一半。若是前端有DNS智能解析,上線還能夠分地區上線若干服務器,逐漸普及到全國的服務器,這個被稱爲「灰度發佈」,在後面門戶網站上線的知識裏咱們在講解。
1. 上線的流程裏,辦公室測試環境-->IDC測試環境-->正式生產環境,全部環境中的全部軟件均應版本統一,其次儘可能單一,不然將後患無窮,開發測試成功,IDC測試就可能有問題(如:操做系統,web服務器,jdk,php,tomcat,resin等版本)
2. 開發團隊小組辦公內部測試環境測試(該測試環境屬於開發小組維護,或定時自動更新代碼),代碼有問題返回給某開發人員從新開發。
3. 有專門的測試工程師,程序有問題直接返回給開發人員(此時返回的通常爲程序的BUG,稱爲BUG庫),無問題進行IDC測試
4. IDC測試由測試人員和運維人員參與,叫IDCtest,進行程序的壓力測試,有問題直接返回給開發人員,無問題進行線上環境上線。
5. 數臺服務器代碼分發上線方案舉例(JAVA程序)
A:假設同業務服務器有6臺,將服務器分爲A,B兩組,A組三臺,B組三臺,先對A組進行從負載均衡器上平滑下線,B組正常提供服務,避免服務器因上線影響業務。
B:下線過程是經過腳本將A組服務器從RS池(LVS,NGINX,HAPROXY,F5等均有平滑方案)中踢出,避免負裁均衡器將請求發送給A組服務器(此時的時間應該爲網站流量少時,通常爲晚上)
C:將代碼分發到A組服務器的站點目錄下,對A組服務器上線並重啓服務,並由專業的測試人員進行訪問測試,測試成功後,掛上A組的服務器,同時下線B組服務器,B組代碼上線操做測試等和A組相同,期間也要觀察上線提供服務的服務器情況,有問題及時回滾。
6. 特別說明:若是是PHP程序,則上線能夠簡單化,直接將上線代碼(最好全量)發佈到全部上線服務器的特定目錄後,分發完成後,一次性mv或ln到站點目錄,固然測試也是少不了的。測試除了人員測試外,還有各類測試腳本測試各個相關業務接口。