工具篇-聊聊Devops

2021-03-17  本文已影响0人  秃头猿猿

1.简介

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

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

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

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

网上盗了张图,侵删

关于上图阐述如下:

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

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

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

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

未命名文件 (1)

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

2.工具

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

侵删 侵删

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

3.实现

3.1 前提

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

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

具体如下图所示:

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 总结

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

上一篇下一篇

猜你喜欢

热点阅读