DevOps
DevOps概述
软件开发最初是由两个团队共同组成:(没有采用DevOps之前)
- 开发团队:从头开始设计和整体系统的构建(编写代码)。需要系统不停的迭代更新。
- 运维团队:将开发团队的代码进行测试通过后再部署上线。确保系统稳定运行。
没有采用DevOps的缺点:
- 这看似两个目标不同的团队需要协同完成一个软件的开发。在开发团队指定好计划并完成编写代码后,需要把代码交给运维团队。运维团队向开发团队反馈需要修复的BUG以及一些需要返工的任务。这时开发团队需要经常等待运维团队的反馈。这无疑会延长整个软件开发的周期。
采用DevOps的优点?
- DevOps的方式可以让公司能够更快地应对更新和市场发展变化,开发可以快速交付,部署也更加稳定。核心就在于简化Dev和Ops团队之间的流程,使整体软件开发过程更快速。说白了就是DevOps有利于快速完成项目,不会浪费时间)
整体的软件开发流程:
- PLAN:开发团队根据客户的目标制定开发计划
- CODE:根据PLAN开始编码过程,需要将不同版本的代码存储在一个库中。
- BUILD:编码完成后,需要将代码构建并且运行。
- TEST:成功构建项目后,需要测试代码是否存在BUG或错误。
- DEPLOY:代码经过手动测试和自动化测试后,认定代码已经准备好部署并且交给运维团队。
- OPERATE:运维团队将代码部署到生产环境中。
- MONITOR:项目部署上线后,需要持续的监控产品。
- INTEGRATE:然后将监控阶段收到的反馈发送回PLAN阶段,整体反复的流程就是DevOps的核心,即持续集成、持续部署。
为了保证整体流程可以高效的完成,各个阶段都有比较常见的工具,如下图:
Integrate工具(centos7-jenkins主机)
Integrate概述
-
持续集成、持续部署的工具很多,其中Jenkins是一个开源的持续集成平台。
-
Jenkins涉及到将编写完毕的代码发布到测试环境和生产环境的任务,并且还涉及到了构建项目等任务。
-
Jenkins需要大量的插件保证工作,安装成本较高,下面会基于Docker搭建Jenkins。
Jenkins介绍
-
Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具
-
Jenkins应用广泛,大多数互联网公司都采用Jenkins配合GitLab、Docker、K8s作为实现DevOps的核心工具。
-
Jenkins最强大的就在于插件,Jenkins官方提供了大量的插件库,来自动化CI/CD过程中的各种琐碎功能。
-
Jenkins最主要的工作就是将GitLab上可以构建的工程代码拉取并且进行构建,再根据流程可以选择发布到测试环境或是生产环境。经过大量的测试后,确定发行版本,再发布到生产环境
CI/CD介绍
-
CI过程即是通过Jenkins将代码拉取、构建、制作镜像交给测试人员测试。
- 持续集成:让软件代码可以持续的集成到主干上,并自动构建和测试。
-
CD过程即是通过Jenkins将打好标签的发行版本代码拉取、构建、制作镜像交给运维人员部署。
- 持续交付:让经过持续集成的代码可以进行手动部署。
- 持续部署:让可以持续交付的代码随时随地的自动化部署。
Linux下安装最新版本的Jenkins⭐
- 1:创建文件夹并跳转:
mkdir -p /root/jenkins && cd /root/jenkins
- 2:拉取最新版本的Jenkins镜像:(注意:Jenkins的版本最好在Github上找最新的版本,否则可能会出问题⭐,我们目前最新的是2.359)
docker pull jenkins/jenkins:2.359
- 3:编写docker-compose配置文件:
vi docker-compose.yml
内容如下:
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:创建data目录:
mkdir -p /usr/local/docker/jenkins_docker/data/
- 5:设置data目录写权限:
chmod -R a+w /usr/local/docker/jenkins_docker/data/
- 6:启动docker-compose文件:
docker-compose up -d
- 7:进去挂载目录data,由于Jenkins需要下载大量内容,但是由于默认下载地址下载速度较慢,需要重新设置下载地址为国内镜像站
cd /usr/local/docker/jenkins_docker/data/
rm -f hudson.model.UpdateCenter.xml
vi hudson.model.UpdateCenter.xml
内容如下:(复制进去即可)
<?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容器,访问Jenkins(需要等会):
docker-compose restart
- 10:查看Jenkins登陆的密码:
[root@centos7-jenkins jenkins]# docker exec -it jenkins cat /var/jenkins_home/secrets/initialAdminPassword
af057174db8b41808bb3ca224eb67f10
- 11:登陆Jenkins,并安装Jenkins插件:
Jenkins入门配置
安装必备插件⭐
- 需要安装的插件以及版本(版本可以不按照我们下面的,如果安装插件一直失败就使用我们下面的版本进行下载):
-
环境:当前我们的Jenkins(版本是:2.359):
- 1:Git(版本:4.11.3)
- 2:Git Parameter(版本:0.9.17)
- 3:Publish Over SSH(版本:1.24)
安装插件(方式一:可能有时会下载失败)
安装插件(方式二:本地安装⭐)
安装Jenkins插件一直失败解决方案⭐
- 1:如果没有配置Maven的国内镜像源,则要在上面安装Maven的步骤中找到配置Maven的镜像源进行配置,这样Jenkins下载插件的速度就会大大提高。
-
2:如果已经配置了Maven的国内镜像源,但还是一直下载插件失败:
- **解决方法一:**有可能是Jenkins版本太低,而我们下载的插件版本过高导致的。可以手动指定Jenkins版本和Jenkins插件版本。
- 解决方法二:去GitHub上找到目前最新,然后在dockerhub上把Jenkins版本并拉取下来,也就是说使用新版本的Jenkins即可。
解决方法二里面的找最新版本的方法图解如下:⭐
Jenkins实战1:构建Freestyle(自由风格)的Jenkins项目(C I 持续集成操作⭐)
项目流程架构图⭐
配置Jenkins的JDK和Maven
-
1:把我们之前解压的JDK目录和Maven目录都移动到Jenkins的挂载目录上⭐
- Jenkins挂载目录:/usr/local/docker/jenkins_docker/data/
- JDK目录:/usr/local/jdk/
- Maven目录:/usr/local/maven/
- **对应同步容器目录:/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(通知目标服务器插件)
- 1:在目标服务器(192.168.184.80)上创建一个目录:(由于不想再新建一个Linux服务器,所以就把192.168.184.80作为目标服务器)。
mkdir -p /usr/local/test
- 2:开始配置Publish over SSH:
- 这时我们就有一个新功能。Jenkins(192.168.184.80)可以利用publish over ssh插件来通知目标服务器(192.168.184.80)。注意:目标服务器也可以不使用192.168.184.80地址,可以用另外的服务器,没有强制要求,什么服务器都可以作为目标服务器。
在IDEA构建一个springboot项目
测试项目图
项目核心接口代码
- 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项目上传到GitLab上(用IDEA插件的方式⭐)
第二步:将gitlab上面的项目代码拉取到Jenkins中⭐
- 查看代码是否拉取成功:(可以看到代码已经成功拉取到Jenkins容器内部了)
[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构建项目的jar包⭐
- 在springboot项目中的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>
<!-- 版本需要指定为你当前springboot版本-->
<version>2.5.9</version>
<configuration>
<includeSystemScope>true</includeSystemScope>
<!-- 指定主类,也就是springboot启动类-->
<mainClass>com.boot.JenkinsDemoApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
- 开始构建jar包:
- Build Steps 的Goals内容如下:
clean package -DskipTests
- 查看是否构建成功,以及构建出来的jar包是否存在:(可以看到jenkins-demo-0.0.1-SNAPSHOT.jar就是我们构建出来的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
第四步:将构建好的jar包push推送给指定的目标服务器⭐
-
提示:
- 1:Transfer Set Source files:
target/*.jar
-
开始配置远程推送jar包给目标服务器:
- 查看我们的目标服务器:
- 进入目标服务器的shell窗口,执行命令:(可以看到jar包已经通过ssh远程推送到目标服务器的文件夹上去了)
[root@centos7-jenkins jenkins]# cd /usr/local/test/target/
[root@centos7-jenkins target]# ls
mytest.jar
第五步:利用Dockerfile和推送过来的jar包在目标服务器上生成image从而运行出容器⭐
-
1:在项目中编写Dockerfile和docker-compose.yml文件,然后上传到gitlab上去:
- Dockerfile(内容):
FROM java:8 COPY mytest.jar /usr/local/ WORKDIR /usr/local CMD java -jar mytest.jar
- docker-compose.yml(内容):
version: "3.1" services: mytest: build: context: ./ dockerfile: Dockerfile image: mytest:v1.0.0 container_name: mytest ports: - 8082:8082 #因为我们application.yml配置这个项目是8082端口
- 2:删除目标服务器一些文件夹:
[root@centos7-jenkins test]# rm -rf /usr/local/test/docker/ /usr/local/test/target/
-
3:在Jenkins进行配置:
- 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构建完成之后查看镜像和容器:(可以看到mytest:v1.0.0 已经启动。)
- 查看镜像:
[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
- 查看构建出来的项目容器实例:
[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
第六步:测试访问这个容器⭐
Jenkins实战2:构建Freestyle(自由风格)的Jenkins项目(C D 持续交付操作⭐)
- Jenkins实战2要建立Jenkins实战1的基础上。
- 必须先完成Jenkins实战1,在Jenkins实战1的基础上在做修改成CD模式。
注意:先完成Jenkins实战1的步骤(⭐)
案例过程:在Jenkins实战1的基础上,通过修改部分内容让CI变成CD。
配置Jenkins根据gitlab的tag(标签)进行构建工程(⭐)
新增两个新的tag标签⭐
v1.0.0的tag标签
v2.0.0的tag标签
开始进行Jenkins参数化构建工程(基于gitlab上的tag⭐)
测试构建v1.0.0的tag⭐
文章来源:https://www.toymoban.com/news/detail-719355.html
测试构建v2.0.0的tag⭐
文章来源地址https://www.toymoban.com/news/detail-719355.html
到了这里,关于DevOps持续集成-Jenkins(2)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!