小工具知识网

当前位置: 首页 > 行业知识 > DevOps概念及搭建全过程(Jenkins、Harbor、SonarQube、K8s)

行业知识

DevOps概念及搭建全过程(Jenkins、Harbor、SonarQube、K8s)

2026-10-19 19:04:57 来源:互联网转载

DevOps入门及过程搭建

在如今互联���的格局下,抢占市场变得尤为重要,因此敏捷开发越来越被大家所推崇。于是,慢慢的有了DevOps这个概念,大致意思是开发-运维一体化。

1 DevOps概念

1.1 基本概念

可以看到上图是一个无穷大的一个符号,Dev对应开发,Ops对应运维。

  • DevOps的方式可以让公司能够更快地应对更新和市场发展变化,开发可以快速交付,部署也更加稳定。
  • 核心就在于简化Dev和Ops团队之间的流程,使整体软件开发过程更快速。

    1.2 流程

    DevOps的开发过程及常用工具:

    整体的软件开发流程包括:

    • PLAN:开发团队根据客户的目标制定开发计划
    • CODE:根据PLAN开始编码过程,需要将不同版本的代码存储在一个库中。
    • BUILD:编码完成后,需要将代码构建并且运行。
    • TEST:成功构建项目后,需要测试代码是否存在BUG或错误。
    • DEPLOY:代码经过手动测试和自动化测试后,认定代码已经准备好部署并且交给运维团队。
    • OPERATE:运维团队将代码部署到生产环境中。
    • MONITOR:项目部署上线后,需要持续的监控产品。
    • INTEGRATE:然后将监控阶段收到的反馈发送回PLAN阶段,整体反复的流程就是DevOps的核心,即持续集成、持续部署。

      总的来说就是:

      1. Code阶段(编码):Git+GitLab
      2. Build阶段(构建):Maven或Gradle
      3. Operate(运行):Docker
      4. Integrate(集成):Jenkins
        • CI/CD(持续集成):操作Jenkins,编写对应脚本文件
        • Code review(代码质量检测):Jenkins集成Sonar Qube
        • 自定义镜像:Harbor
        • Jenkins流水线操作
        • WebHook:通知操作,如:钉钉机器人通知
        • K8S编排:更加方便我们管理容器

      2 搭建DevOps环境

      本项目全部采用docker安装,如果服务器上没有docker环境的,

      参考:https://editor.csdn.net/md/?articleId=127816970安装即可。

      • 也可以参考本文档的2.2 Docker 章节

        2.1 GitLab

        在项目的Code(编码)阶段,我们需要将不同版本的代码存储到一个仓库中,常见的版本控制工具就是SVN或者Git,这里我们采用Git作为版本控制工具,GitLab作为远程仓库。

        git的安装:参考官网,无脑下一步即可官网地址:https://git-scm.com/

        GitLab安装:

        1. 查看docker上gitlab的镜像,并拉取
        # 查看镜像docker search gitlab# 拉取镜像docker pull gitlab/gitlab-ce
        1. 准备docker-compose.yml文件

        文档中的external_url等参考自己服务器上的ip

        version: '3.1'services:  gitlab:    image: 'gitlab/gitlab-ce:latest'    container_name: gitlab    restart: always    environment:      GITLAB_OMNIBUS_CONFIG: |        external_url 'http://192.168.11.11:8929'        gitlab_rails['gitlab_shell_ssh_port'] = 2224    ports:      - '8929:8929'      - '2224:2224'    volumes:      - './config:/etc/gitlab'      - './logs:/var/log/gitlab'      - './data:/var/opt/gitlab'
        1. 启动容器,并访问
        # 启动容器docker-compose up -d

        访问:http://192.168.11.11:8929即可。

        效果:

        4. 查看初始的用户名和密码

        docker exec -it gitlab cat /etc/gitlab/initial_root_password

        5. 登录并修改密码

        以root身份登录gitlab,首次登录需要修改密码

        然后我们就可以像GitHub、Gitee一样操作GitLab了

        2.2 Docker

        构建Java项目的工具一般有两种选择,一个是Maven,一个是Gradle。

        • 这里我们选择Maven作为项目的编译工具。
        • 具体安装Maven流程不做阐述,但是需要确保配置好Maven仓库私服以及JDK编译版本。

          部署过程,会采用Docker进行部署,暂时只安装Docker即可,后续还需安装Kubenetes

          2.2.1 Docker安装

          ①准备测试环境&生产环境

          ②下载Docker依赖组件

          yum -y install yum-utils device-mapper-persistent-data lvm2

          ③设置下载Docker的镜像源为阿里云

          yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

          ④安装docker服务

          yum -y install docker-ce

          ⑤设置docker开机自启

          # 启动Docker服务systemctl start docker# 设置开机自动启动systemctl enable docker

          ⑥测试安装成功

          docker version
          2.2.2 Docker-compose安装
          • 下载Docker/Compose:https://github.com/docker/compose

          • 将下载好的docker-compose-Linux-x86_64文件移动到Linux操作系统:……

          • 设置docker-compose-Linux-x86_64文件权限,并移动到$PATH目录中

            # 设置文件权限chmod a+x docker-compose-Linux-x86_64# 移动到/usr/bin目录下,并重命名为docker-composemv docker-compose-Linux-x86_64 /usr/bin/docker-compose

            2.3 Jenkins

            2.3.1 介绍

            在DevOps中持续集成和持续部署是很重要的一个环节,类似的工具也有很多,其中Jenkins是一个开源的持续集成平台。

            Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务,并且还涉及到了构建项目等任务。

            Jenkins需要大量的插件保证工作,安装成本较高,下面会基于Docker搭建Jenkins。

            • Jenkins是一个开源项目,基于Java开发的
            • 大多数互联网公司都是采永Jenkins配合GitLab、Docker、K8s作为DevOps的核心工具
            • Jenkins官方提供了大量的插件库,用于完成自动化的CI/CD过程。

              Jenkins主要工作:

              1. 拉取GitLab上的代码并进行构建
              2. 根据流程可以选择发布到测试环境或是生产环境

              GitLab上的代码经过大量测试后,确定发型版本,再发布到生产环境

              CI/CD概念:

              • CI过程:JenKins将代码拉取、构建、制作镜像交给测试人员
                • 持续集成:让软件代码可以持续的集成到主干上,并自动构建和测试
                • CD过程:通过Jenkins将打好标签的发行版本代码进行拉取、构建、制作镜像后交给运维人员部署
                  • 持续交付:让经过持续集成的代码可以进行手动部署
                  • 持续部署:让可以持续交付的代码随时随地的自动化部署
                    2.3.2 Jenkins安装
                    1. 拉取镜像
                    docker pull jenkins/jenkins
                    1. 编写对应的docker-compose.yml
                    version: "3.1"services:  jenkins:    image: jenkins/jenkins    container_name: jenkins    ports:      - 8080:8080      - 50000:50000    volumes:      - ./data/:/var/jenkins_home/
                    1. 设置数据卷data目录的权限,否则会包没有对应权限
                    chmod -R a+w data/
                    1. 设置Jenkins的下载地址

                    重新启动Jenkins容器后,由于Jenkins需要下载大量内容,但是由于默认下载地址下载速度较慢,需要重新设置下载地址为国内镜像站

                    # 修改数据卷中的hudson.model.UpdateCenter.xml文件      default    https://updates.jenkins.io/update-center.json  # 将下载地址替换为http://mirror.esuni.jp/jenkins/updates/update-center.json      default    http://mirror.esuni.jp/jenkins/updates/update-center.json  # 清华大学的插件源也可以https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
                    1. 再次重启Jenkins容器,访问JenKins
                    2. 查看JenKins登录密码,并登录JenKins然后安装对应插件
                    docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword

                    输入管理员密码 - 选择插件来安装 - 选择对应的插件进行安装

                    推荐安装:

                    ①Git Parameter

                    ②Publish Over SSH

                    然后等待插件安装成功进入首页。(可能会出现下载失败的插件,重新下载即可)

                    7. 创建管理员用户,设置Jenkins URL

                    2.3.3 Jenkins实现拉取-构建-发布

                    准备好GitLab仓库中的项目,并且通过Jenkins配置实现当前项目的DevOps流程。(Idea创建之后推送到远程即可)

                    1. 构建Maven工程发布到GitlLab、Gitee、GitHub均可

                    2. 点击Jenkins左侧新建任务(选择自由风格的项目)

                    3. 配置源码拉取地址

                    4. 点击立即构建,查看构建日志

                    5. 配置Maven构建代码

                    代码拉取到Jenkins本地后,需要在Jenkins中对代码进行构建,这里需要Maven的环境,而Maven需要Java的环境,接下来需要在Jenkins中安装JDK和Maven,并且配置到Jenkins服务。

                    • 准备jdk、maven压缩包,通过数据卷映射到Jenkins容器内部
                    • 解压压缩包,并配置Maven的settings.xml
                            alimaven      aliyun maven      http://maven.aliyun.com/nexus/content/groups/public/    central              jdk-1.8            true        1.8                1.8        1.8        1.8            
                      • Jenkins配置JDK&Maven并保存

                        maven配置同理

                      • 配置Jenkins任务构建代码
                      • 立即构建测试,查看target下的jar包
                        1. 配置Publish发布&远程操作

                        jar包构建好后,就可以根据情况发布到测试或者生产环境,此处需要用到之前下载好的插件Publish Over SSH

                        • 配置Publish Over SSH连接测试环境、生产环境
                        • 配置任务构建后的操作,发布jar包到目标服务
                          • 立即构建任务,并去目标服务查看
                            2.3.4 CI/CD操作
                            • 基于Jenkins拉取GitLab的SpringBoot代码进行构建发布到测试环境实现持续集成
                            • 基于Jenkins拉取GitLab指定发行版本的SpringBoot进行构建发布到生产环境实现CD(持续部署)

                              为了让程序代码可以自动推送到测试环境基于Docker服务运行,需要添加Docker配置和脚本文件让程序可以在集成到主干的同时运行起来。

                              ①持续集成

                              1. 添加Dockerfile文件

                              2. 添加docker-compose.yml文件

                              3. 追加Jenkins构建后操作脚本命令

                              4. 发布到GitLab后由Jenkins立即构建并推送到目标服务器

                              5. 测试部署到目标服务器程序

                                ②持续交付、部署

                              程序代码在经过多次集成操作到达最终可以交付,持续交付整体流程和持续集成类似,不过需要选取指定的发行版本

                              • 下载Git Parameter插件

                              • 设置项目参数化构建

                              • 在GitLab上给项目添加tag版本

                              • 任务构建时,采用Shell方式构建,拉取指定tag版本

                              • 基于Parameter构建任务,任务发布到目标服务器

                                2.4 Sonar Qube

                                2.4.1 Sonar Qube介绍与安装

                                Sonar Qube是一个开源的代码分析平台,支持Java、Python、PHP、JavaScript、CSS等25种以上的语言,可以检测出重复代码、代码漏洞、代码规范和安全性漏洞的问题。

                                • Sonar Qube可以与多种软件整合进行代码扫描,比如:Maven、Gradle、Git、Jenkins等,并且会将代码检测结果推送回Sonar Qube,进而在系统提供的UI界面上显示出来。

                                  安装过程:

                                  Sonar Qube在7.9版本中已经放弃了对MySQL的支持,并且建议在商业环境中采用PostgreSQL,那么安装Sonar Qube时需要依赖PostgreSQL。

                                  ①拉取PostgreSQL镜像

                                  docker pull postgresdocker pull sonarqube:8.9.3-community

                                  ②编写docker-compose.yml

                                  更易管理

                                  version: "3.1"services:  db:    image: postgres    container_name: db    ports:      - 5432:5432    networks:      - sonarnet    environment:      POSTGRES_USER: sonar      POSTGRES_PASSWORD: sonar  sonarqube:    image: sonarqube:8.9.3-community    container_name: sonarqube    depends_on:      - db    ports:      - "9000:9000"    networks:      - sonarnet    environment:      SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar      SONAR_JDBC_USERNAME: sonar      SONAR_JDBC_PASSWORD: sonarnetworks:  sonarnet:    driver: bridge

                                  ③设置sysctl.conf文件信息,并启动容器

                                  设置vm.max_map_count=262144,至少是这个数

                                  # 执行命令进行刷新sysctl -p# 启动容器docker-compose up -d

                                  重新启动需要一定时间,可以查看容器日志,如果看到如下内容代表启动成功

                                  ④访问Sonar Qube首页

                                  登录成功之后,会要求我们修改默认密码

                                  首页图片:

                                  • 安装中文插件

                                    安装成功后需要重启,若安装失败,重新点击install即可

                                    2.4.2 Sonar Qube基本使用

                                    Sonar Qube的使用方式很多,Maven可以整合,也可以采用sonar-scanner的方式,再查看Sonar Qube的检测效果

                                    ①Maven实现代码检测
                                    • 修改配置文件信息

                                      修改本地Maven的settings.xml文件,配置Sonar Qube信息

                                          sonar            true                admin        123456789        http://192.168.11.11:9000    
                                      • 在代码所在位置的cmd执行命令mvn sonar:sonar
                                      • 检测结果:
                                        ②Sonar-scanner实现代码检测
                                        • 下载对应版本
                                          • 下载Sonar-scanner:https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/
                                          • 下载4.6.x版本即可,要求Linux版本
                                            • 解压并配置sonar服务端信息

                                              下载下来的Sonar-scanner是zip压缩包,因此需要在linux上安装unzip插件

                                              # 安装unzip解压插件yum -y install unzip# 解压压缩包unzip sonar-scanner-cli/sonar-scanner-cli-4.6.0.2311-linux.zip

                                              配置sonarQube服务端地址,修改conf下的sonar-scanner.properties

                                              • 执行命令检测代码
                                                # 在项目所在目录执行以下命令~/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=demo -Dsonar.projectKey=java -Dsonar.java.binaries=target/
                                                • 查看SonarQube界面检测结果
                                                  ③Jenkins集成Sonar Qube

                                                  Jenkins集成Sonar Qube实现代码扫描需要下载整合插件

                                                  1. Jenkins安装插件【系统管理-插件管理】
                                                  2. 安装SonarQube Scanner插件
                                                  3. Jenkins配置Sonar Qube

                                                  在SonarQube中开启Sonar Qube的权限验证

                                                  在Sonar Qube中生成一个令牌,获取Sonar Qube的令牌

                                                  • 在Jenkins中配置Sonar Qube信息

                                                    Dashboard - 系统配置

                                                    • 在Jenkins中配置Sonar-scanner

                                                      将Sonar-scanner添加到Jenkins数据卷中并全局配置

                                                      • 配置任务的Sonar-scanner
                                                        1. 构建任务

                                                        Jenkins界面:

                                                        SonarQube界面:

                                                        2.5 Harbor(镜像仓库)

                                                        2.5.1 Harbor介绍与安装

                                                        • 介绍

                                                          前面我们在部署时,主要流程如下:

                                                          1. Jenkins推送jar包到服务器
                                                          2. 通过脚本命令让目标服务器对当前jar进行部署

                                                          但是这种方式在项目比较多的时候,每个服务器都需要将jar包制作成自定义镜像,然后再通过docker进行启动,重复操作较多,降低部署效率。

                                                          Harbor:私有的Docker镜像仓库。我们可以让Jenkins统一将项目打包并制作成Docker镜像发布到Harbor仓库中。然后我们只需要通知目标服务,让目标服务统一去Harbor仓库上拉取镜像并在本地部署即可。

                                                          • 安装(通过原生的方式安装)
                                                            1. 下载Harbor安装包

                                                              https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz

                                                            2. 传送到linux上并解压
                                                            # 通过xftp或其他方式将压缩包传送到linux上# 解压tar -zxvf harbor-offline-installer-v2.3.4.tgz -C /usr/local/
                                                            1. 修改Harbor配置文件

                                                            设置harbor地址,注释https,查看密码

                                                            # 备份原有配置cp harbor.yml.tmpl harbor.yml

                                                            4. 启动Harbor并登录Harbor

                                                            # 启动Harbor./install.sh

                                                            首页信息:

                                                            2.5.2 Harbor基础使用

                                                            Harbor作为镜像仓库,主要的交互方式就是将镜像上传到Harbor,以及从Harbor上下载拉取指定版本的镜像。

                                                            • 在传输镜像前,可以先使用Harbor提供的权限管理,将项目设置为私有项目,并对不同用户设置不同角色,从而更方便管理镜像。
                                                              ①添加用户构建项目
                                                              • 创建用户

                                                                系统管理-用户管理-创建用户

                                                                • 构建项目(设置为私有)
                                                                • 给项目追加用户
                                                                  ②发布镜像到Harbor
                                                                  • 修改镜像名称

                                                                    名称要求:harbor地址/项目名/镜像名:版本

                                                                    • 修改daemon.json,支持Docker仓库,并重启Docker
                                                                    • 设置登录仓库信息
                                                                      docker login -u 用户名 -p 密码 Harbor地址
                                                                      • 推送镜像到Harbor
                                                                        ③从Harbor中拉取镜像

                                                                        跟传统方式一样,不过需要先配置/etc/docker/daemon.json文件

                                                                        {        "registry-mirrors": ["https://pee6w651.mirror.aliyuncs.com"],        "insecure-registries": ["192.168.11.11:80"]}

                                                                        拉取镜像:

                                                                        拓展:Jenkins容器使用宿主机Docker并编写构建脚本
                                                                        • 构建镜像和发布镜像到harbor都需要使用到docker命令。而在Jenkins容器内部安装Docker官方推荐直接采用宿主机带的Docker即可。

                                                                          ①设置Jenkins容器使用宿主机Docker

                                                                          1. 设置宿主机docker.sock权限
                                                                          sudo chown root:root /var/run/docker.socksudo chmod o+rw /var/run/docker.sock
                                                                          1. 添加数据卷
                                                                          version: "3.1"services:  jenkins:    image: jenkins/jenkins    container_name: jenkins    ports:      - 8080:8080      - 50000:50000    volumes:      - ./data/:/var/jenkins_home/      - /usr/bin/docker:/usr/bin/docker      - /var/run/docker.sock:/var/run/docker.sock      - /etc/docker/daemon.json:/etc/docker/daemon.json

                                                                          ②添加构建操作

                                                                          ③编写构建脚本

                                                                          • 部署项目需要通过Publish Over SSH插件,让目标服务器执行命令。为了方便一次性实现拉取镜像和启动的命令,推荐采用脚本文件的方式。
                                                                          • 添加脚本文件到目标服务器,再通过Publish Over SSH插件让目标服务器执行脚本即可。
                                                                            1. 编写脚本文件,添加到目标服务器

                                                                            deploy.sh:

                                                                            harbor_url=harbor_project_name=project_name=tag=port=imageName=$harbor_url/$harbor_project_name/$project_name:$tagcontainerId=`docker ps -a | grep ${project_name} | awk '{print }'`if [ "$containerId" != "" ] ; then    docker stop $containerId    docker rm $containerId    echo "Delete Container Success"fiimageId=`docker images | grep ${project_name} | awk '{print }'`if [ "$imageId" != "" ] ; then    docker rmi -f $imageId    echo "Delete Image Success"fidocker login -u DevOps -p P@ssw0rd $harbor_urldocker pull $imageNamedocker run -d -p $port:$port --name $project_name $imageNameecho "Start Container Success"echo $project_name
                                                                            1. 设置文件权限为可执行:
                                                                            chmod a+x deploy.sh

                                                                            ④配置构建后操作

                                                                            2.6 Jenkins流水线(pipeline)、自动化脚本

                                                                            2.6.1 Jenkins流水线任务介绍

                                                                            之前采用的都是Jenkins的自由风格,每个流程都要通过不同的方式设置,并且构建过程中整体流程时不可见的,无法确认每个流程花费的时间,同时不方便问题的定位。

                                                                            Jenkins的Pipeline可以让项目的发布整体流程可视化,明确执行的阶段,快速定位问题。让整个项目的生命周期可以通过一个Jenkinsfile文件管理,而且Jenkinsfile文件是可以放在项目中维护。

                                                                            ①构建Jenkins流水线任务

                                                                            1. 构建任务
                                                                            2. 生成Groovy脚本
                                                                            3. 构建后查看视图

                                                                              ②Groovy脚本

                                                                            • Groovy脚本基本语法
                                                                              // 所有脚本命令包含在pipeline{}中pipeline {  // 指定任务在哪个节点执行(Jenkins支持分布式)    agent any        // 配置全局环境,指定变量名=变量值信息    environment{    host = '192.168.11.11'    }    // 存放所有任务的合集    stages {    // 单个任务        stage('任务1') {        // 实现任务的具体流程            steps {                echo 'do something'            }        }// 单个任务        stage('任务2') {        // 实现任务的具体流程            steps {                echo 'do something'            }        }        // ……    }}
                                                                              • 编写例子测试
                                                                              • 查看效果

                                                                                Ps:涉及到特定脚本,Jenkins给予了充足的提示,可以自动生成命令

                                                                                ③JenkinsFile实现

                                                                                Jenkinsfile方式需要将脚本内容编写到项目中的Jenkinsfile文件中,每次构建会自动拉取并且获取项目中的Jenkinsfile文件来对项目进行构建

                                                                                • 配置pipeline
                                                                                • 准备Jenkinsfile
                                                                                • 测试效果
                                                                                  2.6.2 Jenkins流水线任务实现
                                                                                  1. 参数化构建

                                                                                  添加参数化构建,方便选择不同的项目版本

                                                                                  2. 拉取Git代码

                                                                                  通过流水线语法生成Checkout代码的脚本

                                                                                  将*/master更改为标签${tag}

                                                                                  pipeline {    agent any    stages {        stage('拉取Git代码') {            steps {                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])            }        }    }}
                                                                                  1. 构建代码

                                                                                  通过脚本执行mvn的构建命令

                                                                                  pipeline {    agent any    stages {        stage('拉取Git代码') {            steps {                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])            }        }        stage('构建代码') {            steps {                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'            }        }}
                                                                                  1. 代码质量检测

                                                                                  通过脚本执行sonar-scanner命令即可

                                                                                  pipeline {    agent any    stages {        stage('拉取Git代码') {            steps {                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])            }        }        stage('构建代码') {            steps {                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'            }        }        stage('检测代码质量') {            steps {                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa'             }        }    }}
                                                                                  1. 制作自定义镜像并发布
                                                                                  • 生成自定义镜像脚本
                                                                                    pipeline {    agent any    environment{        harborHost = '192.168.11.11:80'        harborRepo = 'repository'        harborUser = 'DevOps'        harborPasswd = 'P@ssw0rd'    }    // 存放所有任务的合集    stages {        stage('拉取Git代码') {            steps {                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])            }        }        stage('构建代码') {            steps {                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'            }        }        stage('检测代码质量') {            steps {                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=31388be45653876c1f51ec02f0d478e2d9d0e1fa'             }        }        stage('制作自定义镜像并发布Harbor') {            steps {                sh '''cp ./target/*.jar ./docker/                cd ./docker                docker build -t ${JOB_NAME}:${tag} ./'''                sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}                docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}                docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''            }        }    }}
                                                                                    • 生成Publish Over SSH脚本
                                                                                      pipeline {    agent any    environment{        harborHost = '192.168.11.11:80'        harborRepo = 'repository'        harborUser = 'DevOps'        harborPasswd = 'P@ssw0rd'    }    // 存放所有任务的合集    stages {        stage('拉取Git代码') {            steps {                checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/test.git']]])            }        }        stage('构建代码') {            steps {                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'            }        }docker        stage('检测代码质量') {            steps {                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=7d66af4b39cfe4f52ac0a915d4c9d5c513207098'             }        }        stage('制作自定义镜像并发布Harbor') {            steps {                sh '''cp ./target/*.jar ./docker/                cd ./docker                docker build -t ${JOB_NAME}:${tag} ./'''                sh '''docker login -u ${harborUser} -p ${harborPasswd} ${harborHost}                docker tag ${JOB_NAME}:${tag} ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}                docker push ${harborHost}/${harborRepo}/${JOB_NAME}:${tag}'''            }        }                stage('目标服务器拉取镜像并运行') {            steps {                sshPublisher(publishers: [sshPublisherDesc(configName: 'testEnvironment', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port ", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])            }        }    }}

                                                                                      Ps:由于采用变量,记得使用双引号

                                                                                      2.6.3 Jenkins流水线整合钉钉

                                                                                      在程序部署成功之后,可以通过钉钉的机器人及时向开发人员发送部署的最终结果通知

                                                                                      步骤:Jenkins安装插件 - 钉钉创建群组并构建机器人 - Jenkins配置系统添加钉钉通知 - 任务中追加钉钉流水线配置

                                                                                      1. 安装插件
                                                                                      2. 钉钉内部创建群组并构建机器人

                                                                                        最终获取到Webhook信息:

                                                                                      https://oapi.dingtalk.com/robot/send?access_token=kej4ehkj34gjhg34jh5bh5jb34hj53b4

                                                                                      1. Jenkins系统配置添加钉钉通知
                                                                                      2. 任务线中追加流水线配置
                                                                                      pipeline {    agent any    environment {        sonarLogin = '2bab7bf7d5af25e2c2ca2f178af2c3c55c64d5d8'        harborUser = 'admin'        harborPassword = 'Harbor12345'        harborHost = '192.168.11.12:8888'        harborRepo = 'repository'    }    stages {        stage('拉取Git代码'){            steps {                checkout([$class: 'GitSCM', branches: [[name: '$tag']], extensions: [], userRemoteConfigs: [[url: 'http://49.233.115.171:8929/root/lsx.git']]])            }        }        stage('Maven构建代码'){            steps {                sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'            }        }        stage('SonarQube检测代码'){            steps {                sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.sources=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=target/ -Dsonar.login=${sonarLogin}'            }        }        stage('制作自定义镜像'){            steps {                sh '''cd docker                mv ../target/*.jar ./                docker build -t ${JOB_NAME}:$tag .                '''            }        }        stage('推送自定义镜像'){            steps {                sh '''docker login -u ${harborUser} -p ${harborPassword} ${harborHost}                docker tag ${JOB_NAME}:$tag ${harborHost}/${harborRepo}/${JOB_NAME}:$tag                docker push ${harborHost}/${harborRepo}/${JOB_NAME}:$tag'''            }        }        stage('通知目标服务器'){            steps {                sshPublisher(publishers: [sshPublisherDesc(configName: 'centos-docker', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "/usr/bin/deploy.sh $harborHost $harborRepo $JOB_NAME $tag $port", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])            }          }    }    post {        success {            dingtalk (                robot: 'Jenkins-DingDing',                type:'MARKDOWN',                title: "success: ${JOB_NAME}",                text: ["- 成功构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]            )        }        failure {            dingtalk (                robot: 'Jenkins-DingDing',                type:'MARKDOWN',                title: "fail: ${JOB_NAME}",                text: ["- 失败构建:${JOB_NAME}项目!\n- 版本:${tag}\n- 持续时间:${currentBuild.durationString}\n- 任务:#${JOB_NAME}"]            )        }    }}
                                                                                      1. 查看效果

                                                                                      2.7 Kubernetes

                                                                                      2.7.1 介绍及安装

                                                                                      Kubernetes又称为k8s,是一个开源的,用于管理云平台中多个主机上的容器。目的是让容器化部署更加简单、高效。

                                                                                      ①k8s主要作用:
                                                                                      1. 服务发现和负载均衡(DNS名称或自己IP地址公开容器)
                                                                                      2. 存储编排(类似Docker的数据卷)
                                                                                      3. 自动部署和回滚(可以按照你的需求调整容器状态)
                                                                                      4. 自动完成装箱计算(允许你设置每个容器的资源,CPU、内存等)
                                                                                      5. 自我修复(可以重启失败的容器、替换容器、检查容器状况等)
                                                                                      6. 密钥与配置管理(允许存储和管理敏感信息,可以在不重建容器的情况下完成部署和更新密钥)
                                                                                      ②k8s的架构

                                                                                      k8s搭建至少需要两个节点,一个Master负责管理,一个Slave搭建在工作服务器上负责分配

                                                                                      各个组件的基本功能

                                                                                      • API Server:k8s通讯的核心组件,负责k8s内部交互及接收发送指令的组件
                                                                                      • controller-manage:资源调度,根据集群情况分配资源
                                                                                      • etcd:key-value数据库,存储集群的状态信息
                                                                                      • scheduler:负责调度每个工作节点
                                                                                      • cloud-controller-manage:负责调度其他云服务产品
                                                                                      • kubelet:管理Pods上面的容器
                                                                                      • kube-proxy:负责处理其他Slave或客户端的请求
                                                                                      • Pod:运行的容器
                                                                                        ③k8s安装

                                                                                        本文采用https://kuboard.cn/提供的方式安装K8s,安装单Master节点

                                                                                        • 要求:至少使用Centos7.8版本
                                                                                        • 至少2台2核4G服务器

                                                                                          准备好服务器之后开始安装:

                                                                                          1. 重新设置hostname,不允许为localhost
                                                                                          # 修改 hostname,名字不允许使用下划线、小数点、大写字母,不能叫masterhostnamectl set-hostname your-new-host-name# 查看修改结果hostnamectl status# 设置 hostname 解析echo "127.0.0.1   $(hostname)" >> /etc/hosts

                                                                                          要求2台服务器之间可以相互通讯

                                                                                          2. 安装kuboard软件
                                                                                          # 阿里云 docker hub 镜像export REGISTRY_MIRROR=https://registry.cn-hangzhou.aliyuncs.comcurl -sSL https://kuboard.cn/install-script/v1.19.x/install_kubelet.sh | sh -s 1.19.5
                                                                                          3. 初始化Master节点

                                                                                          关于初始化时用到的环境变量

                                                                                          • APISERVER_NAME 不能是 master 的 hostname

                                                                                          • APISERVER_NAME 必须全为小写字母、数字、小数点,不能包含减号

                                                                                          • POD_SUBNET 所使用的网段不能与 master节点/worker节点 所在的网段重叠。该字段的取值为一个 CIDR 值,如果您对 CIDR 这个概念还不熟悉,请仍然执行 export POD_SUBNET=10.100.0.0/16 命令,不做修改

                                                                                          • 设置ip,域名,网段并执行初始化操作

                                                                                            # 只在 master 节点执行# 替换 x.x.x.x 为 master 节点实际 IP(请使用内网 IP)# export 命令只在当前 shell 会话中有效,开启新的 shell 窗口后,如果要继续安装过程,请重新执行此处的 export 命令export MASTER_IP=192.168.11.32# 替换 apiserver.demo 为 您想要的 dnsNameexport APISERVER_NAME=apiserver.demo# Kubernetes 容器组所在的网段,该网段安装完成后,由 kubernetes 创建,事先并不存在于您的物理网络中export POD_SUBNET=10.100.0.1/16echo "${MASTER_IP}    ${APISERVER_NAME}" >> /etc/hostscurl -sSL https://kuboard.cn/install-script/v1.19.x/init_master.sh | sh -s 1.19.5
                                                                                            • 检查Master启动状态
                                                                                              # 只在 master 节点执行# 执行如下命令,等待 3-10 分钟,直到所有的容器组处于 Running 状态watch kubectl get pod -n kube-system -o wide# 查看 master 节点初始化结果kubectl get nodes -o wide

                                                                                              Ps:如果出现NotReady的情况执行(最新版本的BUG,1.19一般没有)

                                                                                              docker pull quay.io/coreos/flannel:v0.10.0-amd64 mkdir -p /etc/cni/net.d/cat "name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}EOFmkdir /usr/share/oci-umount/oci-umount.d -pmkdir /run/flannel/cat  /etc/hosts# 替换为 master 节点上 kubeadm token create 命令的输出kubeadm join apiserver.demo:6443 --token vwfilu.3nhndohc5gn1jv9k     --discovery-token-ca-cert-hash sha256:22ff15cabfe87ab48a7db39b3bbf986fee92ec92eb8efc7fe9b0abe2175ff0c2
                                                                                              5. 检查最终运行结果
                                                                                              • 在Master节点运行
                                                                                                # 只在 master 节点执行kubectl get nodes -o wide

                                                                                                Ps:如果出现NotReady的情况执行(最新版本的BUG,1.19一般没有)

                                                                                                docker pull quay.io/coreos/flannel:v0.10.0-amd64 mkdir -p /etc/cni/net.d/cat "name":"cbr0","type":"flannel","delegate": {"isDefaultGateway": true}}EOFmkdir /usr/share/oci-umount/oci-umount.d -pmkdir /run/flannel/cat 

上一篇:上门龙婿,小说结局大揭秘,未完结之谜引热议!

下一篇:为什么显示网页错误?