• DevOps整合Jenkins+k8s+CICD


    目录

    一、DevOps介绍

    二、安装git工具

    三、安装jdk 、maven、Jenkins

    四、Jenkins实现基础的拉取操作

    五、Jenkins实现-sonarqbue 代码质量检测部署

    六、Jenkins实现制作自定义镜像并推送harbor部署

    七、Jenkins的流水线初体验

    八、Jenkins中pipeline流水线-打包质量检测推送docker部署,企业微信推送消息

    九、Jenkins中pipeline流水线,k8s部署,企业微信推送消息

    十、Jenkins自动化流水线,k8s部署,企业微信推送消息


     

     

     

     

     

    一、DevOps介绍

    软件开发最开始是由两个团队组成:

    • 开发计划由开发团队从头开始设计和整体系统的构建。需要系统不停的迭代更新。

    • 运维团队将开发团队的Code进行测试后部署上线。希望系统稳定安全运行。

    这看似两个目标不同的团队需要协同完成一个软件的开发。

    在开发团队指定好计划并完成coding后,需要提供到运维团队。

    运维团队向开发团队反馈需要修复的BUG以及一些需要返工的任务。

    这时开发团队需要经常等待运维团队的反馈。这无疑延长了事件并推迟了整个软件开发的周期。

    会有一种方式,在开发团队等待的时候,让开发团队转移到下一个项目中。等待运维团队为之前的代码提供反馈。

    可是这样就意味着一个完整的项目需要一个更长的周期才可以开发出最终代码。


    基于现在的互联网现状,更推崇敏捷式开发,这样就导致项目的迭代速度更快,但是由于开发团队与运维团队的沟通问题,会导致新版本上线的时间成本很高。这又违背的敏捷式开发的最初的目的。

    那么如果让开发团队和运维团队整合到成一个团队,协同应对一套软件呢?这就被称为DevOps。

    DevOps,字面意思是Development &Operations的缩写,也就是开发&运维。

    虽然字面意思只涉及到了开发团队和运维团队,其实QA测试团队也是参与其中的。

    网上可以查看到DevOps的符号类似于一个无穷大的符号

    e7188c4664a14e919a94cefbbd163355.png

     

     

     

    这表明DevOps是一个不断提高效率并且持续不断工作的过程

    DevOps的方式可以让公司能够更快地应对更新和市场发展变化,开发可以快速交付,部署也更加稳定。

    核心就在于简化Dev和Ops团队之间的流程,使整体软件开发过程更快速。

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

    • PLAN:开发团队根据客户的目标制定开发计划

    • CODE:根据PLAN开始编码过程,需要将不同版本的代码存储在一个库中。

    • BUILD:编码完成后,需要将代码构建并且运行。

    • TEST:成功构建项目后,需要测试代码是否存在BUG或错误。

    • DEPLOY:代码经过手动测试和自动化测试后,认定代码已经准备好部署并且交给运维团队。

    • OPERATE:运维团队将代码部署到生产环境中。

    • MONITOR:项目部署上线后,需要持续的监控产品。

    • INTEGRATE:然后将监控阶段收到的反馈发送回PLAN阶段,整体反复的流程就是DevOps的核心,即持续集成、持续部署。

    为了保证整体流程可以高效的完成,各个阶段都有比较常见的工具,如下图:

    41aa475a65344d2cbca6c24c2382f7cb.png

     

    最终可以给DevOps下一个定义:DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理,从而更快、更频繁地交付更稳定的软件。

    自动化的工具协作和沟通来完成软件的生命周期管理

     

     

    二、安装git工具

    serverA主机安装

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

    2.1 Git安装

    https://git-scm.com/(傻瓜式安装)

    2.2 GitLab安装

    单独准备服务器,采用Docker安装

    • 查看GitLab镜像

      docker search gitlab
    • 拉取GitLab镜像

      docker pull gitlab/gitlab-ce
    • 准备docker-compose.yml文件

    • mkdir -p /data/git
      vim /data/git/docker-compose.yml

      1. version: '3.1'
      2. services:
      3. gitlab:
      4. image: 'gitlab/gitlab-ce:latest'
      5. container_name: gitlab
      6. restart: always
      7. environment:
      8. GITLAB_OMNIBUS_CONFIG: |
      9. external_url 'http://10.1.100.225:8929'#自己安装git的服务器IP
      10. gitlab_rails['gitlab_shell_ssh_port'] = 2224
      11. ports:
      12. - '8929:8929'
      13. - '2224:2224'
      14. volumes:
      15. - './config:/etc/gitlab'
      16. - './logs:/var/log/gitlab'
      17. - './data:/var/opt/gitlab'
    • 启动容器(需要稍等一小会……)

      docker-compose up -d
    • 访问GitLab首页

    • http://10.1.100.225:8929

       

    查看root用户初始密码

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

    第一次登录后需要修改密码

    db223065a4094bc7a54e2f5d1f8e8c18.png

     

     

     

    三、安装jdk 、maven、Jenkins

    1.安装jdk 和maven

     

    JDK包下载地址:Java Downloads | Oracle

    MAven下载地址:Maven – Download Apache Maven

    tar -zxvf jdk-8u231-linux-x64.tar.gz -C /usr/local/
    tar -zxvf apache-maven-3.6.3-bin.tar.gz -C /usr/local/

    cd /usr/local
    mv apache-maven-3.6.3/ maven
    mv jdk1.8.0_231/ jdk

    1.1 编辑maven配置

    vim /usr/local/maven/conf/settings.xml

    1. <id>nexus-aliyun
    2. central
    3. Nexus aliyun
    4. http://maven.aliyun.com/nexus/content/groups/public
    5. <id>jdk1.8
    6. true
    7. 1.8
    8. 1.8
    9. 1.8
    10. 1.8
    11. jdk1.8

    2.Jenkins介绍

    Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具

    Jenkins应用广泛,大多数互联网公司都采用Jenkins配合GitLab、Docker、K8s作为实现DevOps的核心工具。

    Jenkins最强大的就在于插件,Jenkins官方提供了大量的插件库,来自动化CI/CD过程中的各种琐碎功能。

    7670b8ee7f5846128be39b5079ffca53.pngdc6535b1a28a4aa4b9c6e2221ec59b77.png

     

    Jenkins最主要的工作就是将GitLab上可以构建的工程代码拉取并且进行构建,再根据流程可以选择发布到测试环境或是生产环境。

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

    CI/CD可以理解为:

    • CI过程即是通过Jenkins将代码拉取、构建、制作镜像交给测试人员测试。

      • 持续集成:让软件代码可以持续的集成到主干上,并自动构建和测试。

    • CD过程即是通过Jenkins将打好标签的发行版本代码拉取、构建、制作镜像交给运维人员部署。

      • 持续交付:让经过持续集成的代码可以进行手动部署。

      • 持续部署:让可以持续交付的代码随时随地的自动化部署

     

     81f3f280568f441cab48899ed7bf76c7.png

     

     

    2.0下载jenkins

    docker pull jenkins/jenkins:2.319.1-lts

    vim /data/jenkins/docker-compose.yml

    1. version: "3.1"
    2. services:
    3. jenkins:
    4. image: jenkins/jenkins
    5. container_name: jenkins
    6. ports:
    7. - 8080:8080
    8. - 50000:50000
    9. volumes:
    10. - ./data/:/var/jenkins_home/
    11. - /var/run/docker.sock:/var/run/docker.sock
    12. - /usr/bin/docker:/usr/bin/docker
    13. - /etc/docker/daemon.json:/etc/docker/daemon.json

     

    2.1启动jenkins

    1. #修改Jenkins用户权限
    2. cd /var/run
    3. chown root:root docker.sock
    4. #其他用户有读和写权限
    5. chmod o+rw docker.sock
    6. cd /data/jenkins/
    7. docker-compose up -d
    8. #授权
    9. chmod 777 data/
    10. cat /data/jenkins/data/hudson.model.UpdateCenter.xml
    11. #重新启动Jenkins容器后,由于Jenkins需要下载大量内容,但是由于默认下载地址下载速度较慢,
    12. #需要重新设置下载地址为国内镜像站# 清华大学的插件源也可以
    13. # 修改数据卷中的hudson.model.UpdateCenter.xml文件
    14. # 将下载地址替换为http://mirror.esuni.jp/jenkins/updates/update-center.json
    15. # 清华大学的插件源也可以
    16. #https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/update-center.json
    17. #重启
    18. docker-compose restart
    19. #查看日志
    20. docker logs -f jenkins

     

     

    2.2访问页面

    http://10.1.100.225:8080
    1.输入密码2.选择插件来安装3.点击安装

    英文界面安装插件 Manage Jenkins–Manage Plugins-Available搜索插件
    Locale
    Localization
    Git Parameter
    Publish Over SSH

    bfcff8242fb745228fbc6652b27a4b2d.png

     

     

     

    2.3 配置jenkins


    mv /usr/local/maven/ /data/jenkins/data/

    mv /usr/local/jdk/ /data/jenkins/data/

    72377c3e919d41f0bb92c162a04f2612.png

     

    0f044ba18a674b369a18d7c209a378b2.png

     

     

     

    2.4 测试拉取代码

     

    系统管理-系统配置-Publish over SSH-SSH Servers

    #自定义项目名称
    name
    test

    #主机IP
    Hostname
    10.1.100.25

    #主机用户名
    Username
    root

    #拉取项目路径
    Remote Directory
    /data/work/mytest

    点击高级
    √ Use password authentication, or use a different key

    #输入服务器密码
    Passphrase / Password
    xxxx

    点击 测试 Test Configuration

     

    四、Jenkins实现基础的拉取操作

     

    1.软件下载

    链接:https://pan.baidu.com/s/1Jkyh_kgrT2o388Xiujbdeg?pwd=b7rx
    提取码:b7rx

    本机运行环境的基本插件
    安装git 、 maven、 jdk8
    安装开发工具IDEA :2019.2.3 x64

     

    2.修改IDEA中maven路径

    619663ebffc647699f8c0adb865ab42a.png

     

     

    3. 创建项目 File - New - Project

     

    96eaf826f0494d3f89de99a176bb93bf.png

     

     3.1 Spring Initalizr - Project SDK: java version “1.8.0_333” - Next

    5b1ff622cf884833a9587daea74db8d4.png

     

    3.2修改JDK -Next

    a54db5bd2f004c1b9985d391a23066b7.png

    3.3 创建Spring Web

    02311c65d590484e9fae83d5fd650a61.png

    3.4 点击Finish

    006f523428614c24b405fa46495fe347.png

    3.5创建controller目录和 helloController文件

    bd4b659fcf4d45d3ab62f022f8238b36.png

    代码

    1. package com.example.demo.controller;
    2. import org.springframework.web.bind.annotation.GetMapping;
    3. import org.springframework.web.bind.annotation.RequestMapping;
    4. import org.springframework.web.bind.annotation.RestController;
    5. @RestController
    6. public class helloController {
    7. @RequestMapping("/test")
    8. public String test(){
    9. return "hello jenkins";
    10. }
    11. }

     

    3.6 点击运行

    7f117e8f9ad94b67a053371ec7ff0762.png

     

    3.7浏览器输入:http://localhost:8080/test

    3.8 准备推送项目-构建本地svc推送路径

     

     eea201fa07294b3da5c8b6846281c404.png

     

    3.9  点击OK

     c44acffce342430a85c1244ca56c4a2a.png

     

     

    4.0 右键点击项目名称选择Git

    8e448996ee32492684c1adc4e0225044.png

     

    4.1选择需要上传的文件-填写注释-Conmmit

    21159c235bb94918ae1d10f7efa488f2.png

     

     

    4.2 选择Push

    1b6f868429954b88abcb8c2e1ded8d06.png

     

     

     

    4.3 查看git仓库地址

    79f5f84542b049a9baf49d042ce78fb3.png

     

     

    4.4 填写git仓库地址,提交代码

    5aaec2f53ce64e318c6a0783abbee627.png

     

     

    4.5 登入仓库查看代码 恭喜你成功啦!!!!

    b4eb2b33bbe74d0b9e58fab1479b342d.png

     

     

    4.6Jenkins拉取代码

    054fb82581a54cfd805f76390a1da83f.png

     9a6e82fc733d4ef1b915a46074e93eae.png

     

     

    4.7构建环境拉取代码

    a0abc8e5c12145f99df7f51b388380a0.png

     

     

     

    4.8查看日志

    341fd76bcbf64195a15b6af22b3796c0.png

     

    五、Jenkins实现-sonarqbue 代码质量检测部署

     

    1.安装sonarqube
      

    docker pull postgres
    docker pull sonarqube:8.9.6-community

     

    1.1修改内核参数

    vi /etc/sysctl.conf
    vm.max_map_count=262144

    sysctl -p

    mkdir -p /data/sonarqube
    cd /data/sonarqube

    cat docker-compose.yml

    1. version: '3.1'
    2. services:
    3. db:
    4. image: postgres
    5. container_name: db
    6. ports:
    7. - 5432:5432
    8. networks:
    9. - sonarnet
    10. volumes:
    11. - ~/sonarqube/postgresql/:/var/lib/postgresql
    12. - ~/sonarqube/datasql/:/var/lib/postgresql/data
    13. #配置数据库用户名和密码
    14. environment:
    15. TZ: Asia/Shanghai
    16. POSTGRES_USER: sonar
    17. POSTGRES_PASSWORD: sonar
    18. #下载社区长期支持版本
    19. sonarqube:
    20. image: sonarqube:8.9.6-community
    21. container_name: sonarqube
    22. #让db先跑起来
    23. depends_on:
    24. - db
    25. volumes:
    26. - ~/sonarqube/extensions:/opt/sonarqube/extensions
    27. - ~/sonarqube/logs:/opt/sonarqube/logs
    28. - ~/sonarqube/data:/opt/sonarqube/data
    29. - ~/sonarqube/conf:/opt/sonarqube/conf
    30. ports:
    31. - 9000:9000
    32. #让2个容器在一个网络中运行
    33. networks:
    34. - sonarnet
    35. #数据库连接地址
    36. environment:
    37. SONAR_JDBC_URL: jdbc:postgresql://db:5432/sonar
    38. SONAR_JDBC_USERNAME: sonar
    39. SONAR_JDBC_PASSWORD: sonar
    40. #网络桥接方式
    41. networks:
    42. sonarnet:
    43. driver: bridge

     

    1.2 启动

    docker-compose up -d

     

    1.3 查看日志

    docker logs -f sonarqube

    #进入sonarqube页面 ip:9000 默认账户密码admin/admin
    #安装中文插件Administrator -Marketplace -下面搜索框中查询Chines同意 I Chinese-lunderstand the risk -下载Install 下载完毕提示重启 Restart Server


     

    2.项目中maven插件添加到pom.xml 倒数第二行新增如下内容,mytest项目打包名称

       
            mytest
           
               
                    org.springframework.boot
                    spring-boot-maven-plugin
               

           

       

     

    3.项目同级目录,新建docker目录

    604bbe7533754f6a95ef388bf00b00e5.png

     

     

    3.1新建文件Dockerfile

    1. FROM daocloud.io/library/java:8u40-jdk
    2. COPY mytest.jar /usr/local/
    3. WORKDIR /usr/local/
    4. CMD java -jar mytest.jar

     

     

    3.2新建文件ocker-compose.yml

    1. version: '3.1'
    2. services:
    3. mytest:
    4. build:
    5. context: ./
    6. dockerfile: Dockerfile
    7. image: mytest:v1.0.0
    8. #容器名称
    9. container_name: mytest
    10. ports:
    11. - 8081:8080

     

    3.3 添加新增文件的文件,推送至git仓库

     

     

    3.4 git仓库给项目添加tag标签

    084b2a3902f34a019eec79889612ffe9.png

     

    2d2ad706b42f4f3bb07fd79c54b783be.png

     

    4. jenkins装插件SonarQube Scanner

     

     

    4.1安装sonar-scanner

    1. #下载地址 https://docs.sonarqube.org/latest/analysis/scan/sonarscanner/
    2. unzip sonar-scanner-cli-4.6.0.2311-linux.zip
    3. mv sonar-scanner-4.6.0.2311-linux sonar-scanner
    4. #把sonar-scanner 复制到 jenkins容器数据卷中
    5. mv sonar-scanner /data/jenkins/data/
    6. #修改sonar-scanner基础配置文件
    7. cat /data/jenkins/data/sonar-scanner/conf/sonar-scanner.properties
    8. #换成自己的IP##################################
    9. sonar.host.url=http://10.66.66.64:9000
    10. sonar.sourceEncoding=UTF-8
    11. ##############################################

     

     

     

    4.2jenkins 全局工具配置

    ced032b4ea024624a7e202c98a62421f.png

     

     

    4.3 sonarqbue生成秘钥

    e0011a0030bf44479a75d741981fbfc9.png

     

     

    4.4 配置sonarqbue url和 token秘钥

    f40b1e1e64ea4834a171be5126cea093.png

     

     d49433fa8f2e44b799ae9c8f7609d516.png

     

     

    4.5 Publish over SSH 配置拉取代码的路径和Ip 账户密码

    41585981670e45829e0d931f0b2232c1.png

     

     

     

    4.6  jenkins 项目添加tag 标签

    3335d1d29b0d4668b587ad61125a8423.png

    ffb0fef41f6e4b09b041a4d2e993f47d.png

     

     

     

     

    4.7添加代码质量检测-

     0c1bae16f55349819684976a4b663b3b.png

     

    sonar.projectname=${JOB_NAME}
    sonar.projectKey=${JOB_NAME}
    sonar.source=./
    sonar.java.binaries=target

     

    4.8构建后操作

    224e6890249e4fc4bec6be0a48b84b55.png

    1. cd /usr/local/test/docker
    2. mv ../target/*.jar ./
    3. docker-compose down
    4. docker-compose up -d --build
    5. #删除多余的镜像
    6. docker image prune -f

     

    4.9 选择 tag开始部署项目

    85fac275c1db4fdb8b4b1b6bfaeb3a15.png

     

    5.0 查看质量检测情况

    b84c2f05720f468294e01e034a2f7d8b.png

     

    六、Jenkins实现制作自定义镜像并推送harbor部署

     

    1.项目删除docker-compose.yml,修改版本信息,推送至git仓库

    2.gti仓库新建tag标签 v3.0.0

    3.删除之前的构建后操作-Send build artfacts over SSH

    4.增加构建步骤-执行shell

    1. mv target/*.jar docker/
    2. docker build -t mytest:$tag docker/
    3. docker login -u admin -p Harbor12345 192.168.1.6:80
    4. docker tag mytest:$tag 192.168.1.6:80/repo/mytest:$tag
    5. docker push 192.168.1.6:80/repo/mytest:$tag

    5.服务器编辑脚本

    1. cat > /root/deploy.sh <<EOF
    2. horbar_addr=$1
    3. horbar_repo=$2
    4. project=$3
    5. version=$4
    6. echo "容器运行时端口"
    7. container_port=$5
    8. echo "宿主机映射端口"
    9. host_prot=$6
    10. echo "镜像名称"
    11. imagesName=$horbar_addr/$horbar_repo/$project:$version
    12. echo $imagesName
    13. echo "拿到正在运行的id"
    14. containerId=`docker ps -a |grep ${project} | awk '{print $1}'`
    15. echo $containerId
    16. echo "存在id 停止删除进程"
    17. if [ "$containerId" != "" ] ; then
    18. docker stop $containerId
    19. docker rm $containerId
    20. fi
    21. echo "打印工程 tag版本"
    22. tag=`docker images | grep ${project} | awk '{print $2}'`
    23. echo $tag
    24. echo "versin中包含tag版本,删除镜像"
    25. if [[ "$tag" =~ "$version" ]] ; then
    26. docker rmi $imagesName
    27. fi
    28. echo "登入harbor仓库"
    29. docker login -u admin -p Harbor12345 $horbar_addr
    30. echo "推送镜像"
    31. docker pull $imagesName
    32. echo "删除 none多余镜像"
    33. docker images | grep none | awk '{print $3}'| xargs docker rmi --force
    34. docker run -d -p $host_prot:$container_port --name $project $imagesName
    35. echo "success"
    36. <

     

    6.脚本授权

    1. chmod a+x deploy.sh
    2. #查看当前环境变量
    3. echo $PATH
    4. #脚本移动到环境变量中,让其他用户可执行
    5. mv deploy.sh /usr/bin/

     

    7.项目添加端口字符参数

    322b9587ab1447b3aa41c21b3fde7ddd.png

     5ab042a768414a97a6a95226235a3510.png

     

     

    8.添加构建后操作 -Send build artfacts over SSH

    09ed7c45f5f9406f9536e0729fc0170c.png

     

     

    9.运行项目,并查看日志

    de6388b0d25c4ec2a17682139d593c1d.png

     

     

    七、Jenkins的流水线初体验

     

    1.新建项目

    b8d9fc2b6e634a419fbc1acde945187c.png

     56c85061ad37495f8b5ad215917628dc.png

     2. 将下面代码全部覆盖 流水线-Hello word 中-应用-保存- 立即构建

    //所有的脚本命令都放在pipeline中
    pipeline {
        //执行任务再哪个集群节点中执行
        agent any

        environment {
            key = 'valus'
        }

        stages {
            stage('拉取git仓库代码') {
                steps {
                    echo '拉取git仓库代码 - SUCCESS'
                }
            }
        
        
            stage('通过maven构建项目') {
                steps {
                    echo '通过maven构建项目 - SUCCESS'
                }            
            }
            
            stage('通过sonarQube做代码质量检测') {
                steps {
                    echo '通过sonarQube做代码质量检测 - SUCCESS'
                }            
            }
            
            stage('通过docker制作自定义镜像') {
                steps {
                    echo '通过docker制作自定义镜像 - SUCCESS'
                }            
            }
            
            stage('将自定义镜像推送到Harbor') {
                steps {
                    echo '将自定义镜像推送到Harbor - SUCCESS'
                }            
            }
            
            stage('通过 Publish Over SSH通知目标服务器') {
                steps {
                    echo '通过 Publish Over SSH通知目标服务器 - SUCCESS'
                }            
            }
            
            
        }
    }

     

    3.维护脚本

    687b1ea799f84e8bb9d0f2bca18fe656.png

     

    6379e208724a4fa591f2d568ce1ad7ce.png

     

    7546e33f52ee4e18aebe8a9562545412.png

     

     bc6434d1d31f4396a642f0b93f9e4c15.png

     

     

     

     

    八、Jenkins中pipeline流水线-打包质量检测推送docker部署,企业微信推送消息

     

     

    企业微信-配置Jenkins-安装插件-在插件管理中,安装插件Qy Wechat Notification ,安装后重启jenkins

    英文界面安装插件 Manage Jenkins–Manage Plugins-Available搜索插件
    Locale
    Localization
    Git Parameter
    Publish Over SSH
    Qy Wechat Notification
    SonarQube Scanner

    1,项目添加tag


    Dashboard-pipeline-General-参数化构建过程-Git参数-名称(tag)-描述(代码的版本标签)——默认值(origin/master)-应用-保存

    2.拉取git仓库代码


    编辑项目pipeline-流水线-流水线语法-片段生成器-示例步骤(checkout:Check out from version control)

    Repository URL


    http://192.168.1.6:8929/root/pipeline.git

     

    点击-生成流水线脚本

    checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.1.6:8929/root/pipeline.git']]])
    

    回到git仓库修改Jenkinsfile,并保存

    1. //*/master 是默认拉取最新的代码, 我们自定义了tag版本,这里需要引入$tag
    2. stages {
    3. stage('拉取git仓库代码') {
    4. steps {
    5. checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.1.6:8929/root/pipeline.git']]])
    6. }
    7. }

    3.maven构建包


    编辑项目pipeline-流水线-流水线语法-片段生成器-示例步骤(sh:Shell Script)

    Shell Script

    /var/jenkins_home/maven/bin/mvn clean package -DskipTests
    

    生成流水线脚本

    sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
    

    4.通过sonarQube做代码质量检测

    编辑项目pipeline-流水线-流水线语法-片段生成器-示例步骤(sh:Shell Script) -生成后的流水线脚本添加至git仓库修改Jenkinsfile

    #源码位置 -Dsonar.source=./
    #项目名称 -Dsonar.projectname
    #项目的标识 -Dsonar.projectKey
    #编译后的目录 -Dsonar.java.binaries
    #秘钥 -Dsonar.login

    Shell Script
     

    /var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=c5f80db608830252de0b368c9aaecc3a8d95463f
    

    生成流水线脚本

    sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=c5f80db608830252de0b368c9aaecc3a8d95463f'
    

     

    5.通过docker制作自定义镜像

    编辑项目pipeline-流水线-流水线语法-片段生成器-示例步骤(sh:Shell Script) -生成后的流水线脚本添加至git仓库修改Jenkinsfile

    Shell Script

    1. mv ./target/*.jar ./docker/
    2. docker build -t ${JOB_NAME}:${tag} ./docker/

    生成流水线脚本

    1. sh '''mv ./target/*.jar ./docker/
    2. docker build -t ${JOB_NAME}:${tag} ./docker/'''

     

    6.将自定义镜像推送到Harbor

    git仓库-修改Jenkinsfile

    1. //声明全局变量,方便后面使用
    2. environment {
    3. harboUser = 'admin'
    4. harborPass = 'Harbor12345'
    5. harborAddress = '192.168.1.6:80'
    6. harborRepo = 'repo'
    7. }
    8. stage('将自定义镜像推送到Harbor') {
    9. steps {
    10. sh '''docker login -u ${harboUser} -p ${harborPass} ${harborAddress}
    11. docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
    12. docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''
    13. }
    14. }

     

    7.通过 Publish Over SSH通知目标服务器

    pipeline-参数化构建过程-添加参数-字符参数

    container_port 8080 容器内部占用端口
    host_prot 8081 宿主机映射端口

     

    编辑项目pipeline-流水线-流水线语法-片段生成器-示例步骤(sshPublisher:Send build artifacts over SSH) -生成后的流水线脚本添加至git仓库修改Jenkinsfile

    Exec command

    deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $container_port $host_prot

    生成流水线脚本

    sshPublisher(publishers: [sshPublisherDesc(configName: 'test', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: "deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $container_port $host_prot", execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: '')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])

     

    流水线脚本中的一个坑,这里的’’ 不会引用Jenkinsfile文件中的变量,
    ‘deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $container_port $host_prot’

    需要换成""
    “deploy.sh $harborAddress $harborRepo $JOB_NAME $tag $container_port $host_prot”

     

     

    8.设置企业微信

    打开企业微信手机端,在群设置的群机器人中,添加机器人
    添加成功后,复制Webhook地址,在配置Jenkins时使用

    编辑项目pipeline-流水线-流水线语法-片段生成器-示例步骤(qyWechatNotification:企业微信通知) -生成后的流水线脚本添加至git仓库修改Jenkinsfile

     

     

    九、Jenkins中pipeline流水线,k8s部署,企业微信推送消息

     

    1.Jenkins服务器设置免密登入k8s-mast服务器

    #Jenkins服务器-进入jenkins容器
    docker exec -it jenkins bash

    #进入jenkins容器-生成免密登录公私钥,根据提示按回车
    ssh-keygen -t rsa

    #进入jenkins容器-查看jenkins 秘钥
    cat /var/jenkins_home/.ssh/id_rsa.pub

    #k8s-mast服务器中authorized_keys  加入Jenkins服务器秘钥
    echo "xxxxxx" >> /root/.ssh/authorized_keys

     

    1.2 Jenkins新增k8s服务器信息

    系统管理-系统配置-Publish over SSH-新增-

    80217f15ec564e75940e4621189db515.png

     设置密码 点击高级-√ Use password authentication, or use a different key-Passphrase / Password(填写自己的密码)- Test Configuration(点击测试)

     

    2.拷贝pipeline.yaml 到k8s-mast,生成流水语法

    编辑项目pipeline-流水线-流水线语法-片段生成器-示例步骤(shhPublisher: Send build artifacts over SSH)

    Name-(k8s)

    Source files-(pipeline.yaml)

    生成流水线脚本

    sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    

    3.远程 执行k8s-mast服务器中的 pipeline.yaml


    编辑项目pipeline-流水线-流水线语法-片段生成器-示例步骤(sh:Shell Script)

    Shell Script
    ssh root@192.168.1.2 kubectl apply -f /usr/local/k8s/pipeline.yaml

    生成流水线脚本
    sh ‘ssh root@192.168.1.2 kubectl apply -f /usr/local/k8s/pipeline.yaml’


     

    4.git仓库新建pipeline.yaml文件

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. namespace: test
    5. name: pipeline
    6. labels:
    7. app: pipeline
    8. spec:
    9. ports:
    10. - port: 8081
    11. protocol: TCP
    12. targetPort: 8080
    13. selector:
    14. app: pipeline
    15. ---
    16. apiVersion: apps/v1
    17. kind: Deployment
    18. metadata:
    19. namespace: test
    20. name: pipeline
    21. labels:
    22. app: pipeline
    23. spec:
    24. replicas: 1
    25. selector:
    26. matchLabels:
    27. app: pipeline
    28. template:
    29. metadata:
    30. labels:
    31. app: pipeline
    32. spec:
    33. containers:
    34. - name: pipeline
    35. image: 192.168.1.10:80/repo/pipeline:v4.0.0
    36. #一直从仓库拉取镜像
    37. imagePullPolicy: Always
    38. ports:
    39. - containerPort: 8080
    40. ---
    41. apiVersion: extensions/v1beta1
    42. kind: Ingress
    43. metadata:
    44. namespace: test
    45. name: pipeline-ingress
    46. spec:
    47. rules:
    48. #记得给自己的k8s集群服务器添加本地host域名解析
    49. - host: pipeline.rw.com
    50. http:
    51. paths:
    52. - backend:
    53. serviceName: pipeline
    54. servicePort: 8081
    55. path: /

     

    5.git仓库修改Jenkinsfile文件

    1. //所有的脚本命令都放在pipeline中
    2. pipeline {
    3. //执行任务再哪个集群节点中执行
    4. agent any
    5. //声明全局变量,方便后面使用
    6. environment {
    7. harboUser = 'admin'
    8. harborPass = 'Harbor12345'
    9. harborAddress = '192.168.1.10:80'
    10. harborRepo = 'repo'
    11. }
    12. //*/master 是默认拉取最新的代码, 我们自定义了tag版本,这里需要引入$tag
    13. stages {
    14. stage('拉取git仓库代码') {
    15. steps {
    16. checkout([$class: 'GitSCM', branches: [[name: '${tag}']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.1.9:8929/root/pipeline.git']]])
    17. }
    18. }
    19. stage('通过maven构建项目') {
    20. steps {
    21. sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
    22. }
    23. }
    24. stage('通过sonarQube做代码质量检测') {
    25. steps {
    26. sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=c5f80db608830252de0b368c9aaecc3a8d95463f'
    27. }
    28. }
    29. stage('通过docker制作自定义镜像') {
    30. steps {
    31. sh '''mv ./target/*.jar ./docker/
    32. docker build -t ${JOB_NAME}:${tag} ./docker/'''
    33. }
    34. }
    35. stage('将自定义镜像推送到Harbor') {
    36. steps {
    37. sh '''docker login -u ${harboUser} -p ${harborPass} ${harborAddress}
    38. docker tag ${JOB_NAME}:${tag} ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}
    39. docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:${tag}'''
    40. }
    41. }
    42. stage('拷贝yaml 到mast') {
    43. steps {
    44. sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    45. }
    46. }
    47. //192.168.1.2 是k8s-mast主节点
    48. stage('远程mast 执行yaml') {
    49. steps {
    50. sh 'ssh root@192.168.1.2 kubectl apply -f /usr/local/k8s/pipeline.yaml'
    51. }
    52. }
    53. stage('通知企业微信') {
    54. steps {
    55. qyWechatNotification mentionedId: '', mentionedMobile: '', webhookUrl: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=0461ffcf-3a23-4cda-8757-371cc0xx46be'
    56. }
    57. }
    58. }
    59. }

     

     

     

    6.执行流水线

    11486cdb3c4e46e884ff541dec8098c5.png

     

     

     

     

     

     

     

     

     

     

     

    十、Jenkins自动化流水线,k8s部署,企业微信推送消息

     

    1.Jenkins-安装插件-在插件管理中,安装插件GitLab ,安装后重启jenkins

     

    2.Jenkins-系统配置-Gitlab


    去掉√
    Enable authentication for ‘/project’ end-point
    应用保存

     

    3.Git仓库

    Meun-Admin-Settings-Network-Outbound requests-Expand
    打钩 √Allow requests to the local network from web hooks and services

    保存Save changes
    ec9c6862b5534d18b46cb3f1b63f1a8e.png

     

     

     

    项目zd-Settings-Webhooks-URL (http://192.168.1.5:8080/project/zd) -Add webhook

     

    4.测试

    a6314c9e0f8048a59176066767ff0b63.png

     

     

    5.修改pipeline

    pipeline.yaml

    1. apiVersion: v1
    2. kind: Service
    3. metadata:
    4. namespace: test
    5. name: zd
    6. labels:
    7. app: zd
    8. spec:
    9. ports:
    10. - port: 8081
    11. protocol: TCP
    12. targetPort: 8080
    13. selector:
    14. app: zd
    15. ---
    16. apiVersion: apps/v1
    17. kind: Deployment
    18. metadata:
    19. namespace: test
    20. name: zd
    21. labels:
    22. app: zd
    23. spec:
    24. replicas: 1
    25. selector:
    26. matchLabels:
    27. app: zd
    28. template:
    29. metadata:
    30. labels:
    31. app: zd
    32. spec:
    33. containers:
    34. - name: zd
    35. image: 192.168.1.225:80/repo/zd:latest
    36. ports:
    37. - containerPort: 8080
    38. ---
    39. apiVersion: extensions/v1beta1
    40. kind: Ingress
    41. metadata:
    42. namespace: test
    43. name: pipeline-ingress
    44. spec:
    45. rules:
    46. - host: nginx.boge.com
    47. http:
    48. paths:
    49. - backend:
    50. serviceName: zd
    51. servicePort: 8081
    52. path: /

     

    6.修改 Jenkinsfile

     Jenkinsfile

    1. //所有的脚本命令都放在pipeline中
    2. pipeline {
    3. //执行任务再哪个集群节点中执行
    4. agent any
    5. //声明全局变量,方便后面使用
    6. environment {
    7. harboUser = 'admin'
    8. harborPass = 'Harbor12345'
    9. harborAddress = '192.168.1.225:80'
    10. harborRepo = 'repo'
    11. }
    12. //*/master 是默认拉取最新的代码, 我们自定义了tag版本,这里需要引入$tag
    13. stages {
    14. stage('拉取git仓库代码') {
    15. steps {
    16. checkout([$class: 'GitSCM', branches: [[name: '*/master']], extensions: [], userRemoteConfigs: [[url: 'http://192.168.1.225:8929/root/zd.git']]])
    17. }
    18. }
    19. stage('通过maven构建项目') {
    20. steps {
    21. sh '/var/jenkins_home/maven/bin/mvn clean package -DskipTests'
    22. }
    23. }
    24. stage('通过sonarQube做代码质量检测') {
    25. steps {
    26. sh '/var/jenkins_home/sonar-scanner/bin/sonar-scanner -Dsonar.source=./ -Dsonar.projectname=${JOB_NAME} -Dsonar.projectKey=${JOB_NAME} -Dsonar.java.binaries=./target/ -Dsonar.login=c5f80db608830252de0b368c9aaeccxx8d95463f'
    27. }
    28. }
    29. stage('通过docker制作自定义镜像') {
    30. steps {
    31. sh '''mv ./target/*.jar ./docker/
    32. docker build -t ${JOB_NAME}:latest ./docker/'''
    33. }
    34. }
    35. stage('将自定义镜像推送到Harbor') {
    36. steps {
    37. sh '''docker login -u ${harboUser} -p ${harborPass} ${harborAddress}
    38. docker tag ${JOB_NAME}:latest ${harborAddress}/${harborRepo}/${JOB_NAME}:latest
    39. docker push ${harborAddress}/${harborRepo}/${JOB_NAME}:latest'''
    40. }
    41. }
    42. stage('拷贝yaml 到mast') {
    43. steps {
    44. sshPublisher(publishers: [sshPublisherDesc(configName: 'k8s', transfers: [sshTransfer(cleanRemote: false, excludes: '', execCommand: '', execTimeout: 120000, flatten: false, makeEmptyDirs: false, noDefaultExcludes: false, patternSeparator: '[, ]+', remoteDirectory: '', remoteDirectorySDF: false, removePrefix: '', sourceFiles: 'pipeline.yaml')], usePromotionTimestamp: false, useWorkspaceInPromotion: false, verbose: false)])
    45. }
    46. }
    47. stage('远程mast 执行yaml') {
    48. steps {
    49. sh 'ssh root@192.168.1.220 kubectl apply -f /usr/local/k8s/pipeline.yaml'
    50. sh 'ssh root@192.168.1.220 kubectl -n test rollout restart deployment zd'
    51. }
    52. }
    53. stage('通知企业微信') {
    54. steps {
    55. qyWechatNotification mentionedId: '', mentionedMobile: '', webhookUrl: 'https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=0461ffcf-3a23-4cda-8757-371xx0cd46be'
    56. }
    57. }
    58. }
    59. }

     

    7、开发push代码,自动部署

    5bbf3e6a682049caabc404c2fac035d2.png

     

     

     


     

     

  • 相关阅读:
    jdk线程池ThreadPoolExecutor优雅停止原理解析(自己动手实现线程池)(二)
    Java集合容器相关面试题整理
    2023.9.19 关于 数据链路层 和 DNS 协议 基本知识
    415. 字符串相加
    pymongo 查询结果cursor转list数组较慢的解决办法
    mask: rle, polygon
    求和中x:y=g(x)的含义
    【Django】开发日报_3_Day:员工管理系统
    李宏毅机器学习笔记-transformer
    什么是软件?什么是瀑布模型?
  • 原文地址:https://blog.csdn.net/qq_35583325/article/details/126936804