zoukankan      html  css  js  c++  java
  • Jenkins+gitlab+sonarqube

    1、持续集成

    • 开发人员将会频繁的提交代码到主干,这些新提交在最终合并到主线之前,都需要通过编译和自动化测试流进行验证。这样做是基于之前,目的是让产品可以快速迭代,同时还能保持高质量,简化工作流程

    2、持续交付

    • 持续交付就是讲我们的应用发布出去的过程。这个过程可以确保我们尽可能快的实现交付。这就意味着除了自动化测试,我们还需要有自动化的发布流,以及通过一个按键就可以随时随地实现应用的部署上线。 通过持续交付,可以决定每天,每周,每两周发布一次,这完全可以根据自己的业务进行设置。 但是,如果真的希望体验持续交付的优势,就需要先进行小批量发布,尽快部署到生产线,以便在出现问题时方便进行故障排除;简单来说就是让通过持续集成后的代码可以部署、持续重复前者动作

    3、持续部署

    • 基于交付集成之上,无论何时代码都是能部署并且没有问题的

    4、持续集成实现的思路 git jenkins shell

    5、版本控制系统

    • 将文件的每一次变化集中在一个系统中加以版本记录,以便后续查阅文件的历史版本记录 系统

    • 常见版本控制系统

      • svn 集中式
        • 依赖于网络
      • git 分布式
        • 不依赖网络
    • git版本控制

      • 环境准备 git gitlab

      • 基本使用

        [root@git ~]# yum -y install git
        [root@git ~]# git config global user.name "test"
        [root@git ~]# git config global user.email "test@163.com"
        [root@git ~]# git config global color.ui true
      • 创建本地仓库

        [root@git ~]# mkdir demo
        
        #实战一、提交目录文件到本地仓库
        touch file{1..3}
        git status 
        git add .
        git commit -m "描述信息"
        
        #实战二、git文件改名并重新提交本地仓库
        git mv file1 file
        git status
        git commit -m "修改file1名称为file"
        
        #比对文件差异
        git diff file1 ##本地和暂存区之间的差异
        git diff --cached file1 ##暂存区和本地仓库的区别
        

      git回退 git commit (快照)
    ##暂存区覆盖本地(误操作提交暂存区)
    git add .
    git status
    git reset HEAD file1
    git checkout file1
    
    ##查看已提交仓库的历史
    git log --oneline    git reflog
    git reset --hard id号

    创建分支
    [root@git demo]# git branch dev
    [root@git demo]# git branch
      dev
    * master
    [root@git demo]# git checkout dev
    [root@git demo]# git branch dev
    [root@git demo]# git branch
      dev
    * master
    [root@git demo]# git checkout dev
    Switched to branch 'dev'
    [root@git demo]# git branch
    * dev
      master
    合并分支
    [root@git demo]# git merge master
    Already up-to-date.
    删除分支
    [root@git demo]# git branch dev -d

    • git标签

      打tag
      
      [root@git demo]# git tag -a "v1.0" -m "描述"
      [root@git demo]# git tag
      v1.0
      查看标签内容
      [root@git demo]# git show v1.0
      tag v1.0
      Tagger: test <15235613543@163.com>
      Date:   Sat May 16 08:00:28 2020 -0700
      
      项目创建
      
      commit 1e1e8e9af1a3b5417c047d38595771ed430ccc1c
      Author: test <15235613543@163.com>
      Date:   Sat May 16 03:19:58 2020 -0700
      :
      删除标签
      [root@git demo]# git tag -d v1.0
      Deleted tag 'v1.0' (was b811d4d)
      [root@git demo]# git tag
    • git远程仓库

      登录码云创建仓库 选择ssh连接 点设置上传公钥

      [root@git demo]# ssh-keygen 
      [root@git demo]# cat /root/.ssh/
      authorized_keys  id_rsa           id_rsa.pub       
      [root@git demo]# cat /root/.ssh/id_rsa.pub 
      ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC74DWuQPv/dGe5AsZyXcoInyfAiqrOjHtRRaKqrVhJ6GiE1XXzsyQPN2Z954OlLvmmD/WvcM733bGA/clMABnxkm+IeBrGl5SLY9I//jMVjPhqBPlIF1XwESEisO/smuSsro1Ewg7uySHbNkFZzJqXWcHliB9fGsrA40varJ0Yv2IOyAwRbKImXlCOtE0+48zwQoAzdHJs+tp/exZajTOrnR5m7GOmgU3PusGZpnIYBS/uDOEAMshWDX0vXt1oLGiB1d4MXAm7f9oePHUY/f9RyO+cKmNghCdBrmXAMBtB4s2DoT3soOtOz79pQQg4yu3v2LSLK1OSPWNlU7rUgnL9 root@git
      添加远程连接用户
      git remote add origin git@gitee.com:gou_jinyang/test-lianxi.git
      推送master到远程仓库
      git push -u origin master
      删除远程仓库
      [root@git demo]# git remote remove origin(用户名称)
      克隆远程仓库
      [root@git demo]# git clone git@gitee.com:gou_jinyang/test-lianxi.git
      查看别人提交
      [root@git demo]# git pull origin master

    • git与github关联

    • gitlab仓库

    搭建gitlab 清华大学源下载gitlab安装包 清华源:https://mirror.tuna.tsinghua.edu.cn/

    1、安装依赖

      yum -y install curl postfix policycoreutils-python openssh-server wget
    

    2、下载gitlab服务,并安装

      yum localinstall 安装包  yum自动解决依赖问题
    

    3、配置gitlab服务、访问域名及邮箱

    vim /etc/gitlab/gitlab.rb
    external_url 'http://gitlab.test.com'
    
    #配置邮箱
    gitlab_rails['gitlab_email_enabled'] = true
    gitlab_rails['gitlab_email_from'] = '1120633815@qq.com'
    gitlab_rails['gitlab_email_display_name'] = 'goujinyang-test-gitlab'
    
    gitlab_rails['smtp_enable'] = true
    gitlab_rails['smtp_address'] = "smtp.qq.com"
    gitlab_rails['smtp_port'] = 465
    gitlab_rails['smtp_user_name'] = "1120633815@qq.com"
    gitlab_rails['smtp_password'] = "cmyxycuvzweghdcb"
    gitlab_rails['smtp_domain'] = "qq.com"
    gitlab_rails['smtp_authentication'] = "login"
    gitlab_rails['smtp_enable_starttls_auto'] = true
    gitlab_rails['smtp_tls'] = true
    
    #默认开启普罗米修斯监控会很占内存 关闭
    prometheus['enable'] = false

    4、初始化git服务、启动gitlab服务

      [root@git ~]# gitlab-ctl reconfigure
      [root@git ~]# gitlab-ctl start | restart | status | stop
    

    ##ps:每次修改/etc/gitlab/gitlab.rb 都需要 reconfigure

    ######192.168.53.130gitlab服务登录密码为:123123123
    
    突然忘记了gitlab的登陆用户密码,
    
    进入gitlab 后台控制台,等到打开ruby控制界面,有点慢
    
    # gitlab-rails console production
    修改用户密码:
    
    1、> user=User.where(username: "root").first             [ username / email ]
    => #<User id:1 @root>        【进入root用户,若出现=> nil   则表示没有这个用户】
    
    2、> user.password=123123123     [此处用纯数字,至少8位]
    
    3、> user.save!
    
    4、> quit

           成功。

    在这里插入图片描述

    5、访问gitlab服务、以及gitlab邮箱测试

    6、汉化包地址:https://gitlab.com/xhang/gitlab

    #查看版本、到网站下载对应汉化包
    [root@git ~]# rpm -qa |grep gitlab
    gitlab-ce-12.2.0-ce.0.el7.x86_64
    
    [root@git ~]# tar xf gitlab-v12.2.0-zh.tar.gz 
    [root@git ~]# cd gitlab-v12.2.0-zh/
    [root@git gitlab-v12.2.0-zh]# cat VERSION 
    12.2.0
    #停止gitlab服务
    [root@git ~]# gitlab-ctl stop
    #中文版覆盖英文版
    [root@git ~]# cp -r gitlab-v12.2.0-zh/* /opt/gitlab/embedded/service/gitlab-rails/            #可能会出现log、tmp两个错误 忽略就可以
    [root@git ~]# gitlab-ctl start        #立即刷新页面会502,因为代理的nginx启动了后端还没有,过一会儿就可以了
    
    #页面修改字符集为简体中文就OK,汉化完成

    7、用户、组、项目

      • 创建组
      • 创建项目------>项目隶属于某个组
      • 创建用户设定密码,为用户分配组

      注意,公司中一般要关闭用户注册。禁止用户自己注册账号

    8、gitlab备份与恢复

    vim /etc/gitlab/gitlab.rb
    默认存放备份站点目录    
    # gitlab_rails['backup_path'] = "/var/opt/gitlab/backups"
    默认保存时间
    # gitlab_rails['backup_keep_time'] = 604800
    
    手动备份命令
    [root@git csms_project]# gitlab-rake gitlab:backup:create    备份在了自己设置的目录
    [root@git ~]# cd /var/opt/gitlab/backups/
    [root@git backups]# ls
    1595490539_2020_06_23_12.2.0_gitlab_backup.tar
    数据恢复
    #停止数据写入
    [root@git csms_project]# gitlab-ctl stop unicorn
    [root@git csms_project]# gitlab-ctl stop sidekiq
    #恢复数据
    [root@git csms_project]# gitlab-rake gitlab:backup:restore BACKUP=1595490539_2020_06_23_12.2.0    备份成功的包名称
    #### ps:BACKUP=时间戳加版本号  后缀不用写
    ####
    gitlab tail 看所有日志
    • jenkins

      • jenkins是做什么的

        • Jenkins是一个持续集成的工具,是由Java开发而成
        • Jenkins就是一个调度平台,本身不处理任何事情,调用插件来完成所有的工作
      • Jenkins能将各种开源的软件进行集成

    • jenkins安装

      #安装jdk
      yum -y install java
      安装参考官网
      yum localinstall jenkins-2.222.3-1.1.noarch.rpm	//下载好包使用yum安装
      
      systemctl start jenkins
      修改Jenkins启动用户,保证有使用各插件的权限
      vim /etc/sysconfig/jenkins
      	JENKINS_USER="root"
      //	/var/lib/jenkins/plugins/	#此目录为Jenkins插件目录
      
    • Jenkins汉化

    • Jenkins插件 加速插件 安装插件 导入已有的插件

    在这里插入图片描述

      • 2、手动上传.hpi的插件

    在这里插入图片描述

      • 3、导入本地已安装的插件(版本一致)

    • Jenkins集成gitlab

      • 下载gitlab相关插件
    插件名称插件作用
    Credentials Plugin 允许在Jenkins中存储认证得凭据
    Git Client Plugin 允许Jenkins使用Git
    Git Plugin 允许Jenkins集成Git
    Gitlab Plugin 允许Gitlab触发Jenkins构建并在Gitlab中显示
    Gitlab Hook 允许Gitlab自动触发Jenkins构建项目
    Gitlab Authentication Plugin Gitlab身份验证插件
    • 创建任务—源码管理—选择git—添加密钥

    • 手动搭建一套集群环境,实现代码上线 nginx代理两个后端

    • maven 将Java的源代码—编译成 war包 手动部署上线

      maven编译时候会下载一堆jar包,可以指定国内源会比较快

      vim /usr/share/maven/conf/settings.xml
      	159	<mirror>
      	160		<id>alimaven</id>
      	161		<name>aliyun maven</name>
      	162   	<url>http://maven.aliyun.com/nexus/content/groups/public/</utl>
      	163		<mirror0f>central</mirror0f>
      	164	</mirror>
      
      手动部署maven
      # git clone git@gitlab.test.com:dev-test/profit-test.git
      # cd profit-test/
      # mvn package -Dmaven.test.skip=true    #跳过测试用例编译成war包
    • 构建java项目 源码包 jar war

    • jenkins集成maven 下载插件 maven integration plugin

      配置maven安装位置,JDK位置等

    在这里插入图片描述

    PS:红框中得参数有时候开发会给

    • Jenkins自由风格项目 shell

    • Jenkins构建项目

      • 上线脚本 (粗糙)

      • 优化脚本,让其支持传参 git tag

      • 优化脚本让其支持回退功能

      • 优化脚本让其无法实现重复构建一个

      • 使用tag方式发布 Git Parameter

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    • 重复部署怎么办(脚本为html前端项目)

    • #!/bin/env bash
      DATE=$(date +%Y-%m-%d-%H-%M-%S)
      web_server="192.168.53.7 192.168.53.8"
      Sdir=/opt
      Ddir=/code
      Name=${DATE}-${git_version}
      #1、进去项目目录,将内容进行打包
      get_code(){
              cd ${WORKSPACE} && 
              tar czf ${Sdir}/web-${Name}.tar.gz ./*
      }
      #2、将内容scp拷贝至web集群组
      scp_web_server(){
              for host in $web_server
              do
              scp ${Sdir}/web-${Name}.tar.gz root@$host:${Sdir}
              ssh root@$host "mkdir -p ${Ddir}/web-${Name} && 
                              tar xf ${Sdir}/web-${Name}.tar.gz -C ${Ddir}/web-${Name}
                              rm -rf ${Ddir}/web && 
                              ln -s ${Ddir}/web-${Name} ${Ddir}/web"
              done
      }
      
      back(){
      back_file=(ssh root@${host} "find /code/  -maxdepth 1 -type d -name "web-*-${git_version}"")
              for host in $web_server
              do
              ssh root@$host "rm -rf ${Ddir}/web && 
                              ln -s ${back_file} ${Ddir}/web"
              done
      
      }
      deploy(){
              get_code
              scp_web_server
      }
      #判断之前是否部署过该版本得commit,如果没有则部署,如果有则提示,然后退出
      #如果是回退,则不受限制    Jenkins任务里需要配置选项参数 deploy_env
      if [ $deploy_env == "deploy" ];then
              if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then
                      echo "你已经部署过该${git_version} 版本"
                    exit 1
              else
                    deploy
      elif [ $deploy_env == "rollback" ];then
                back
      fi
    • 构建项目 html php

    • 完整上线的脚本 部署和回滚(后端java项目脚本)

    • #!/bin/env bash
      DATE=$(date +%Y-%m-%d-%H-%M-%S)
      web_server="192.168.53.7 192.168.53.8"
      Sdir=/opt
      Ddir=/soft/tomcat/webapps
      Name=${DATE}-${git_version}
      #1、进去项目目录,将内容进行打包
      get_code(){
          cd ${WORKSPACE} 
      }
      #2、将内容scp拷贝至web集群组
      scp_web_server(){
          for host in $web_server
          do
          scp /target/*.war root@$host:/opt/ROOT-${Name}.war
          ssh root@$host "mkdir -p ${Ddir}/ROOT-${Name} && 
                  unzip /opt/ROOT-${Name}.war -d ${Ddir}/ROOT-${Name}
                  rm -rf ${Ddir}/ROOT && 
                  ln -s ${Ddir}/ROOT-${Name} ${Ddir}/ROOT"             
          done
      }
      
      back(){
      back_file=(ssh root@${host} "find ${Ddir}  -maxdepth 1 -type d -name "ROOT-*-${git_version}"")
              for host in $web_server
              do
              ssh root@$host "rm -rf ${Ddir}/ROOT && 
                              ln -s ${back_file} ${Ddir}/ROOT"
              done
      
      }
      deploy(){
          get_code
          scp_web_server
      }
      
      if [ $deploy_env == "deploy" ];then
          if [ ${GIT_COMMIT} == ${GIT_PREVIOUS_SUCCESSFUL_COMMIT} ];then
                      echo "你已经部署过该${git_version} 版本"
                  exit 1
          else
              deploy
          fi
      elif [ $deploy_env == "rollback" ];then
          back
      
      fi
    • Jenkins通知机制

      • 邮件
      • 钉钉
    • 拿到源代码后需要进行质量扫描

      • sonarqube

        • 安装sonarqube

          依赖于Java首先安装jdk1.8以上

          安装数据库 MySQL得话需要5.6版本以上

          #数据库安装完成之后
          msyql -uroot -p123123 -e "crecte databases sonar default charecter set utf8;"
          
      • 下载好sonarqube,并解压到/usr/local/下

        ##官方地址	注意 sonarqube7.9以后不支持MySQL数据库,所以项目暂时使用7.0版本
        https://www.sonarqube.org/downloads/
        [root@sonar ~]# unzip sonarqube-7.0/.zip -d /usr/local/
        [root@sonar ~]# useradd sonar
        [root@sonar ~]# chown -R sonar.sonar /usr/local/sonarqube-7.0/
        [root@sonar ~]# ln -s /usr/local/sonarqube-7.0/ /usr/local/sonarqube
        [root@sonar ~]# chown -R sonar.sonar /usr/local/sonarqube
      • 修改sonarqube连接数据库配置文件

        [root@sonar ~]# vim /usr/local/sonarqube/conf/sonar.properties
         18 sonar.jdbc.username=root
         19 sonar.jdbc.password=123123
         26 sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=m    axPerformance&useSSL=false
        
      • 启动sonarqube 注意需要普通用户启动

        su - sonar -c "/usr/local/sonarqube/bin/linux-x86-64/sonar.sh start"
        
        [root@sonar ~]# netstat -anpt |grep 9000
        tcp6       0      0 :::9000                 :::*                    LISTEN      2692/java

        登录,账号/密码 默认:admin/admin

      • 安装汉化插件

        1、页面找到Administration–》Marketplace–》搜索框chinese,出现一个chinses pack。然后点击install

        2、页面会提示reset重启 sonarqube,重启再次打开则为汉化

    在这里插入图片描述

    所需插件都可在此安装
    
    ```shell
    /usr/local/sonarqube/extensions/plugins/	//sonarqube插件目录
    ```
    
    客户端工具sonar-scanner
    
    https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/
    
    maven项目			//登录时生成
    mvn sonar:sonar 
      -Dsonar.host.url=http://sonar.test.com:9000 
      -Dsonar.login=d8d3213bd704238ffeaac08da26beddac96c87a4	//Jenkins toCken令牌,登录时生成
      
    php
    sonar-scanner 
      -Dsonar.projectKey=php 
      -Dsonar.sources=. 
      -Dsonar.host.url=http://sonar.test.com:9000 
      -Dsonar.login=d8d3213bd704238ffeaac08da26beddac96c87a4
    
    sonar-scanner 
      -Dsonar.projectKey=html 
      -Dsonar.sources=. 
      -Dsonar.host.url=http://sonar.test.com:9000 
      -Dsonar.login=d8d3213bd704238ffeaac08da26beddac96c87a4 
    
    • jenkins服务器安装sonar-scannerc

      unzip sonar-scanner-cli-4.0.0.1744-linux.zip -d /usr/local/
      ln -s /usr/local/sonar-scanner-4.0.0.1744-linux/ /usr/local/sonar-scanner
      cd /usr/local/sonar-scanner
      vim conf/sonar-scanner.properties 
              sonar.host.url=http://sonar.test.com:9000    //指定服务端
              sonar.login=d8d3213bd704238ffeaac08da26beddac96c87a4    //toCken    默认服务端不开启验证,需手动开启
              sonar.sourceEncoding=UTF-8    //字符集

      手动开启认证:配置–》权限–》开启并保存

    在这里插入图片描述

    手动扫描
    [root@jenkins maven]# #cd /var/lib/jenkins/workspace/项目目录(这里假如是html项目,执行如下)
    /usr/local/sonar-scanner/bin/sonar-scanner 
      -Dsonar.projectKey=html 
      -Dsonar.sources=. 
    
    maven项目扫描
    [root@jenkins maven-tom]#cd /var/lib/jenkins/workspace/maven-tom
    [root@jenkins maven-tom]# mvn sonar:sonar   -Dsonar.host.url=http://sonar.test.com:9000   -Dsonar.login=d8d3213bd704238ffeaac08da26beddac96c87a4
    
    使用sonar工具扫描java项目
    [root@jenkins maven-tom]#cd /var/lib/jenkins/workspace/maven-tom
    [root@jenkins maven-tom]# /usr/local/sonar-scanner/bin/sonar-scanner 
    >   -Dsonar.projectKey=java 
    >   -Dsonar.sources=.

    在这里插入图片描述

    • 手动将代码推送至sonarqube测试

      • Jenkins集成sonarqube

        下载插件----系统配置-----配置----添加Jenkins-tocken

        插件SonarQube Scanner for Jenkins

        a:Name随便填写

        b:URL添加sonarqube得地址

        c:token添加Secret text 填写之前安装sonarqube得token

    在这里插入图片描述

      同时还需要再Jenkins上配置Sonar-scanner工具路径
      
      系统管理---全局工具配置(告诉Jenkins sonarscanner在哪个路径)
      
      a:Name可以随便填写,但最好规范
      
      b:SONAR_RUNNER_HOME填写sonar-scanner本地路径	//如果不配置则无法进行扫描
    

    在这里插入图片描述

    • Jenkins流水线pipeline
    • pipeline基本语法
      • 所有代码包裹在pipeliine{}层内

      • agent{}定义任务在那台主机上运行,可以是any、none等

      • environment{}变量名称=变量值,用于定义环境变量,比如PATH路径等

      • stages{}类似一个大项目的集合,主要用来包含所有stage子任务

      • stage{}类似于一个项目中的单个任务,主要用来包含setup{}子层

      • setps{}用来实现具体执行的动作

        pipeline {
            agent    any
            //agent { label 'slave1' }    指定某个从节点运行job
            //任务集合
            stages {
                stage('代码获取') {
                    steps {
                        echo "get code is ok"
                    }
                }
                stage('代码质检') {
                    steps {
                        echo "check code is ok"
                    }
                }
                stage('代码构建') {
                    steps {
                        echo "build is ok"
                    }
                }
                stage('代码部署') {
                    steps {
                        echo "deploy is ok"
                    }
                }
                
            }
        
        }

        构建测试

    在这里插入图片描述

    • pipeline实现html项目流水线部署

    • pipeline实现Java流水线部署

    • jenkins分布式构建

      • 系统管理–》节点管理–》新建节点

        注意Jenkins master节点有的工具slave也得有当然包括部署脚本域名解析、密钥等,除了Jenkins

    在这里插入图片描述

    下面工具配置

    在这里插入图片描述

    • Jenkins权限控制

  • 相关阅读:
    IE的if条件判断
    嵌套div的margin-top不生效
    DocumentFragment对象
    javascript严格模式
    某视频网站下载分析
    c# winform 视频转字符动画
    asp.net mvc 5 蛋疼的问题
    asp.net mvc 防止重复提交
    easyHOOK socket send recv
    C# 之泛型详解
  • 原文地址:https://www.cnblogs.com/goujinyang/p/13125393.html
Copyright © 2011-2022 走看看