1. 程式人生 > >DEVOPS05 - Git倉庫、Jenkins搭建、應用Jenkins、管理應用伺服器

DEVOPS05 - Git倉庫、Jenkins搭建、應用Jenkins、管理應用伺服器

一、Jenkins基礎

1.1 Jenkins簡介

1.1.1 什麼是Jenkins

Jenkins是一款非常流行的CI(持續整合)軟體,用於構建和測試各種專案。

1.1.2 Jenkins特點

  1. 可以選擇安裝多種外掛,支援各種SCM(軟體配置管理)工具(如SVN、GIT、CVS等)
  2. 能夠構建各種風格的專案
  3. 安裝簡單,使用者介面友好

1.2 安裝Jenkins

1.2.1 rpm安裝Jenkins

rpm -ivh jenkins-2.121-1.1.noarch.rpm
systemctl star jenkins
systemctl enable jenkins

1.2.2 yum安裝Jenkins

yum install -y java-1.8.0-openjdk
wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat/jenkins.repo
rpm --import https://pkg.jenkins.io/redhat/jenkins.io.key
yum clean all
yum -y install jenkins
systemctl start jenkines

1.2.2 初始化Jenkins

1. Jenkins預設執行在8080埠

2.如果網速較快,選擇推薦外掛,否則選擇自定義,只選中GIT即可

3.直接使用admin管理使用者登入

4.安裝成功如下圖所示:

5.修改管理員密碼:admin->設定

二、準備git倉庫

2.1 初始化wordpress專案

1.解壓wordpress 4.8版本

[[email protected]    ~]#    unzip    wordpress-4.8-zh_CN.zip

2.初始化git倉庫

[[email protected]    ~]#    cd    wordpress/    
[

[email protected]    wordpress]#    git    init    
[[email protected]    wordpress]#    git    add    .    
[[email protected]    wordpress]#    git    commit    -m    "wordpress    init"    
[[email protected]    wordpress]#    git    status    
#    位於分支 master    
無檔案要提交,乾淨的工作區

2.2 tag標籤

1. 如果達到一個重要的階段,並希望永遠記住那個特別
的提交快照,可以使用 git tag 給它打上標籤
2.  將初始化完畢的wordpress打標籤v1.0

[[email protected]    wordpress]#    git    tag    v1.0

2.3 升級wordpress

1. 將wordpress新版本解壓到專案中

[[email protected]    wordpress]#    cd    ..    
[[email protected]    ~]#    unzip    wordpress-4.9-zh_CN.zip    
Archive:        wordpress-4.9-zh_CN.zip    
replace    wordpress/wp-mail.php?    [y]es,    [n]o,    [A]ll,    [N]one,    [r]ename:    A

2.4 更新git倉庫

1. 檢查git狀態

[[email protected]    ~]#    cd    wordpress/    
[[email protected]    wordpress]#    git    status    

2. 將更新/增加的檔案確認至倉庫

[[email protected]    wordpress]#    git    add    .    
[[email protected]    wordpress]#    git    commit    -m    "upgrade    to    new    version"    

2.5 新增標籤

1. 確認所有專案已提交

[[email protected]    wordpress]#    git    status    
#    位於分支 master    
無檔案要提交,乾淨的工作區

2. 為升級後的wordpress專案增加v2.0標籤

[[email protected]    wordpress]#    git    tag    v2.0

2.6 管理標籤

1. 檢視所有標籤

[[email protected]    wordpress]#    git    tag    
v1.0    
v2.0    

2. 切換至v1.0標籤

[[email protected]    wordpress]#    git    checkout    v1.0    
Note:    checking    out    'v1.0'.    

3. 切換到最新狀態

[[email protected]    wordpress]#    git    checkout    master    
之前的 HEAD    位置是 50984b1...    wordpress    init    
切換到分支 'master'    

三、gitlab遠端伺服器的搭建和使用

3.0 gitlab的搭建

配置node1作為gitlab伺服器
1、安裝docker
[[email protected] docker]# cd docker_pkgs/
[[email protected] docker_pkgs]# yum install -y *.rpm

2、啟動服務
[[email protected] docker_pkgs]# systemctl start docker
[[email protected] docker_pkgs]# systemctl enable docker

3、匯入映象
[[email protected] docker]# cd images/
[[email protected] images]# docker load < gitlab_zh.tar

4、將虛擬機器的ssh埠改為2222
[[email protected] ~]# vim /etc/ssh/sshd_config 
Port 2222
[[email protected] ~]# systemctl restart sshd
退出ssh,再重新連線
[[email protected] python]# ssh -p2222 192.168.4.1

