美文网首页
工具篇-聊聊Devops

工具篇-聊聊Devops

作者: 秃头猿猿 | 来源:发表于2021-03-17 10:05 被阅读0次

    1.简介

    Devops简而言之是一个思想或者是一个理论,主要阐述是开发 测试 运维一体化

    Devops是一种重视软件开发人员(Dev)和软件运维人员(Ops)之间的沟通合作的文化

    通过一些自动化软件(这里我用的是Jekins)来自动化""软件交付"和"架构变更"的流程,从而使项目构建,测试,发布更加的快捷,频繁,可靠。

    下图则是对Devops更好的阐述,如下:

    网上盗了张图,侵删

    关于上图阐述如下:

    • 当来了一个需求(Plan),那么开发人员就会根据需求进行编码(code)

    • 当编码完成就会去构建项目(build),构建完成之后就需要进行测试(test)

    • 当测试完成后就会去进行发布(release),发布完成就会去进行部署(deploy)

    • 当部署完成就会去进行运维(operate),运维后回去进行项目的监控(monitor)

    • 当在项目监控的过程中产生新的需求或者甲方提出新的需求,这样就会进入上述流程,从而形成一个闭环

    在早期开发中,尤其是在敏捷开发过程中如果按照早期开发和部署分开的形式去进行工作,对于软件的交付和部署肯定不能够按时交付的

    Devops就是使用一系列的工程方法和工具来提交效率,让上图的闭环循环的自动化转动起来

    也就是说开发人员只需要关注编码,在保证编码质量的前提下,让构建到监控均自动化运转起来

    在一些公司(这里以我当前所在公司为例)中,开发流程大体如下图所示:

    未命名文件 (1)

    其中持续集成系统采用的就是Jekins技术栈

    2.工具

    上述阐述了Devops,那么到底通过什么样的工具,是Devops理论变得实际可行,下图就阐述了通过什么样的工具去实现Devops理论

    侵删 侵删

    虽然工具有很多,要想全部掌握也不大可能,同时实际开发中用的只是其中的一部分,如下:

    • 版本控制工具采用Git
    • 项目管理工具采用Maven
    • 单元测试工具采用JUint
    • 持续集成工具采用Jekins
    • 项目部署运维工具采用Docker
    • 监控工具采用ELK

    3.实现

    3.1 前提

    接下来就来实现一个Devops的实际案例,在实际案例之前需要准备以下工具:

    • 一台虚拟机(Ubuntu),且安装了Docker

      关于Docker使用教程可以查看之前的博客

    • 在虚拟机上安装Jekins

      关于Jekins使用教程可以查看之前的博客

    为了更加让Devops落地,这里我们采用JavaSpringBoot项目进行测试,当然也可以采用Vue项目。大体流程如下:

    • 将开发的代码提交到gitee
    • jekins就会去监测master分支代码是否发生改变
    • 一旦发生改变,就去执行mvn clean package命令
    • 执行完成就会将打成的jar封装成一个Docker镜像,并且推送到开发环境的服务器
    • 开发环境的服务器就会执行一个shell脚本,去创建容器运行

    具体如下图所示:

    image-20210316110544745

    3.2 实操

    3.2.1 构建项目

    项目的pom.xml内容如下

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.3.9.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.wangzh</groupId>
        <artifactId>devops-demo</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>devops-demo</name>
        <description>Demo project for Spring Boot</description>
        <properties>
            <java.version>1.8</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    构建Controller,具体如下:

    package com.wangzh.devops.web;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    @RequestMapping("/test")
    public class TestController {
    
        @GetMapping
        public String test() {
            return "这是一个测试" + Math.random();
        }
    }
    

    3.2.2 Dockerfile

    由于想要把自己的项目最后封装成一个Docker镜像,因此需要构建一个Dockerfile文件

    这里不再构建手动构建Dockerfile文件,而是通过DockerMaven插件去帮我们构建

    至于DockerMaven插件的使用可以参考之前的博客

    DockerMaven插件添加到pom.xml中,具体如下:

    <build>
            <finalName>${project.artifactId}</finalName>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <!-- docker的maven插件, 官网: https://github. com/spotify/docker-maven-plugin-->
                <plugin>
                    <groupId>com.spotify</groupId>
                    <artifactId>docker-maven-plugin</artifactId>
                    <version>0.4.13</version>
                    <configuration>
                        <!--imaname是将要创建的镜像名称-->                    <imageName>${project.artifactId}:${project.version}
                        </imageName>
                        <baseImage>jdk1.8</baseImage>
                        <entryPoint>["java", "-jar", "/${project.build.finalName}.jar"]
                        </entryPoint>
                        <resources>
                            <resource>
                                <targetPath>/</targetPath>
                                <directory>${project.build.directory}</directory>
                                <include>${project.build.finalName}.jar</include>
                            </resource>
                        </resources>
                        <!--docker主机ip,也就是生产环境的ip,到时候换成自己的ip即可-->
                        <dockerHost>http://172.16.0.154:2375</dockerHost>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    

    3.2.3 推送到Gitee

    将当前项目代码推送到gitee,当然你也可以将项目推送到gitlab或者github都是一样

    关于git相关内容,这里不再赘述

    image-20210316112256042

    3.2.4 Jekins构建

    当把代码推送到了gitee后,就可以使用Jekins去检测gitee仓库master分支代码,具体操作如下:

    1. 登录jekins

      image-20210316122109361
      1. 构建任务

      选择新建任务

      image-20210316122157968

      选择构建一个maven项目

      image-20210317091815477

      进入配置界面,进行配置,如下:

      描述

      image-20210317092119245 image-20210317092316001

      源码管理

      image-20210317092658957

      构建触发器

      image-20210317093316552

      H/2 * * * * 这个属于


      Build

      image-20210317093615878

      Post Steps

      这个步骤是用来选择构建后要执行什么样的命令,这里选择执行shell命令

      image-20210317093905290 image-20210317093948500
      # 远程登录宿主机 之所以远程登录 是因为我这个jekins是docker方式安装
      # 这种方式安装无法执行宿主机的脚本,所以需要远程登录
      ssh wangzh@172.16.0.154 -tt << remotessh
      # 执行宿主机的脚本 关于脚本这里我就不写了,可以按照自己的想法去写
      sh /data/dev-ops/publish.sh 
      #退出容器
      echo "finished!"
      exit  ###退出远程机器
      remotessh  ###结尾
      

      构建完成选择保存即可,返回控制面板就会看到新创建的任务

      image-20210317094355971

    3.2.5 构建任务

    当任务创建完成,就会每隔2分钟去检查master分支代码是否改变,如果有就会去构建

    由于这里任务刚创建,因此我们点击手动构建。如下:

    image-20210317094612274 image-20210317094638986

    在构建过程种可以查看构建日志,从而判断是否报错

    image-20210317094823314 image-20210317094923906

    通过日志发现 镜像构建成功

    image-20210317095453333

    此时这个时候去服务器查看,是否存在该镜像,如下所示,是存在的

    image-20210317095653685

    这样就实现了持续集成,如果想要发布,就需要结合之前的命令在加上自己写的脚本,就可以做到自动部署

    3.3 总结

    上述操作中,只是做了集成和部署,当然也可以把监控和测试也做成自动化,只不过就需要写自动化测试脚本。这里只是一个皮毛,如果想要深入研究,就需要结合具体场景给出具体方案

    相关文章

      网友评论

          本文标题:工具篇-聊聊Devops

          本文链接:https://www.haomeiwen.com/subject/jiyscltx.html