• 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)
     
     
     

        

  • 相关阅读:
    生成实用包装码
    区分排序函数
    mysql优化
    高并发、大流量、大存储
    数据库的搬移
    linux查看系统日志及具体服务日志
    springboot拦截器实现
    使用ajax的get请求渲染html
    百度echarts折线图使用示例
    前端特殊符号转码
  • 原文地址:https://www.cnblogs.com/zshBlos/p/13511386.html
Copyright © 2020-2023  润新知