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服务,并安装

  下载地址:https://packages.gitlab.com/gitlab/gitlab-ce?page=1
  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

           服务器上安装maven  yum install maven -y

# 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,重启再次打开则为汉化

在这里插入图片描述

所需插件都可在此安装
/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权限控制

posted @ 2020-06-09 15:07  太阳的阳ฅ  阅读(754)  评论(0编辑  收藏  举报