工具篇-聊聊Devops

1.簡(jiǎn)介

Devops簡(jiǎn)而言之是一個(gè)思想或者是一個(gè)理論,主要闡述是開發(fā) 測(cè)試 運(yùn)維一體化

Devops是一種重視軟件開發(fā)人員(Dev)和軟件運(yùn)維人員(Ops)之間的溝通合作的文化

通過一些自動(dòng)化軟件(這里我用的是Jekins)來自動(dòng)化""軟件交付"和"架構(gòu)變更"的流程,從而使項(xiàng)目構(gòu)建,測(cè)試皂吮,發(fā)布更加的快捷予借,頻繁,可靠闸拿。

下圖則是對(duì)Devops更好的闡述污桦,如下:

網(wǎng)上盜了張圖刊驴,侵刪

關(guān)于上圖闡述如下:

  • 當(dāng)來了一個(gè)需求(Plan),那么開發(fā)人員就會(huì)根據(jù)需求進(jìn)行編碼(code)

  • 當(dāng)編碼完成就會(huì)去構(gòu)建項(xiàng)目(build),構(gòu)建完成之后就需要進(jìn)行測(cè)試(test)

  • 當(dāng)測(cè)試完成后就會(huì)去進(jìn)行發(fā)布(release),發(fā)布完成就會(huì)去進(jìn)行部署(deploy)

  • 當(dāng)部署完成就會(huì)去進(jìn)行運(yùn)維(operate),運(yùn)維后回去進(jìn)行項(xiàng)目的監(jiān)控(monitor)

  • 當(dāng)在項(xiàng)目監(jiān)控的過程中產(chǎn)生新的需求或者甲方提出新的需求,這樣就會(huì)進(jìn)入上述流程寡润,從而形成一個(gè)閉環(huán)

在早期開發(fā)中,尤其是在敏捷開發(fā)過程中如果按照早期開發(fā)和部署分開的形式去進(jìn)行工作舅柜,對(duì)于軟件的交付和部署肯定不能夠按時(shí)交付的

Devops就是使用一系列的工程方法和工具來提交效率梭纹,讓上圖的閉環(huán)循環(huán)的自動(dòng)化轉(zhuǎn)動(dòng)起來

也就是說開發(fā)人員只需要關(guān)注編碼,在保證編碼質(zhì)量的前提下致份,讓構(gòu)建到監(jiān)控均自動(dòng)化運(yùn)轉(zhuǎn)起來

在一些公司(這里以我當(dāng)前所在公司為例)中变抽,開發(fā)流程大體如下圖所示:

未命名文件 (1)

其中持續(xù)集成系統(tǒng)采用的就是Jekins技術(shù)棧

2.工具

上述闡述了Devops,那么到底通過什么樣的工具氮块,是Devops理論變得實(shí)際可行绍载,下圖就闡述了通過什么樣的工具去實(shí)現(xiàn)Devops理論

侵刪
侵刪

雖然工具有很多,要想全部掌握也不大可能滔蝉,同時(shí)實(shí)際開發(fā)中用的只是其中的一部分击儡,如下:

  • 版本控制工具采用Git
  • 項(xiàng)目管理工具采用Maven
  • 單元測(cè)試工具采用JUint
  • 持續(xù)集成工具采用Jekins
  • 項(xiàng)目部署運(yùn)維工具采用Docker
  • 監(jiān)控工具采用ELK

3.實(shí)現(xiàn)

3.1 前提

接下來就來實(shí)現(xiàn)一個(gè)Devops的實(shí)際案例,在實(shí)際案例之前需要準(zhǔn)備以下工具:

  • 一臺(tái)虛擬機(jī)(Ubuntu),且安裝了Docker

    關(guān)于Docker使用教程可以查看之前的博客

  • 在虛擬機(jī)上安裝Jekins

    關(guān)于Jekins使用教程可以查看之前的博客

為了更加讓Devops落地蝠引,這里我們采用JavaSpringBoot項(xiàng)目進(jìn)行測(cè)試阳谍,當(dāng)然也可以采用Vue項(xiàng)目。大體流程如下:

  • 將開發(fā)的代碼提交到gitee
  • jekins就會(huì)去監(jiān)測(cè)master分支代碼是否發(fā)生改變
  • 一旦發(fā)生改變螃概,就去執(zhí)行mvn clean package命令
  • 執(zhí)行完成就會(huì)將打成的jar封裝成一個(gè)Docker鏡像矫夯,并且推送到開發(fā)環(huán)境的服務(wù)器
  • 開發(fā)環(huán)境的服務(wù)器就會(huì)執(zhí)行一個(gè)shell腳本,去創(chuàng)建容器運(yùn)行

具體如下圖所示:

image-20210316110544745

3.2 實(shí)操

3.2.1 構(gòu)建項(xiàng)目

項(xiàng)目的pom.xml內(nèi)容如下

<?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>

構(gòu)建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 "這是一個(gè)測(cè)試" + Math.random();
    }
}

3.2.2 Dockerfile

由于想要把自己的項(xiàng)目最后封裝成一個(gè)Docker鏡像训貌,因此需要構(gòu)建一個(gè)Dockerfile文件

這里不再構(gòu)建手動(dòng)構(gòu)建Dockerfile文件,而是通過DockerMaven插件去幫我們構(gòu)建

至于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插件递沪, 官網(wǎng): https://github. com/spotify/docker-maven-plugin-->
            <plugin>
                <groupId>com.spotify</groupId>
                <artifactId>docker-maven-plugin</artifactId>
                <version>0.4.13</version>
                <configuration>
                    <!--imaname是將要?jiǎng)?chuàng)建的鏡像名稱-->                    <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主機(jī)ip,也就是生產(chǎn)環(huán)境的ip,到時(shí)候換成自己的ip即可-->
                    <dockerHost>http://172.16.0.154:2375</dockerHost>
                </configuration>
            </plugin>
        </plugins>
    </build>

