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
更好的闡述污桦,如下:
關(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ā)流程大體如下圖所示:
其中持續(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
落地蝠引,這里我們采用Java
的SpringBoot
項(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)行
具體如下圖所示:
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)容综液,這里不再贅述
3.2.4 Jekins構(gòu)建
當(dāng)把代碼推送到了gitee
后区拳,就可以使用Jekins
去檢測(cè)gitee
倉庫master分支代碼,具體操作如下:
-
登錄
jekins
- 構(gòu)建任務(wù)
選擇新建任務(wù)
選擇構(gòu)建一個(gè)maven項(xiàng)目
進(jìn)入配置界面意乓,進(jìn)行配置樱调,如下:
描述
源碼管理
構(gòu)建觸發(fā)器
H/2 * * * *
這個(gè)屬于
Build
Post Steps
這個(gè)步驟是用來選擇構(gòu)建后要執(zhí)行什么樣的命令约素,這里選擇執(zhí)行
shell
命令# 遠(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ù)
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)建。如下:
在構(gòu)建過程種可以查看構(gòu)建日志爪模,從而判斷是否報(bào)錯(cuò)
通過日志發(fā)現(xiàn) 鏡像構(gòu)建成功
此時(shí)這個(gè)時(shí)候去服務(wù)器查看欠啤,是否存在該鏡像,如下所示屋灌,是存在的
這樣就實(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)景給出具體方案