python實現 CI/CD(jenkins+gitlab)


一、安裝Python(我裝的python3.6.4)

  (一)裝包、解tar包 編譯 安裝

    yum install -y gcc gcc-c++ zlib-devel openssl-devel readline-devel libffi-devel sqlite-devel tcl-devel tk-devel

  (二)配置pip(國內鏡像 我使用的是豆瓣的)

    mkdir ~/.pip

    vim ~/.pip/pip.conf   

    [global]
    index-url = http://pypi.douban.com/simple
    [install]
    trusted-host=pypi.douban.com

二、安裝jenkins

  下載地址:wget https://pkg.jenkins.io/redhat-stable/jenkins-2.204.1-1.1.noarch.rpm

  (一)安裝 rpm  -iv jenkins-2.204.1-1.1.noarch.rpm    啟動 

  (二)Jenkins 默認端口為8080   web打開 http://ip:8080 

    1. 

 

 

     

 

      復制上面的目錄查看初試密碼  cat /var/lib/jenkins/secrets/initialAdminPassword

      2.選擇插件安裝 

        

 

      3.選擇無 不安裝任何插件 點擊安裝  Jenkins的 初試插件地址是官方的 下載很慢

        

 

 

     4.選擇admin賬戶繼續

      

    5.保存完成 。開始使用jenkins,更改密碼可以點擊右上方admin -> 設置 -> 進行密碼設置

 

    6.

      

       

 

 

 

 

       

              修改 下載站點為清華站點(也可以更改為其他的站點)    https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json  點擊提交

    7.下載插件

      (1)ssh  

      (2)git  Parameter   

      (3)Localization: Chinese (Simplified)

    點擊安裝,點擊下方小正方形 

      

 

    8. 返回首界面開始構建任務,給任務起一個名字,選擇自由風格的項目

       

    9. 選擇 參數化構建過程,選擇git參數

     

 

 

     10.使用http的協議  如果是ssh的 需要密鑰 下面$web 就是上面git 參數的名字 構建的名字 會以傳參的形式 創建

      目錄名字比如( tags:1.0  名字是web-1.0)

      

 

 

     11.構建使用shell  執行下面的shell語句

           

          
       deploy_dir = /var/www/html/deploy/pkgs #定義變量       cp -r  web-$web $deploy_dir #拷貝軟件目錄到web目錄       cd $deploy_dir #切換到web目錄       rm  -rf  web-$web  /.git #刪除版本庫文件       tar czf web-$web.tar.gz  web-$web #打包壓縮       rm  -rf web-$web #刪除軟件目錄,只保留壓縮包       md5sum web-$web.tar.gz  | awk   '{print $1}'  > web-$web.tar.gz.md5 #計算壓縮包的md5值       #生成last_ver和live_ver文件       cd..       [ -f  live_ver  ] &&  cat   live_ver > last_ver       echo  $webver  > live_ver

 

    

 

 

     12.點擊build  with  Parameters  

      

 

 

 

二、安裝gitlab (我用的是 docker 鏡像)

  (一)安裝docker 

   導入鏡像。運行   -p 映射端口  -v 映射目錄

    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 鏡像

 

   (二)進入之后 點擊左上的扳手  創建項目 創建用戶 創建組 

    每次上傳代碼的時候都需要 密碼 可以點擊右上方的 用戶頭像設置 有ssh密鑰

    創建密鑰 ssh-keygen  -f /root/.ssh/id_ras  -N ''

    把/root/.ssh/id_ras.pub 文件中的 內容全部復制在 ssh密鑰框中那

    (1)創建組

    (2)創建項目

      為組創建項目 下面又運行 gitlab的 命令 可根據自己的情況運行下面命令

    (3)創建用戶

    

      在上傳代碼的時候 記得吧 tags 一起上傳 就是最后這么命令   git push  -u origin --tags

(三)在服務器上編寫代碼 

    自動部署
    /var/www/download  :保存下載的壓縮包
    /var/www/deploy      : 保存live_ver文件和解壓目錄
    /var/www/html/nsd1906  :指向發布的應用目錄
    回滾思路
    取出last_ver版本號,賦值給ver
    構建本地目錄 '/var/www/deploy/website-%s' % ver
    把 /var/www/html/nsd1906 刪除
    創建軟鏈接
    
 
    自動部署的python代碼(注意wget requests 這兩個模塊都是沒有的需要自己pip install  下載)
 
    import wget
    import os
    import requests
    import hashlib
    import tarfile

    def has_new_ver(ver_url, ver_fname):
       # '有新版本返回True,否則返回False'
        # 如果本地沒有版本文件,則為True
        if not os.path.isfile(ver_fname):
            return True

        # 取出本地版本
        with open(ver_fname) as fobj:
            local_ver = fobj.read()

        # 本地版本與網上版本比較,如果不一致返回True
        r = requests.get(ver_url)
        if local_ver != r.text:
            return True
        else:
            return False

    def file_ok(md5_url, fname):
       # '如果文件已損壞返回False,否則返回True'
        # 計算本地文件的md5值
        m = hashlib.md5()
        with open(fname, 'rb') as fobj:
            while 1:
                data = fobj.read(4096)
                if not data:
                    break
                m.update(data)

      # 取出網上的md5值,進行比較
        r = requests.get(md5_url)
        if m.hexdigest() == r.text.strip():
            return True
        else:
            return False

    def deploy(app_fname):
       # '部署軟件'
        deploy_dir = '/var/www/deploy'
        dest = '/var/www/html/nsd1906'
        # 解壓
        tar = tarfile.open(app_fname)
        tar.extractall(path=deploy_dir)
        tar.close()

        # 取出軟件目錄名
        app_dir = app_fname.split('/')[-1]
        app_dir = app_dir.replace('.tar.gz', '')  #把 .tar.gz 變為空值
        app_dir = os.path.join(deploy_dir, app_dir)

        # 如果目標鏈接文件已存在,先刪除
        if os.path.exists(dest):
            os.remove(dest)

        # 創建軟鏈接
        os.symlink(app_dir, dest)


    if __name__ == '__main__':
        # 判斷是否有新版本,沒有則退出
        ver_url = 'http://192.168.4.6/deploy/live_ver'
        ver_fname = '/var/www/deploy/live_ver'
        if not has_new_ver(ver_url, ver_fname):
            print('未發現新版本。')
            exit(1)

        # 下載新版本軟件
        r = requests.get(ver_url)
        ver = r.text.strip()  # 把額外的\n刪除,得到版本
        app_url = 'http://192.168.4.6/deploy/pkgs/web-%s.tar.gz' % ver   #ip為web服務器的ip
        down_dir = '/var/www/download'
        wget.download(app_url, down_dir)
  
        # 校驗。如果下載的文件已損壞,刪除它
        md5_url = app_url + '.md5'
        app_fname = app_url.split('/')[-1]
        app_fname = os.path.join(down_dir, app_fname)
        if not file_ok(md5_url, app_fname):
            os.remove(app_fname)
            print('文件已損壞。')
            exit(2)

        # 部署軟件
        deploy(app_fname)

        # 更新live_ver文件的版本
        if os.path.exists(ver_fname):
            os.remove(ver_fname)

        wget.download(ver_url, ver_fname)
 
 
 

 

 

 

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM