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()  # 把额外的 删除,得到版本
        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)
 
 
 

    

原文地址:https://www.cnblogs.com/zshBlos/p/13511386.html