DevOps
DevOps概述
軟件開(kāi)發(fā)最初是由兩個(gè)團(tuán)隊(duì)共同組成:(沒(méi)有采用DevOps之前)
- 開(kāi)發(fā)團(tuán)隊(duì):從頭開(kāi)始設(shè)計(jì)和整體系統(tǒng)的構(gòu)建(編寫代碼)。需要系統(tǒng)不停的迭代更新。
- 運(yùn)維團(tuán)隊(duì):將開(kāi)發(fā)團(tuán)隊(duì)的代碼進(jìn)行測(cè)試通過(guò)后再部署上線。確保系統(tǒng)穩(wěn)定運(yùn)行。
沒(méi)有采用DevOps的缺點(diǎn):
- 這看似兩個(gè)目標(biāo)不同的團(tuán)隊(duì)需要協(xié)同完成一個(gè)軟件的開(kāi)發(fā)。在開(kāi)發(fā)團(tuán)隊(duì)指定好計(jì)劃并完成編寫代碼后,需要把代碼交給運(yùn)維團(tuán)隊(duì)。運(yùn)維團(tuán)隊(duì)向開(kāi)發(fā)團(tuán)隊(duì)反饋需要修復(fù)的BUG以及一些需要返工的任務(wù)。這時(shí)開(kāi)發(fā)團(tuán)隊(duì)需要經(jīng)常等待運(yùn)維團(tuán)隊(duì)的反饋。這無(wú)疑會(huì)延長(zhǎng)整個(gè)軟件開(kāi)發(fā)的周期。
采用DevOps的優(yōu)點(diǎn)?
- DevOps的方式可以讓公司能夠更快地應(yīng)對(duì)更新和市場(chǎng)發(fā)展變化,開(kāi)發(fā)可以快速交付,部署也更加穩(wěn)定。核心就在于簡(jiǎn)化Dev和Ops團(tuán)隊(duì)之間的流程,使整體軟件開(kāi)發(fā)過(guò)程更快速。說(shuō)白了就是DevOps有利于快速完成項(xiàng)目,不會(huì)浪費(fèi)時(shí)間)
整體的軟件開(kāi)發(fā)流程:
- PLAN:開(kāi)發(fā)團(tuán)隊(duì)根據(jù)客戶的目標(biāo)制定開(kāi)發(fā)計(jì)劃
- CODE:根據(jù)PLAN開(kāi)始編碼過(guò)程,需要將不同版本的代碼存儲(chǔ)在一個(gè)庫(kù)中。
- BUILD:編碼完成后,需要將代碼構(gòu)建并且運(yùn)行。
- TEST:成功構(gòu)建項(xiàng)目后,需要測(cè)試代碼是否存在BUG或錯(cuò)誤。
- DEPLOY:代碼經(jīng)過(guò)手動(dòng)測(cè)試和自動(dòng)化測(cè)試后,認(rèn)定代碼已經(jīng)準(zhǔn)備好部署并且交給運(yùn)維團(tuán)隊(duì)。
- OPERATE:運(yùn)維團(tuán)隊(duì)將代碼部署到生產(chǎn)環(huán)境中。
- MONITOR:項(xiàng)目部署上線后,需要持續(xù)的監(jiān)控產(chǎn)品。
- INTEGRATE:然后將監(jiān)控階段收到的反饋發(fā)送回PLAN階段,整體反復(fù)的流程就是DevOps的核心,即持續(xù)集成、持續(xù)部署。
為了保證整體流程可以高效的完成,各個(gè)階段都有比較常見(jiàn)的工具,如下圖:
Integrate工具(centos7-jenkins主機(jī))
Integrate概述
-
持續(xù)集成、持續(xù)部署的工具很多,其中Jenkins是一個(gè)開(kāi)源的持續(xù)集成平臺(tái)。
-
Jenkins涉及到將編寫完畢的代碼發(fā)布到測(cè)試環(huán)境和生產(chǎn)環(huán)境的任務(wù),并且還涉及到了構(gòu)建項(xiàng)目等任務(wù)。
-
Jenkins需要大量的插件保證工作,安裝成本較高,下面會(huì)基于Docker搭建Jenkins。
Jenkins介紹
-
Jenkins是一個(gè)開(kāi)源軟件項(xiàng)目,是基于Java開(kāi)發(fā)的一種持續(xù)集成工具
-
Jenkins應(yīng)用廣泛,大多數(shù)互聯(lián)網(wǎng)公司都采用Jenkins配合GitLab、Docker、K8s作為實(shí)現(xiàn)DevOps的核心工具。
-
Jenkins最強(qiáng)大的就在于插件,Jenkins官方提供了大量的插件庫(kù),來(lái)自動(dòng)化CI/CD過(guò)程中的各種瑣碎功能。
-
Jenkins最主要的工作就是將GitLab上可以構(gòu)建的工程代碼拉取并且進(jìn)行構(gòu)建,再根據(jù)流程可以選擇發(fā)布到測(cè)試環(huán)境或是生產(chǎn)環(huán)境。經(jīng)過(guò)大量的測(cè)試后,確定發(fā)行版本,再發(fā)布到生產(chǎn)環(huán)境
CI/CD介紹
-
CI過(guò)程即是通過(guò)Jenkins將代碼拉取、構(gòu)建、制作鏡像交給測(cè)試人員測(cè)試。
- 持續(xù)集成:讓軟件代碼可以持續(xù)的集成到主干上,并自動(dòng)構(gòu)建和測(cè)試。
-
CD過(guò)程即是通過(guò)Jenkins將打好標(biāo)簽的發(fā)行版本代碼拉取、構(gòu)建、制作鏡像交給運(yùn)維人員部署。
- 持續(xù)交付:讓經(jīng)過(guò)持續(xù)集成的代碼可以進(jìn)行手動(dòng)部署。
- 持續(xù)部署:讓可以持續(xù)交付的代碼隨時(shí)隨地的自動(dòng)化部署。
Linux下安裝最新版本的Jenkins?
- 1:創(chuàng)建文件夾并跳轉(zhuǎn):
mkdir -p /root/jenkins && cd /root/jenkins
- 2:拉取最新版本的Jenkins鏡像:(注意:Jenkins的版本最好在Github上找最新的版本,否則可能會(huì)出問(wèn)題?,我們目前最新的是2.359)
docker pull jenkins/jenkins:2.359
- 3:編寫docker-compose配置文件:
vi docker-compose.yml
內(nèi)容如下:
version: "3.1"
services:
jenkins:
image: jenkins/jenkins:2.359
container_name: jenkins
ports:
- 9200:8080
- 50000:50000
volumes:
- /usr/local/docker/jenkins_docker/data/:/var/jenkins_home/
- 4:創(chuàng)建data目錄:
mkdir -p /usr/local/docker/jenkins_docker/data/
- 5:設(shè)置data目錄寫權(quán)限:
chmod -R a+w /usr/local/docker/jenkins_docker/data/
- 6:?jiǎn)?dòng)docker-compose文件:
docker-compose up -d
- 7:進(jìn)去掛載目錄data,由于Jenkins需要下載大量?jī)?nèi)容,但是由于默認(rèn)下載地址下載速度較慢,需要重新設(shè)置下載地址為國(guó)內(nèi)鏡像站
cd /usr/local/docker/jenkins_docker/data/
rm -f hudson.model.UpdateCenter.xml
vi hudson.model.UpdateCenter.xml
內(nèi)容如下:(復(fù)制進(jìn)去即可)
<?xml version='1.1' encoding='UTF-8'?>
<sites>
<site>
<id>default</id>
<url>http://mirror.esuni.jp/jenkins/updates/update-center.json</url>
</site>
</sites>
- 8:切換回Jenkins目錄:
cd /root/jenkins
- 9:再次重啟Jenkins容器,訪問(wèn)Jenkins(需要等會(huì)):
docker-compose restart
- 10:查看Jenkins登陸的密碼:
[root@centos7-jenkins jenkins]# docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
af057174db8b41808bb3ca224eb67f10
- 11:登陸Jenkins,并安裝Jenkins插件:
Jenkins入門配置
安裝必備插件?
- 需要安裝的插件以及版本(版本可以不按照我們下面的,如果安裝插件一直失敗就使用我們下面的版本進(jìn)行下載):
-
環(huán)境:當(dāng)前我們的Jenkins(版本是:2.359):
- 1:Git(版本:4.11.3)
- 2:Git Parameter(版本:0.9.17)
- 3:Publish Over SSH(版本:1.24)
安裝插件(方式一:可能有時(shí)會(huì)下載失?。?/h6>
安裝插件(方式二:本地安裝?)
安裝Jenkins插件一直失敗解決方案?
- 1:如果沒(méi)有配置Maven的國(guó)內(nèi)鏡像源,則要在上面安裝Maven的步驟中找到配置Maven的鏡像源進(jìn)行配置,這樣Jenkins下載插件的速度就會(huì)大大提高。
-
2:如果已經(jīng)配置了Maven的國(guó)內(nèi)鏡像源,但還是一直下載插件失?。?/strong>
- **解決方法一:**有可能是Jenkins版本太低,而我們下載的插件版本過(guò)高導(dǎo)致的。可以手動(dòng)指定Jenkins版本和Jenkins插件版本。
- 解決方法二:去GitHub上找到目前最新,然后在dockerhub上把Jenkins版本并拉取下來(lái),也就是說(shuō)使用新版本的Jenkins即可。
解決方法二里面的找最新版本的方法圖解如下:?
Jenkins實(shí)戰(zhàn)1:構(gòu)建Freestyle(自由風(fēng)格)的Jenkins項(xiàng)目(C I 持續(xù)集成操作?)
項(xiàng)目流程架構(gòu)圖?
配置Jenkins的JDK和Maven
-
1:把我們之前解壓的JDK目錄和Maven目錄都移動(dòng)到Jenkins的掛載目錄上?
- Jenkins掛載目錄:/usr/local/docker/jenkins_docker/data/
- JDK目錄:/usr/local/jdk/
- Maven目錄:/usr/local/maven/
- **對(duì)應(yīng)同步容器目錄:/var/jenkins_home/ **
cd /usr/local/docker/jenkins_docker/data/
mv /usr/local/jdk/ /usr/local/docker/jenkins_docker/data
mv /usr/local/maven/ /usr/local/docker/jenkins_docker/data
- 2:在Jenkins可視化界面的全局配置中配置JDK和Maven:
配置Publish over SSH(通知目標(biāo)服務(wù)器插件)
- 1:在目標(biāo)服務(wù)器(192.168.184.80)上創(chuàng)建一個(gè)目錄:(由于不想再新建一個(gè)Linux服務(wù)器,所以就把192.168.184.80作為目標(biāo)服務(wù)器)。
mkdir -p /usr/local/test
- 2:開(kāi)始配置Publish over SSH:
- 這時(shí)我們就有一個(gè)新功能。Jenkins(192.168.184.80)可以利用publish over ssh插件來(lái)通知目標(biāo)服務(wù)器(192.168.184.80)。注意:目標(biāo)服務(wù)器也可以不使用192.168.184.80地址,可以用另外的服務(wù)器,沒(méi)有強(qiáng)制要求,什么服務(wù)器都可以作為目標(biāo)服務(wù)器。
在IDEA構(gòu)建一個(gè)springboot項(xiàng)目
測(cè)試項(xiàng)目圖
項(xiàng)目核心接口代碼
- 1:JenkinsController.java
package com.boot.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class JenkinsController {
@ResponseBody
@GetMapping(path = "/test")
public String test(){
return "hello Jenkins";
}
}
- 2:application.properties
spring.application.name=jenkins-demo
server.port=8082
第一步:將springboot項(xiàng)目上傳到GitLab上(用IDEA插件的方式?)
第二步:將gitlab上面的項(xiàng)目代碼拉取到Jenkins中?
- 查看代碼是否拉取成功:(可以看到代碼已經(jīng)成功拉取到Jenkins容器內(nèi)部了)
[root@centos7-jenkins jenkins] docker exec -it jenkins bash
[root@centos7-jenkins Jenkins容器] cd var/jenkins_home/workspace/mytest/
[root@centos7-jenkins Jenkins容器] ls
README.md mvnw mvnw.cmd pom.xml src
第三步:利用Maven構(gòu)建項(xiàng)目的jar包?
- 在springboot項(xiàng)目中的pom.xml上配置maven插件:(加入這段代碼并上傳gitlab)
<build>
<!-- 生成的jar包就是mytest.jar-->
<finalName>mytest</finalName>
<plugins>
<!-- 配置maven插件-->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
<!-- 版本需要指定為你當(dāng)前springboot版本-->
<version>2.5.9</version>
<configuration>
<includeSystemScope>true</includeSystemScope>
<!-- 指定主類,也就是springboot啟動(dòng)類-->
<mainClass>com.boot.JenkinsDemoApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
- 開(kāi)始構(gòu)建jar包:
- Build Steps 的Goals內(nèi)容如下:
clean package -DskipTests
- 查看是否構(gòu)建成功,以及構(gòu)建出來(lái)的jar包是否存在:(可以看到j(luò)enkins-demo-0.0.1-SNAPSHOT.jar就是我們構(gòu)建出來(lái)的jar包)
[root@centos7-jenkins jenkins]# docker exec -it jenkins bash
[root@centos7-jenkins 容器]# cd var/jenkins_home/workspace/mytest/target/
[root@centos7-jenkins 容器]# ls
classes generated-test-sources maven-archiver test-classes
generated-sources mytest.jar maven-status
第四步:將構(gòu)建好的jar包push推送給指定的目標(biāo)服務(wù)器?
-
提示:
- 1:Transfer Set Source files:
target/*.jar
-
開(kāi)始配置遠(yuǎn)程推送jar包給目標(biāo)服務(wù)器:
- 查看我們的目標(biāo)服務(wù)器:
- 進(jìn)入目標(biāo)服務(wù)器的shell窗口,執(zhí)行命令:(可以看到j(luò)ar包已經(jīng)通過(guò)ssh遠(yuǎn)程推送到目標(biāo)服務(wù)器的文件夾上去了)
[root@centos7-jenkins jenkins]# cd /usr/local/test/target/
[root@centos7-jenkins target]# ls
mytest.jar
第五步:利用Dockerfile和推送過(guò)來(lái)的jar包在目標(biāo)服務(wù)器上生成image從而運(yùn)行出容器?
-
1:在項(xiàng)目中編寫Dockerfile和docker-compose.yml文件,然后上傳到gitlab上去:
- Dockerfile(內(nèi)容):
FROM java:8 COPY mytest.jar /usr/local/ WORKDIR /usr/local CMD java -jar mytest.jar
- docker-compose.yml(內(nèi)容):
version: "3.1" services: mytest: build: context: ./ dockerfile: Dockerfile image: mytest:v1.0.0 container_name: mytest ports: - 8082:8082 #因?yàn)槲覀僡pplication.yml配置這個(gè)項(xiàng)目是8082端口
- 2:刪除目標(biāo)服務(wù)器一些文件夾:
[root@centos7-jenkins test]# rm -rf /usr/local/test/docker/ /usr/local/test/target/
-
3:在Jenkins進(jìn)行配置:
- Transfer Set Source files:
target/*.jar docker/*
- Exec command:
cd /usr/local/test/docker mv ../target/*jar ./ docker-compose down docker-compose up -d --build docker image prune -f
-
4:Jenkins構(gòu)建完成之后查看鏡像和容器:(可以看到mytest:v1.0.0 已經(jīng)啟動(dòng)。)
- 查看鏡像:
[root@centos7-jenkins local]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE mytest v1.0.0 db233798a206 2 minutes ago 661MB jenkins/jenkins 2.359 616d2581d755 7 days ago 463MB
- 查看構(gòu)建出來(lái)的項(xiàng)目容器實(shí)例:
[root@centos7-jenkins local]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 04146936e4ec mytest:v1.0.0 "/bin/sh -c 'java -j…" 3 minutes ago Up 3 minutes 0.0.0.0:8082->8082/tcp, :::8082->8082/tcp mytest 5b69eb0eb387 jenkins/jenkins:2.359 "/usr/bin/tini -- /u…" 24 hours ago Up About an hour 0.0.0.0:50000->50000/tcp, :::50000->50000/tcp, 0.0.0.0:9200->8080/tcp, :::9200->8080/tcp jenkins
第六步:測(cè)試訪問(wèn)這個(gè)容器?
Jenkins實(shí)戰(zhàn)2:構(gòu)建Freestyle(自由風(fēng)格)的Jenkins項(xiàng)目(C D 持續(xù)交付操作?)
- Jenkins實(shí)戰(zhàn)2要建立Jenkins實(shí)戰(zhàn)1的基礎(chǔ)上。
- 必須先完成Jenkins實(shí)戰(zhàn)1,在Jenkins實(shí)戰(zhàn)1的基礎(chǔ)上在做修改成CD模式。
注意:先完成Jenkins實(shí)戰(zhàn)1的步驟(?)
案例過(guò)程:在Jenkins實(shí)戰(zhàn)1的基礎(chǔ)上,通過(guò)修改部分內(nèi)容讓CI變成CD。
配置Jenkins根據(jù)gitlab的tag(標(biāo)簽)進(jìn)行構(gòu)建工程(?)
新增兩個(gè)新的tag標(biāo)簽?
v1.0.0的tag標(biāo)簽
v2.0.0的tag標(biāo)簽
開(kāi)始進(jìn)行Jenkins參數(shù)化構(gòu)建工程(基于gitlab上的tag?)
測(cè)試構(gòu)建v1.0.0的tag?
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-719355.html
測(cè)試構(gòu)建v2.0.0的tag?
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-719355.html
到了這里,關(guān)于DevOps持續(xù)集成-Jenkins(2)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!