1. 程式人生 > >GIt+jenkins程式碼自動上線

GIt+jenkins程式碼自動上線

程式碼自動上線功能

企業部署程式碼上線是件比較麻煩的事情,還好我們有jenkins這個持續整合的軟體可以幫助我們做很多的事情,現在我們就
來測試用jenkins推送程式碼上線。
我們這裡測試的是一個html的web頁面監控的程式碼上線,做一個簡單的小教程,先不涉及動態語言和資料庫。

準備環境

準備三臺伺服器

伺服器名稱 ip地址 需要的服務 系統
git 10.0.0.200 gitlab centos7
jenkins 10.0.0.201 jenkins centos7
web01 10.0.0.7 nginx centos7

GitLab

GitLab簡介

GitLab 是一個用於倉庫管理系統的開源專案。使用Git作為程式碼管理工具,並在此基礎上搭建起來的web服務。可
通過Web介面進行訪問公開的或者私人專案。它擁有與Github類似的功能,能夠瀏覽原始碼,管理缺陷和註釋。可
以管理團隊對倉庫的訪問,它非常易於瀏覽提交過的版本並提供一個檔案歷史庫。團隊成員可以利用內建的簡單聊
天程式(Wall)進行交流。它還提供一個程式碼片段收集功能可以輕鬆實現程式碼複用。
常用的網站:


官網:https://about.gitlab.com/
國內映象:https://mirrors.tuna.tsinghua.edu.cn/gitlab‐ce/yum/

安裝環境

1、 CentOS 6或者7
2、 2G記憶體(實驗)生產(至少4G)
3、 安裝包:gitlab‐ce‐10.2.2‐ce
4、 禁用防火牆,關閉selinux
https://about.gitlab.com/installation/#centos‐7 # git官網

1、安裝gitlab

[[email protected] ~]# yum install policycoreutils-python -y       # 安裝依賴  
rz ‐bye gitlab‐ce‐10.2.2‐ce.0.el7.x86_64.rpm                 # 上傳gitlab安裝包 下載方式可通過
國內清華源gitlab‐ce社群版本下載 
[
[email protected]
~]# rpm -ivh gitlab-ce-10.2.2-ce.0.el7.x86_64.rpm #安裝gitlab

2、更改gitlab配置檔案

[[email protected] ~]# vim /etc/gitlab/gitlab.rb
更改url地址為本機IP地址 external_url 'http://10.0.0.200'

image.png | left | 826x265

3、gitlab命令及檔案

gitlab‐ctl reconfigure                  # 更改配置檔案後需重新配置
/opt/gitlab/                            # gitlab的程式安裝目錄
/var/opt/gitlab                         # gitlab目錄資料目錄
/var/opt/gitlab/git‐dfata               # 存放倉庫資料
gitlab‐ctl status                       # 檢視目前gitlab所有服務運維狀態
gitlab‐ctl stop                         # 停止gitlab服務
gitlab‐ctl stop nginx                   # 單獨停止某個服務
gitlab‐ctl tail                         # 檢視所有服務的日誌

4、Gitlab的服務構成

nginx: 靜態web伺服器
gitlab-workhorse: 輕量級的反向代理伺服器
logrotate:日誌檔案管理工具
postgresql:資料庫
redis:快取資料庫
sidekiq:用於在後臺執行佇列任務(非同步執行)。(Ruby)
unicorn:An HTTP server for Rack applications,GitLab Rails應用是託管在這個伺服器上面的。(Ruby
Web Server,主要使用Ruby編寫)

gitlab漢化

首先要有git命令

yum install git -y 

1、下載漢化補丁

git clone https://gitlab.com/xhang/gitlab.git  

2、檢視全部分支版本

git branch ‐a 

3、對比版本、生成補丁包

git diff remotes/origin/10-2-stable remotes/origin/10‐2‐stable‐zh > ../10.2.2‐zh.diff 

4、停止伺服器

gitlab-ctl stop 

5、打補丁