5、啟動gitlab
[[email protected] ~]# docker run -d -h gitlab --name gitlab -p 443:443 -p 80:80 -p 22:22 --restart always -v /srv/gitlab/config:/etc/gitlab -v /srv/gitlab/logs:/var/log/gitlab -v /srv/gitlab/data:/var/opt/gitlab gitlab_zh:latest
說明: -h gitlab是設定容器的hostname主機名,--name gitlab是設定容器名字,也就是通過docker ps檢視到的名字;--restart always指的是出現問題重啟容器

6、gitlab關鍵概念
群組group:公司中每個團隊可以建立一個組
專案project:儲存程式碼的地方,裡面還包含問題列表、維基文件以及其他一些Gitlab功能
成員member:新增你的團隊成員或其他人員到Gitlab

7、gitlab上建立devops的組,建立core_py的專案,建立使用者。將使用者設定為專案的主程式設計師。

3.1 建立一個devops的群組

3.2 建立名為wordpress的專案

3.3 為wrodpress專案建立主程式設計師使用者

 

3.4 新使用者登陸重置密碼,然後設定ssh金鑰

3.5 上傳wordpress程式碼

1. 因為本地wordpress已經是git版本庫了,所以採用以下方式進行上傳:

[[email protected]    ~]#    cd    wordpress/    
[[email protected]    wordpress]#    git    remote    rename    origin    old-origin    
error:    不能重新命名配置小節 'remote.origin'    到 'remote.old-origin’    
上述錯誤可忽略    
[[email protected]    wordpress]#    git    remote    add    origin    [email protected]:devops/wordpress.git    
[[email protected]    wordpress]#    git    push    -u    origin    --all    
[[email protected]    wordpress]#    git    push    -u    origin    --tags

3.6 在網頁中檢視專案

1. 所有的tag可以通過http://192.168.113.139/devops/wordpress/tags訪問

四、jenkins的使用

4.1 構建專案

4.1.1 下載git外掛

1. 為了使得Jenkins可以使用git的tag,需要下載gitparameter外掛
2.  點選“系統管理”->“管理外掛”

4.1.2 建立自由風格專案

1. 新建任務

2. 選擇自由風格

4.1.3 設定引數

1. 新增Git Parameter引數

2.設定tag的名稱

4.1.4 原始碼管理

1. 原始碼採用git

2. 將原始碼checkout到子目錄

4.1.5 構建工程

1. 構建工程

2. 選擇指定的標籤

4.1.6 檢驗結果

1. 檢視控制檯日誌輸出

4.1.7 檢視本地結果

1. 構建好的專案出現在/var/lib/jinkens目錄下

[[email protected]    ~]#    cd    /var/lib/jenkins/workspace/    
[[email protected]    workspace]#    ls    
wpbuild    
[[email protected]    workspace]#    ls    wpbuild/    
wpress_v1.0

4.2 分發伺服器管理

4.2.1 優化構建工程思路

1. 在Jenkins伺服器上安裝apache,用於分發應用程式
2.  為了方便應用伺服器下載,Jenkins構建的工程應該打包成為一個檔案
3. 為了應用伺服器可以獲知下載的程式檔案是沒有損壞的,應該為其生成md5值

4.2.2 配置分發伺服器

1. 通過web服務為應用伺服器提供應用程式
2. 下載目錄為/var/www/deploy/packages

[[email protected]    ~]#    yum    install    -y    httpd    
[[email protected]    ~]#    mkdir    -pv    /var/www/html/deploy/packages    
[[email protected]    ~]#    chown    -R    jenkins.jenkins    /var/www/html/deploy/    
[[email protected]    ~]#    systemctl    start    httpd    
[[email protected]    ~]#    systemctl    enable    httpd

4.2.3 修改工程配置

1.為下載的應用打包,以及生成md5,可以增加構建步驟(執行shell命令)

2. 打包從gitlab遠端伺服器上拉取下來的專案資料夾,並計算md5值,把專案資料夾的壓縮包放到/var/www/html/deploy共享目錄下,方便應用伺服器拉取。

deploy_dir=/var/www/html/deploy/packages
cp -r mp_${mptag} $deploy_dir
rm -rf $deploy_dir/mp_${mptag}/.git
cd $deploy_dir
tar czf mp_${mptag}.tar.gz mp_${mptag}
rm -rf mp_${mptag}
md5sum mp_${mptag}.tar.gz | awk '{print $1}' > mp_${mptag}.tar.gz.md5

4.2.4 測試修改後的工程

1. 重新構建工程

2. 檢查分發伺服器的相關目錄

[[email protected]    ~]#    ls    /var/www/html/deploy/packages/    
wpress_v1.0.tar.gz        wpress_v1.0.tar.gz.md5    

[[email protected]    ~]#    cat    /var/www/html/deploy/packages/
wpress_v1.0.tar.gz.md5        
e4taef54a5f580b4e08d5245cc95268

4.2.5 分發伺服器版本控制思路