3.2.3 推送到Gitee

將當(dāng)前項(xiàng)目代碼推送到gitee,當(dāng)然你也可以將項(xiàng)目推送到gitlab或者github都是一樣

關(guān)于git相關(guān)內(nèi)容综液,這里不再贅述

image-20210316112256042

3.2.4 Jekins構(gòu)建

當(dāng)把代碼推送到了gitee后区拳,就可以使用Jekins去檢測(cè)gitee倉庫master分支代碼,具體操作如下:

  1. 登錄jekins

    image-20210316122109361
    1. 構(gòu)建任務(wù)

    選擇新建任務(wù)

    image-20210316122157968

    選擇構(gòu)建一個(gè)maven項(xiàng)目

    image-20210317091815477

    進(jìn)入配置界面意乓,進(jìn)行配置樱调,如下:

    描述

    image-20210317092119245
    image-20210317092316001

    源碼管理

    image-20210317092658957

    構(gòu)建觸發(fā)器

    image-20210317093316552

    H/2 * * * * 這個(gè)屬于


    Build

    image-20210317093615878

    Post Steps

    這個(gè)步驟是用來選擇構(gòu)建后要執(zhí)行什么樣的命令约素,這里選擇執(zhí)行shell命令

    image-20210317093905290
    image-20210317093948500
    # 遠(yuǎn)程登錄宿主機(jī) 之所以遠(yuǎn)程登錄 是因?yàn)槲疫@個(gè)jekins是docker方式安裝
    # 這種方式安裝無法執(zhí)行宿主機(jī)的腳本,所以需要遠(yuǎn)程登錄
    ssh wangzh@172.16.0.154 -tt << remotessh
    # 執(zhí)行宿主機(jī)的腳本 關(guān)于腳本這里我就不寫了笆凌,可以按照自己的想法去寫
    sh /data/dev-ops/publish.sh 
    #退出容器
    echo "finished!"
    exit  ###退出遠(yuǎn)程機(jī)器
    remotessh  ###結(jié)尾
    

    構(gòu)建完成選擇保存即可圣猎,返回控制面板就會(huì)看到新創(chuàng)建的任務(wù)

    image-20210317094355971

3.2.5 構(gòu)建任務(wù)

當(dāng)任務(wù)創(chuàng)建完成,就會(huì)每隔2分鐘去檢查master分支代碼是否改變乞而,如果有就會(huì)去構(gòu)建

由于這里任務(wù)剛創(chuàng)建送悔,因此我們點(diǎn)擊手動(dòng)構(gòu)建。如下:

image-20210317094612274
image-20210317094638986

在構(gòu)建過程種可以查看構(gòu)建日志爪模,從而判斷是否報(bào)錯(cuò)

image-20210317094823314
image-20210317094923906

通過日志發(fā)現(xiàn) 鏡像構(gòu)建成功

image-20210317095453333

此時(shí)這個(gè)時(shí)候去服務(wù)器查看欠啤,是否存在該鏡像,如下所示屋灌,是存在的

image-20210317095653685

這樣就實(shí)現(xiàn)了持續(xù)集成洁段,如果想要發(fā)布,就需要結(jié)合之前的命令在加上自己寫的腳本共郭,就可以做到自動(dòng)部署

3.3 總結(jié)

上述操作中祠丝,只是做了集成和部署,當(dāng)然也可以把監(jiān)控和測(cè)試也做成自動(dòng)化除嘹,只不過就需要寫自動(dòng)化測(cè)試腳本写半。這里只是一個(gè)皮毛,如果想要深入研究尉咕,就需要結(jié)合具體場(chǎng)景給出具體方案

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
禁止轉(zhuǎn)載叠蝇,如需轉(zhuǎn)載請(qǐng)通過簡(jiǎn)信或評(píng)論聯(lián)系作者。
  • 序言:七十年代末年缎,一起剝皮案震驚了整個(gè)濱河市蟆肆,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌晦款,老刑警劉巖炎功,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異缓溅,居然都是意外死亡蛇损,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門坛怪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淤齐,“玉大人,你說我怎么就攤上這事袜匿「模” “怎么了箕昭?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵帮孔,是天一觀的道長濒翻。 經(jīng)常有香客問我丁溅,道長,這世上最難降的妖魔是什么义锥? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任柳沙,我火速辦了婚禮,結(jié)果婚禮上拌倍,老公的妹妹穿的比我還像新娘赂鲤。我一直安慰自己,他們只是感情好柱恤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布数初。 她就那樣靜靜地躺著,像睡著了一般梗顺。 火紅的嫁衣襯著肌膚如雪泡孩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天荚守,我揣著相機(jī)與錄音,去河邊找鬼练般。 笑死矗漾,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的薄料。 我是一名探鬼主播敞贡,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼摄职!你這毒婦竟也來了誊役?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤谷市,失蹤者是張志新(化名)和其女友劉穎蛔垢,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迫悠,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鹏漆,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了创泄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艺玲。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖鞠抑,靈堂內(nèi)的尸體忽然破棺而出饭聚,到底是詐尸還是另有隱情,我是刑警寧澤搁拙,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布秒梳,位于F島的核電站法绵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏端幼。R本人自食惡果不足惜礼烈,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望婆跑。 院中可真熱鬧此熬,春花似錦、人聲如沸滑进。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽扶关。三九已至阴汇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間节槐,已是汗流浹背搀庶。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铜异,地道東北人哥倔。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像揍庄,于是被迫代替她去往敵國和親咆蒿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容