patch -d /opt/gitlab/embedded/service/gitlab‐rails -p1 < /tmp/10.2.2-zh.diff  

6、啟動和重新配置

gitlab-ctl start 
gitlab-ctl reconfigure

gitlba的網頁操作

通過瀏覽器輸入IP地址進行訪問gitlab
10.0.0.200

1、設定密碼

image.png | left | 826x436

2、修改外觀(也可不修改,只是為了美觀)

image.png | left | 826x598

效果圖

image.png | left | 826x413

3、新增群組和使用者

1、新增群組

image.png | left | 826x377

image.png | left | 708x896

2、新增使用者

image.png | left | 620x840

3、修改使用者密碼

image.png | left | 826x393

image.png | left | 801x870

新增使用者到群組並給與開發許可權

image.png | left | 826x394

4、建立倉庫(專案)

1、手動建立

image.png | left | 826x368

2、克隆一個專案,這裡我們直接克隆一個別人的專案

https://gitee.com/explore/starred/manage-monitor?lang=Html
1.先去上面網站複製克隆地址

image.png | left | 826x416

2.我們選擇克隆方式,選擇組為剛建立的組,專案名稱自定義,我們這裡用的是monitor

image.png | left | 826x586

3.建立成功

image.png | left | 826x400

5、設定分支保護(這是網頁遠端倉庫操作,本地伺服器操作上一篇git使用中有講解)

正常情況下,我們是不允許在master分支上修改內容的,我們只能建立新的分支修改,修改完成後進行合併,這裡我們做分支保護的目的是為了讓其他使用者如dev使用者在修改完程式碼內容之後,發起合併請求,root使用者進行稽核完成才能進行合併

1、無分支保護情況

我們首先登陸dev使用者,要了解dev是開發使用者,root是老大,老大一般做稽核,擁有最高許可權
退出root使用者

image.png | left | 787x333

dev使用者登入時需要重新編輯一次密碼

image.png | left | 826x281

登入成功後開啟我們的專案

image.png | left | 826x175

首先建立一個新的分支,在新分支上修改內容

image.png | left | 826x452

image.png | left | 826x215

我們隨便在test分支上修改一個內容

image.png | left | 826x429

image.png | left | 826x402

這裡我們給他加了一個對不起

image.png | left | 826x525

現在我們請求合併分支

image.png | left | 826x337

image.png | left | 826x260

image.png | left | 826x700

提交完合併請求會發現我們現在是可以合併的,因為沒有設分支保護

image.png | left | 826x473

image.png | left | 826x333

我們檢視一下master分支,已經合併成功

image.png | left | 826x452

2、有分支保護情況

登入root使用者設定分支保護

image.png | left | 826x377

image.png | left | 826x319

選擇保護master分支

image.png | left | 826x585

設定成功

image.png | left | 826x551

這時我們推出root使用者,登入dev使用者,繼續測試一下,修改test下404.html,這裡我們又加了個“保護”

image.png | left | 826x558

然後我們合併請求(步驟和上面一樣),這時我們不能進行合併,因為有保護,只能root賬戶老大進行合併

image.png | left | 826x463

登入到root賬戶,檢視併合並請求

image.png | left | 826x277

image.png | left | 826x463

合併成功檢視一下效果

image.png | left | 826x437

image.png | left | 826x443

jenkins

jenkin簡介

官網 https://jenkins.io/
Jenkins是一個開源軟體專案,是基於Java開發的一種持續整合工具,用於監控持續重複的工作,旨在提供一個開
放易用的軟體平臺,使軟體的持續整合變成可能。

1、安裝準備

準備jenkins伺服器關閉selinux和防火牆
記憶體2G 50G+硬碟
jenkins 10.0.0.201

2、安裝JDK執行環境和jenkins服務

上傳JDK和jenkins rpm安裝包,使用rpm ‐ivh進行安裝,安裝完JDK運維java測試是否安裝成功