1. 由jenkines建立兩個版本檔案
–  live_version:記錄應用程式當前版本
–  last_version:記錄應用程式前一個版本
2.  應用伺服器可以檢視live_version和本機的最新版本做對比,決定是不是要釋出新版本
3.  如果新版本有問題,應用伺服器可以根據last_version回滾到前一版本

4.2.6 建立一個版本控制工程

1. 新建一個自由風格的專案

2.引數化構建過程選擇新增一個字元型別的引數

 

3.通過增加構建步驟來建立live_version和last_version檔案

 

附:shell命令如下:

deploy_dir=/var/www/html/deploy    #定義版本檔案的路徑
cd $deploy_dir
[ -f live_version ] && cat live_version > last_version  #如果有版本檔案,就把當前的live_version寫入到舊的last_version
echo ${mptag} > live_version     #如果沒有版本檔案,證明是第一次構建,就把當前的版本寫入到live_version 

值得注意的是 : 構建版本控制工程接收的字串應該來自於wp專案提交的版本號

4.2.7 執行版本控制工程

1. 寫入專案的版本號,開始構建。這個版本號取自專案中提交的版本號。

4.2.8 檢視構建結果

1. 因為是第一次構建,只會產生一個live_version檔案,並且版本號就是傳入的字串引數

[[email protected]    ~]#    ls    /var/www/html/deploy/    
live_version        packages    


[[email protected]    ~]#    cat    /var/www/html/deploy/live_version        
v1.0

五、管理應用伺服器

5.1 應用伺服器自動部署程式

5.1.1 需求:

當有新版本釋出,應用伺服器只要執行指令碼,就可以把分發伺服器(jenkines伺服器)的live_version版本的軟體包下載

下來,然後釋出,最後通過指定的域名訪問

5.1.2 實現思路:

1. 將分發伺服器的live_version和本地的live_version檔案對比。不一致就下載軟體包

2.解壓下載的最新檔案,並給這個資料夾做一個連結,這個連結會一直指向最新版本的資料夾

5.1.3 程式碼實現

import os,sys,requests,tarfile,hashlib

def check_version(remote_file,local_file):
    if  os.path.exists(local_file):
        remote_Version=requests.get(remote_file).text
        with open(local_file) as fobj:
            local_Version=fobj.read()

        print(remote_Version,local_Version)
        if remote_Version != local_Version:   #本地版本和遠端版本不一致返回True
            return True
        else:
            return False
    else:
        return True

#下載遠端伺服器最新檔案
def download(softUrl,dstFileName):
    soft=requests.get(softUrl)
    with open(dstFileName,'wb') as fobj:
        fobj.write(soft.content)   #把下載下來的資料寫入到目標檔案中去

def check_md5(md5_url,dstFileName):
    '檔案沒有損壞,返回True,否則返回False'
    r = requests.get(md5_url)
    m = hashlib.md5()
    with open(dstFileName, 'rb') as fobj:
        while True:
            data = fobj.read(4096)
            if not data:
                break
            m.update(data)
    if m.hexdigest() == r.text.strip():
        return True  # md5相同返回True,否則是False

    return False

def deploy(package,deployDir):  # tarfile 開啟,讀取,關閉
    os.chdir('/var/www/packages/')
    tar=tarfile.open(package,'r:gz')
    tar.extractall()
    tar.close()
    if os.path.exists('/var/www/html/mysit'):
        os.unlink('/var/www/html/mysite')
    os.symlink(deployDir,'/var/www/html/mysite')

if __name__ == '__main__':
       remote_verFile='http://192.168.5.14/deploy/live_version'
       local_verFile='/var/www/packages/live_version'
       versionResult=check_version(remote_verFile,local_verFile)
       if not versionResult:
           sys.exit(0)

       print('本地版本和伺服器端的版本不一致,正在下載...')
       remote_Version=requests.get(remote_verFile).text.strip()
       remote_LeastSoft_url='http://192.168.5.14/deploy/packages/mp_%s.tar.gz' % remote_Version
       local_SoftFile='/var/www/packages/mp_%s.tar.gz' % remote_Version

       download(remote_LeastSoft_url,local_SoftFile)  #下載伺服器端最新版的軟體到本地
       download(remote_verFile,local_verFile)         #下載伺服器端最新版的版本檔案到本地
       print('下載完成')
       #md5_url = 'http://192.168.5.14/deploy/packages/mp-%s.tar.gz.md5' % remote_Version
       # file_ok = check_md5(md5_url,local_SoftFile)  #檢驗本地的版本壓縮檔案是否和遠端對應版本的md5值一致
       # if not file_ok:  # 如果下載的檔案是損壞的,程式退出
       # sys.exit(1)
       local_DeployDir='/var/www/packages/mp_%s' % remote_Version
       deploy(local_SoftFile,local_DeployDir)
       print('部署完成,通過 firefox 192.168.5.254/mysite訪問最新版網頁')