Jenkins與網站代碼上線

第1章 引入

1.1 開發寫代碼的演變

一個開發單打獨鬥,擼代碼,開發網站,自由自在;php

多個開發同時開發一個網站,同時改一份代碼。可是同時改一個文件會致使衝突。前端

採用分支結構,天天上班第一件事克隆代碼,下班前最後一件事合併代碼。(上一篇文章有寫到)java

image.png 

好景不長,開發愈來愈多,代碼文件愈來愈多。天天下班前合併代碼時,發現不少合併失敗的文件。最後天天加班3小時人工合併代碼。git

解決方法:將代碼合併的週期縮短,之前一天,如今一小時,半小時。。。。。web

隨時隨地將代碼合併,這種方法叫作持續集成shell

1.1.1 持續集成

持續集成(英語:Continuous integration簡稱CIapi

持續集成指的是,頻繁地(一天屢次)將代碼集成到主幹。瀏覽器

image.png 

它的好處主要有兩個:tomcat

Ø 快速發現錯誤。每完成一點更新,就集成到主幹,能夠快速發現錯誤,定位錯誤也比較容易。服務器

Ø 防止分支大幅偏離主幹。若是不是常常集成,主幹又在不斷更新,會致使之後集成的難度變大,甚至難以集成。

1.2 運維上線代碼的演變

初級運維很苦逼,剛開始開發天天合併一次代碼,而後運維把代碼pull下來測試就能夠了。

可是,後來開發引進持續集成方法論,開發們都「彈冠相慶」。

運維感受好苦逼,一天到晚不停的測試代碼。

運維就想有沒有辦法自動化

藉助一個自動化的部署工具,叫作JENKINS

開發上傳本身的代碼到GITLABgitlab發消息通知Jenkins,隨後Jenkins從倉庫拉取代碼。最後全自動部署到測試服務器進行相關測試,並將測試結果通知運維和開發。

還有偷懶的方法,直接把這個工具交給開發使用,今後就能夠高枕無憂了。

這種自動測試的方法叫作持續交付

1.2.1 持續交付

持續交付(英語:Continuous delivery簡稱CD,指的是:頻繁地將軟件的新版本,交付給質量團隊或者用戶,以供評審。若是評審經過,代碼就進入生產階段。

持續交付能夠看做持續集成的下一步。它強調的是,無論怎麼更新,軟件是隨時隨地能夠交付的。

image.png 

代碼測試經過了,該到生產環境部署了;

部署時要麼成功,要麼失敗回滾;

可使用自動化部署工具或批量管理工具(ansible

這裏有個方法叫作持續部署

1.2.2 持續部署

持續部署(英語:Continuous Deployment,縮寫爲 CD)是持續交付的下一步,指的是代碼經過評審之後,自動部署到生產環境。

image.png 

持續部署的目標是,代碼在如什麼時候刻都是可部署的,能夠進入生產階段。

1.3 Jenkins介紹

Jenkins是一個用Java編寫的開源的持續集成工具。在與Oracle發生爭執後,項目從Hudson項目獨立。

Jenkins提供了軟件開發的持續集成服務。它運行在Servlet容器中(例如Apache Tomcat)。它支持軟件配置管理(SCM)工具(包括AccuRev SCMCVSSubversionGitPerforceClearcaseRTC),能夠執行基於Apache AntApache Maven的項目,以及任意的Shell腳本和Windows批處理命令。Jenkins的主要開發者是川口耕介。Jenkins是在MIT許可證下發布的自由軟件。

image.png 

 

第2章 安裝Jenkins

2.1 安裝Jenkins

2.1.1 環境說明

推薦的硬件配置

1 GBRAM

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

 

2.1.2 軟件下載

常規安裝方法:使用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=""

2.1.3 web界面安裝

瀏覽器訪問: http://10.0.0.64:8080

image.png 

解鎖Jenkins,密碼從命令行中獲取

[root@jenkins ~]# cat /var/lib/jenkins/secrets/initialAdminPassword

618377eec2ba4731a37f7ae80903c076

 

輸入受權密碼,而後點擊下一步

image.png 


稍等一會來到安裝插件選擇的頁面,將此頁面關閉,在安裝完成Jenkins後安裝插件。

image.png 


關閉安裝插件選擇後,選擇開始使用Jenkins

image.png 


安裝完成,顯示界面

image.png 

安裝Jenkins插件

系統管理 >> 管理插件

image.png 

選擇本身須要的插件進行安裝便可,也可選擇所有安裝。

插件安裝完成後插件安裝目錄的內容

[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安裝完成

2.2 Jenkins配置

2.2.1 配置jenkins併發執行數量,提升執行效率 

image.png 

系統管理 >> 系統設置 >> Maven項目配置

image.png 

2.2.2 設置郵件,可以在測試完成後,主動發郵件告知測試狀況

    系統管理 >> 系統設置 >> Jenkins Location

image.png 

向下拉,找到郵件通知,配置郵件的smtp信息

配置完成後點擊 Test configuration 進行測試,測試成功後,點擊保存

image.png 

第3章 Jenkins使用

3.1 建立一個新的任務

建立一個新的任務

image.png 

輸入項目的名稱,選擇構建自由風格的軟件

image.png 

 

3.1.1 Jenkinsgitlab聯合

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

image.png 

jenkins中添加私鑰id_rsa

在首頁中,點擊項目名稱的下拉監聽

image.png 


選擇源碼管理,先將gitlab的項目地址複製過來

image.png 

選擇SSH密鑰和證書,而後選擇直接輸入,將私鑰複製到下框中便可

添加完成後,點擊保存

image.png 

  選擇剛纔建立的證書,完成後,選擇構建

image.png 

選擇構建——拉到最底部,選擇使用shell腳本

image.png 

腳本內容

image.png 

建立測試環境

 

[root@Jenkins ~]# mkdir  -p /data/www

[root@jenkins ~]# chown -R jenkins.jenkins /data/www/

 

選擇構建後的操做,讓每次構建完成後都將結果發送給管理員

image.png 

3.1.2 測試手動集成

回到主頁,點擊右側的按鈕進行測試

image.png 

部署完成

image.png 

查看部署日誌

image.png 

查看部署結果

[root@jenkins www]# ls

README.md

3.1.3 自動測試(gitlab主動通知Jenkins測試)

該功能會使用到一個插件 gitlab plugin

配置gitlab認證

image.png 

添加一個新的憑證

image.png 

gitlab的設置中將 token複製過來

image.png 

將複製的token粘貼到api token中,點ok

image.png 

在系統配置中找到Gitlab 將信息進行填寫,Credentials 選擇剛剛建立對的便可

image.png 

打開項目,編輯項目的構建觸發器

image.png 

在gitlab上配置鏈接jenkins ,將Jenkins的Secret token 與Build URL 複製到gitlab中

image.png 

保存以前先進程測試,測試成功後進行保存

image.png 

gitlab進行上傳文件,能夠測試。

在日誌中顯示是 Started by GitLab push by Administrator 即表示自動集成成功

image.png 

第4章 代碼上線方案

4.1 早期手動部署代碼

純手動scp上傳代碼。

純手動登錄,Git pull 或者SVN update

純手動xftp上傳代碼。

開發發送壓縮包,rz上傳,解壓部署代碼。

4.1.1 缺點:

全程運維參與,佔用大量時間。

若是節點多,上線速度慢。

人爲失誤多,目錄管理混亂。

回滾不及時,或者難以回退。

    

上線方案示意圖

image.png 

4.2 合理化上線方案

1、開發人員需在我的電腦搭建LAMP環境測試開發好的網站代碼,而且在辦公室或 IDC機房的測試環境測試經過,最好有專職測試人員。

 

2、程序代碼上線要規定時間,例如:三天上線一次,如網站需常常更新可天天下午 17點上線,這個看網站業務性質而定,原則就是影響用戶體驗最小。

 

3、代碼上線以前需備份,網站程序出了問題方便回退,另外,從上線技巧上講,上傳代碼時儘量先傳到服務器網站臨時目錄,傳完整後一步mv過去,或者經過In作軟連接— 線上更新代碼的思路。若是嚴格更新,把應用服務器從集羣節點平滑下線,而後更新。

 

4、儘可能由運維人員管理上線,對於代碼的功能性,開發人員更在乎,而對於代碼的性 能優化和上線後服務器的穩定,運維更在乎服務器的穩定,所以,若是網站宕機問題歸運維管,就要讓運維上線,這樣更規範科學。不然,開發隨意更新,出了問題運維負責,這樣就錯了,運維永遠沒法擡頭。

image.png 

 

4.3 大型企業上線制度和流程

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組分組上線的思路,即平滑下線一半的服務器,而後發佈更新代碼,重啓測試,無問題後,掛上更新後的服務器,同時再平滑下線另外一半的服務器,而後發佈更新代碼測試(或者直接發佈後,重啓,掛上線)

4.3.1 php程序代碼上線的具體方案

  對於PHP上線方法:發佈代碼時(也須要測試流程)能夠直接發佈到正式線臨時目錄 ,而後mv或更改link的方式發佈到正式上線目錄 ,不須要重啓http服務。這是新朗,趕集的上線方案。

4.3.2 JAVA程序代碼上線的具體方案

 對於java上線方法:較大公司須要分組平滑上線(如從負載均衡器上摘掉一半的服務器),發佈代碼後,重啓服務器測試,沒問題後,掛上上好線的一半,再下另一半。若是前端有DNS智能解析,上線還能夠分地區上線若干服務器,逐漸普及到全國的服務器,這個被稱爲「灰度發佈」,在後面門戶網站上線的知識裏咱們在講解。

4.3.3 代碼上線解決方案注意事項

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程序,則上線能夠簡單化,直接將上線代碼(最好全量)發佈到全部上線服務器的特定目錄後,分發完成後,一次性mvln到站點目錄,固然測試也是少不了的。測試除了人員測試外,還有各類測試腳本測試各個相關業務接口。

相關文章
相關標籤/搜索