[[email protected] ~]# rpm -ivh jdk-8u181-linux-x64.rpm
[[email protected] ~]# rpm -ivh jenkins-2.99-1.1.noarch.rpm

3、配置jenkins

[[email protected] ~]# vim /etc/sysconfig/jenkins
啟動使用者修改為root 
JENKINS_USER="root" 

image.png | left | 817x527

4、啟動jenkins並加入開機自啟

[[email protected] ~]# systemctl start jenkins
[[email protected] ~]# systemctl enable jenkins

jenkins網頁操作

訪問頁面進行配置
預設埠是8080
http://10.0.0.201:8080

1、在伺服器上檢視jenkins提示的檔案,把密碼貼上到網頁

[[email protected] ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
91e0de6b56374365be1da3ee2ed75254

image.png | left | 826x614

登入中,可能需要等一段時間

image.png | left | 826x530

2、進入後我們先跳過安裝外掛介面

image.png | left | 826x547

開始使用jenkins

image.png | left | 826x630

成功進入jenkins主介面

image.png | left | 826x345

3、我們可以再這裡先修改一下密碼(也可忽略)

image.png | left | 826x415

image.png | left | 826x536

4.外掛安裝

image.png | left | 826x502

image.png | left | 832x380.9438202247191

安裝完外掛檢視一下

image.png | left | 826x432

外掛安裝目錄

[[email protected] jenkins]# ll /var/lib/jenkins/plugins
總用量 80936
drwxr-xr-x 7 jenkins jenkins      124 12月  3 2017 ace-editor
-rw-r--r-- 1 jenkins jenkins  4279042 12月  3 2017 ace-editor.jpi
drwxr-xr-x 4 jenkins jenkins       56 12月  3 2017 ant
drwxr-xr-x 4 jenkins jenkins       56 12月  3 2017 antisamy-markup-formatter
-rw-r--r-- 1 jenkins jenkins   112796 12月  3 2017 antisamy-markup-formatter.jpi
-rw-r--r-- 1 jenkins jenkins    81259 12月  3 2017 ant.jpi
drwxr-xr-x 4 jenkins jenkins       56 12月  3 2017 apache-httpcomponents-client-4-api
-rw-r--r-- 1 jenkins jenkins  1407235 12月  3 2017 apache-httpcomponents-client-4-api.jpi
drwxr-xr-x 4 jenkins jenkins       56 12月  3 2017 authentication-tokens
-rw-r--r-- 1 jenkins jenkins    14638 12月  3 2017 authentication-tokens.jpi
drwxr-xr-x 4 root    root          56 12月  7 2017 blueocean-commons
-rw-r--r-- 1 root    root     1540739 12月  7 2017 blueocean-commons.jpi

jenkins主要的目錄

/usr/lib/jenkins/:jenkins安裝目錄,WAR包會放在這裡 
/etc/sysconfig/jenkins:jenkins配置檔案,“埠”,“JENKINS_HOME”等都可以在這裡配置 
/var/lib/jenkins/:預設的JENKINS_HOME 
/var/log/jenkins/jenkins.log:Jenkins日誌檔案 

5、建立一個自由風格的專案freestyle‐job

image.png | left | 826x438

image.png | left | 826x621

1、配置專案,丟失舊的構建

image.png | left | 826x479

2、原始碼管理將gitlab倉庫和jenkins關聯

這裡我們需要吧jenkins伺服器的公鑰給gitlab
jenkins端生成公鑰

[[email protected] ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): 
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:rm4L5a3Of3URrgcywqOKZtsda5eWoBzZiBsJn/HFztE [email protected]
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|              .  |
|     . o     . . |
|. .   + E o . o  |
| o * B.oSo o o . |
|  * =o*o    o o  |
|   =.+o.oo . o   |
|  =.++o== .      |
| o...=X=..       |
+----[SHA256]-----+

檢視公鑰

[[email protected] ~]# cat .ssh/id_rsa.pub 
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHKs/orwn138ROGQicn8yiku6xB0Sn7dqty5KRpE9kc7Z6QFHMms/XWiZetsaGv+uKq9XDExF+5Tt1J6nCHEmrImstr17/u5uSr+YH/9LWxxv5SDJphdwwkUeoN+xMcQ/uJ5r8aWnCfS4wKoPXpoYe22AokkQ4RuxoAud6ZxLU5Bo0rJx3Q8WI0ew67SBI6bxRkwdgjmJhNsZiI8vsEKhZDW8kNlYTz8WuW9jBI/V+qewUeKDiS0O+zbrE7qMhtB+Rj9R/jEHOgOi2ucINWKaOkL7H8rmlhK3WFi3gVmX8Bj6otg2q7HfjZlBXY9sx28U2f8vzOEoGYiM+546PKM6F [email protected]

把公鑰給gitlab

image.png | left | 826x360

jenkins關聯gitlab

image.png | left | 826x462

這裡報錯原因是第一次連線他會有一個確認伺服器主機的操作,我們需要確認一下

image.png | left | 826x475

複製上面的報錯,如果出現確認主機情況就輸入yes

[[email protected] ~]# git ls-remote -h [email protected]:zeq/monitor.git 
742c1e0055ccdd69c9626052b5463ed5337ad0c9    refs/heads/master

然後我們刪除url重新貼上一遍就好了

image.png | left | 826x434

3、構建觸發器

選擇第四個,點選高階

image.png | left | 826x469

過濾master分支,生成token

image.png | left | 826x529

4、新增gitlab端web鉤子

複製jenkins專案url和token

image.png | left | 826x582

新增到gitlab

image.png | left | 826x474

新增構建

在jenkins伺服器上建立一個指令碼目錄

[[email protected] ~]# mkdir /server/scripts -p

編寫一個指令碼,把從gitlab拉取過來的程式碼推送到web伺服器上

[[email protected] ~]# vim /server/scripts/do.sh
#!/bin/sh
DATE=$(date +%Y-%m-%d-%H-%M-%S)
CODE_DIR="/var/lib/jenkins/workspace/freestyle-job"
WEB_DIR="/code"
IP=10.0.0.7

get_code_tar(){
        cd $CODE_DIR && tar zcf /opt/web-$DATE.tar.gz ./*
}

scp_code_web(){
        scp /opt/web-$DATE.tar.gz $IP:$WEB_DIR
}

code_tarxf(){
        ssh $IP "cd $WEB_DIR &&mkdir web-$DATE && tar xf web-$DATE.tar.gz -C web-$DATE"

}
ln_html(){
         ssh $IP "cd $WEB_DIR && rm -rf html && ln -s web-$DATE html"
}

main(){

        get_code_tar;
        scp_code_web;
        code_tarxf;
        ln_html;
}
main

因為要推送到web伺服器上,我們要把公鑰給web伺服器

[[email protected] ~]# ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]

增加構建步驟

image.png | left | 826x329

image.png | left | 826x391

jenkins自由風格專案建立完成,接下來我們開始配置web伺服器

web伺服器操作

因為我們最終操作是實現程式碼自動上線到web伺服器,我們要配置web伺服器

1.安裝nginx擴充套件源

[[email protected] ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

2、安裝nginx

[[email protected] ~]# yum install nginx -y

3、配置nginx

[[email protected] ~]# vim /etc/nginx/conf.d/git_jenkins.conf
server {
        server_name 10.0.0.7;
        listen 80;
        root /code/html;
        index index.php index.html;
}

4.建立程式碼存放目錄

[[email protected] ~]# mkdir /code

5、啟動nginx並加入開機自啟動

[[email protected] ~]# systemctl start nginx
[[email protected] ~]# systemctl enable nginx

進行程式碼自動上線測試

整個流程是gitlab上的倉庫master分支只要做了改動就會通知jenkins伺服器,然後jenkins觸發構建器拉取gitlab上的程式碼內容,最後執行shell指令碼,把程式碼推送到web上實現程式碼的自動上線。

1、gitlab端操作

為了直觀的看到程式碼變化,我們修改主頁index.html檔案,這裡我們方便演示,直接在root使用者的master分支進行修改,實際生產環境中是不允許這樣做的,切記。
修改步驟和上面講解gitlab的分支保護步驟一樣,我們修改43行的文字改成張恩清ichn.me

image.png | left | 826x570

image.png | left | 826x538

2、修改完成後檢視jenkins端

這裡我們已經自動構建成功了,藍色代表成功,紅色代表失敗

image.png | left | 826x586

3、web端操作

在瀏覽器上輸入web伺服器地址http://10.0.0.7檢視效果

image.png | left | 826x422

這樣一個自由風格的jenkins程式碼自動上線就建立完成了,接下來我們做一個Pipeline專案

jenkins Pipeline專案

1、什麼是持續整合、持續部署、持續交付

持續整合 (Continuous integration)

是一種軟體開發實踐,即團隊開發成員經常整合它們的工作,通過每個成員
每天至少整合一次,也就意味著每天可能會發生多次整合。每次整合都通過自動化的構建(包括編譯,釋出,自動
化測試)來驗證,從而儘早地發現整合錯誤。
比如(你家裝修廚房,其中一項是鋪地磚,邊角地磚要切割大小。如果一次全切割完再鋪上去,發現尺寸有誤的話
浪費和返工時間就大了,不如切一塊鋪一塊。這就是持續整合。) 

持續部署(continuous deployment)

是通過自動化的構建、測試和部署迴圈來快速交付高質量的產品。某種程度
上代表了一個開發團隊工程化的程度,畢竟快速運轉的網際網路公司人力成本會高於機器,投資機器優化開發流程化
相對也提高了人的效率。
比如(裝修廚房有很多部分,每個部分都有檢測手段,如地磚鋪完了要測試漏水與否,線路鋪完了要通電測試電路
通順,水管裝好了也要測試冷水熱水。如果全部裝完了再測,出現問題可能會互相影響,比如電路不行可能要把地
磚給挖開……。那麼每完成一部分就測試,這是持續部署。) 

持續交付 (Continuous Delivery)

頻繁地將軟體的新版本,交付給質量團隊或者使用者,以供評審儘早發現生產環境
中存在的問題;如果評審通過,程式碼就進入生產階段
比如(全部裝修完了,你去驗收,發現地磚顏色不合意,水池太小,灶臺位置不對,返工嗎?所以不如沒完成一部
分,你就去用一下試用驗收,這就是持續交付。)
敏捷思想中提出的這三個觀點,還強調一件事:通過技術手段自動化這三個工作。加快交付速度。

2、pipeline簡介

1、什麼是pipeline

Jenkins 2.0的精髓是Pipeline as Code,是幫助Jenkins實現CI到CD轉變的重要角色。什麼是Pipeline,簡單
來說,就是一套運行於Jenkins上的工作流框架,將原本獨立運行於單個或者多個節點的任務連線起來,實現單個
任務難以完成的複雜釋出流程。Pipeline的實現方式是一套Groovy DSL,任何釋出流程都可以表述為一段Groovy
指令碼,並且Jenkins支援從程式碼庫直接讀取指令碼,從而實現了Pipeline as Code的理念。 

2、pipeline概念

Pipeline 是一個使用者定義的 CD 流水線模式。Pipeline 程式碼定義了通常包含構建、測試和釋出步驟的完整的構
建過程。
Node 
    node 是一個機器,它是 Jenkins 環境的一部分,並且能夠執行 Pipeline。同時,node 程式碼塊也是指令碼式 
Pipeline 語法的關鍵特性。 
Stage 
    Stage 塊定義了在整個 Pipeline 中執行的概念上不同的任務子集(例如“構建”,“測試”和“部署”階段),
許多外掛使用它來視覺化或呈現 Jenkins 管道狀態/進度。 
Step 
    一項任務。從根本上講,一個步驟告訴 Jenkins 在特定時間點(或過程中的“步驟”)要做什麼。例如,使用 
sh step:sh 'make' 可以執行 make 這個 shell 命令。 

3、jenkins file (語法)

宣告式 指令碼式 
指令碼式語法格式:

pipeline{ 
agent any 
stages{ 
    stage("get code"){ 
       steps{ 
           echo "get code from scm" 
       } 
    } 
    stage("package"){ 
        steps{ 
            echo "packge code" 
        } 
    } 
    stage("deploy"){ 
        steps{ 
            echo "deploy packge to node1" 
        } 
    } 
} 
} 

4、建立一個pipeline專案 

為了更直觀的看到效果,這裡我把jenkins自由風格的專案先刪除

image.png | left | 826x659

配置pipeline專案 

丟棄就得構建和觸發器設定和自由風格專案設定步驟是一樣的

image.png | left | 826x516

設定Definition
第一種方法,直接在jenkins端填寫指令碼,這樣的弊端是出現錯誤後要gitlab端和jenkins端來回切換修改比較麻煩

image.png | left | 826x463

手動構建檢視效果

image.png | left | 826x414

構建成功,pipeline配置可以看到每一步的日誌,可以知道那個步驟出錯

image.png | left | 826x396

第二種配置方法

image.png | left | 826x596

gitlab端新建一個檔案,檔名稱和上面Script Path名稱保持一致

image.png | left | 826x547

這裡標註的名稱是檔名,jenkins,gitlab檔案還有指令碼內用裡的名稱一定要一致

image.png | left | 826x443

附上程式碼

pipeline{
agent any
stages{
    stage("get code"){
       steps{
            echo "get code"
       }
    }
    stage("unit test"){
       steps{
            echo "unit test"
} }
    stage("package"){
        steps{
            sh 'tar zcf /opt/web‐${BUILD_ID}.tar.gz ./*  --exclude=./git --exclude=./Jenkinsfile'
} }
    stage("deploy"){
        steps{
            sh 'ssh 10.0.0.7 "cd /code && mkdir web‐${BUILD_ID}"'
            sh 'scp /opt/web‐${BUILD_ID}.tar.gz 10.0.0.7:/code/web‐${BUILD_ID}'
            sh 'ssh 10.0.0.7 "cd /code/web‐${BUILD_ID} && tar xf web‐${BUILD_ID}.tar.gz && rm -rf web‐${BUILD_ID}.tar.gz"'
            sh 'ssh 10.0.0.7 "cd /code && rm -rf html && ln -s web‐${BUILD_ID} /code/html"'
        }
} }
}

做一下測試,還是修改主頁index.html內容,修改方式與上面測試上的步驟一樣
我們這裡修改成歡迎來訪張恩清部落格園

image.png | left | 826x555

image.png | left | 826x572

修改完成檢視jenkins和web端的效果

image.png | left | 826x341

image.png | left | 826x426

git+jenkins自動上線總結

image.png | left | 800x561.3394216133943

基本流程

客戶提出需求,公司進行分析,分析結束開發開始準備程式碼,公司內部測試程式碼,初步測試無誤後提交到gitlab伺服器上,然後通過jenkins伺服器推送到測試伺服器上,經過測試發現沒有任何問題以後就可以推送到生產環境上,如果出現bug,那麼開發人員將進行修改,修改完成提出合併請求交給開發經理(開發的老大)進行稽核,開發經理稽核通過後確認合併,然後gitlab通知jenkins伺服器觸發構建,然後到線上環境。
運維人員則是負責搭建和維護gitlab和jenkins伺服器,配合開發進行程式碼的上線。

宣告

此篇文章是本人經過層層實驗,多次操作,確保操作無誤,儘可能讓基礎較差的朋友可以按照文章步驟完成程式碼自動上線的操作,由於內容較多,排版和內容上可能會出現小的錯誤,大家可以積極指正,碼字不易,轉載請註明出處,謝謝。