【DevOps实战系列】第五章:基于Gitlab/Maven/Jenkins/Docker实战案例详解

news2024/10/3 10:46:26

个人亲自录制全套DevOps系列实战教程手把手教你玩转DevOps全栈技术

在这里插入图片描述

从创建Jenkins的job开始

1.gitlab设置:

我们从新建一个jenkins任务开始,建一个自由风格项目,我们暂时只让他能拉取git的代码。

路径:从gitlab上新建一个工程demo -> Idea创建Springboot项目demo,并提交至gitlab -> jenkins中指定拉取的仓库和鉴权信息。
在这里插入图片描述
因为我的仓库是private,所以需要输入用户名、密码才可以,从Credentials选项添加即可(也可通过”凭证“功能单独添加)。点击构建进行测试,如果输出如下内容表示git配置成功。
在这里插入图片描述

2.maven设置:

其实之前讲的”全局“配置中已经对maven做了配置,在jenkins的job中只需引用即可,并添加自己的构建命令。

路径:找到job的”构建“节点,然后选择之前配置的maven,在”目标“中指定构建命令,如:-DskipTests=true clean install
在这里插入图片描述
再次点击构建,我们发现log中是成功的,并在构建到目录:/var/jenkins_home/workspace/test/target/demo-0.0.1-SNAPSHOT.jar

注意:第一次构建时会比较慢,因为会去中心仓库下载大量的依赖到本地私服(可以到nexus中查看)并且下载到jenkins本地(maven客户端),之后再次构建将会直接使用jenkins本地的依赖,就会很快了。

优化:我们发现打包后的jar包名字不太好记,这个是maven的设置,只需在springboot工程的pom.xml中增加<build>标签:通过fileName指定即可

<build>
   <! -- 打包后的jar包为:demo.jar -- >
   <finalName>demo</finalName>
   <plugins>
     <! -- springboot专用构建插件,如果不配置,打出来的jar包,通过java -jar不能找到main方法 -- >
       <plugin>
           <groupId>org.springframework.boot</groupId>
           <artifactId>spring-boot-maven-plugin</artifactId>
       </plugin>
   </plugins>
</build>
3.ssh发布:

这里我们先使用【最简单的ssh命令方法来】发布服务,后边会讲解pipeline流水线的发布方法。

根据流程我们已经完成了git项目的拉取、maven的构建打包,最后就是将打包后的springboot部署到docker容器并运行。

我们知道运行docker之前要先有镜像,而因为我们需要的是包含springboot jar包的镜像,所以我们只能先构建这么一个镜像,然后再运行镜像。

此处我们暂时不介入docker仓库,而是直接在docker本地构建镜像后启动运行容器
需要做的事情:

  • 将构建的jar包拷贝到宿主机指定目录(如:/share/jenkins/demo)
  • 在springboot工程创建Dockerfile文件,用于构建镜像(放到宿主机存放jar包所在目录)
  • 在springboot工程创建docker-compose.yml文件,用于启动容器(放到宿主机存放jar包所在目录)
  • 在jenkins构建后执行的脚本(可以写入脚本文件),执行内容主要目的就是运行docker-compose up -d来启动容器。


操作路径:”构建后操作“ -> ”Send build artifacts over SSH“
在这里插入图片描述
如上配置,打包后会将jar包通过ssh发布到宿主机的/share/jenkins/demo/target/demo.jar目录,/share/jenkins是我们在系统设置中设置ssh时指定的目录,

/demo则是"Remote directory"属性的含义,target/demo.jar则是匹配"Source files"属性。

虽然不会将springboot的docker目录打包,但已经通过git拉取到了jenkins的目录,所以此处可以将docker目录一起发布到ssh远程目录,

这样我们就可以通过ssh脚本来执行构建并运行容器了。

问题:如上配置,经过多次对demo构建后,虽然镜像和容器都是最新构建和部署的,但是会产生多个镜像名为none的镜像,这是因为我们每次都会构建新镜像,而原有镜像没有删除,此时docker会更名他们为none,所以我们对脚本进行优化,就是构建前先把老镜像删除,因为我们每次都是重新打jar包,所以镜像也不会相同,所以老镜像直接删除即可。
在这里插入图片描述

# docker-compose down 停止容器并删除镜像,这个也不太合适,因为构建起见容器不可用,虽然k8s可以热部署,但这里我们也不希望让服务不可用时间过长

set -e \
&& cd /share/jenkins/demo/docker \
&& mv ../target/demo.jar . \
&& docker-compose up -d --build \
&& docker image prune -f
# 好处:这样操作容器的不可服务时间会很短,因为没有停掉原有容器的操作,这样在构建期间将会临时创建新容器,构建完成后替换掉原有容器。

悬空镜像:就是新构建的镜像替换了原有镜像的标签,而原有镜像的标签将会变成none,这些镜像docker并不会自动删除,我们可以通过命令查出这样的镜像手动删除

# 查找悬空镜像命令:
docker images -f "dangling=true" -q

# 删除悬空镜像命令:
docker image prune  
# 也可以,其中-f是不需要确认
docker rmi $(docker images -f "dangling=true" -q) 

官网参考:
https://docs.docker.com/engine/reference/commandline/image_prune/

4.Springboot:工程名为demo

在这里插入图片描述
Dockerfile文件:我没找到合适的java 1.8版本的镜像,所以这里选择基于centos7构建了带有jdk8和jar包的镜像,如果大家自己能找到合适的镜像自行替换就行,

只要保障有java环境即可,我这个构建完后有800M+,如果希望轻量级也可以基于alpine内核来构建。

FROM centos:centos7
LABEL maintainer="xxx@126.com"
USER root
COPY * /docker/
WORKDIR /usr/local
RUN set -e \
   && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
   && echo 'Asia/Shanghai' > /etc/timezone \
   && chmod 755 /docker/* \
   && mv -f /docker/jdk-8u181-linux-x64.tar.gz ./ \
   && tar -zxf jdk-8u181-linux-x64.tar.gz \
   && rm -f jdk-8u181-linux-x64.tar.gz \
   && echo "jdk install is complete!" \
   && echo "try to run server ..." \
   && mkdir packages \
   && mv -f /docker/*.jar ./packages
ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV CLASSPATH .:$JAVA_HOME/lib
ENV PATH $JAVA_HOME/bin:$PATH
# 暴露端口
EXPOSE 8080
# 执行脚本
ENTRYPOINT ["java","-jar","/usr/local/packages/demo.jar"]

当然也可以基于openjdk来构建:【更简单】

FROM openjdk:8u181-jdk
LABEL maintainer="xxx@126.com"
COPY * /usr/local/packages
# 暴露端口
EXPOSE 8080
# 执行脚本
ENTRYPOINT ["java","-jar","/usr/local/packages/demo.jar"]

docker-compose.yml文件:

version: '3'
services:
 demo:
   build:
     context: .
     dockerfile: Dockerfile
   image: 'lij/centos:java8u181-centos7'
   restart: always
   container_name: 'demo'
   hostname: 'demo'
   ports:
     - '9099:8080'
   networks:
     - 'exist-net-bloom'
   volumes:
     # - '/data/logs:/data/logs' # 用来映射微服务日志
     - '/etc/timezone:/etc/timezone:ro'
     - '/etc/localtime:/etc/localtime:ro'
networks:
 exist-net-bloom:
   external:
     name: devops

增加git parameter构建

通过指定git的分支、标签等进行构建,该方式为jenkins的一个插件,通过插件管理安装git-parameter即可,也可手动离线安装:

源码地址:https://github.com/jenkinsci/git-parameter-plugin,可自行构建后离线安装,直接将jpi文件放入Jenkins的home目录的plugins文件夹下

官方插件地址:http://mirror.xmission.com/jenkins/plugins/git-parameter,可直接下载hpi文件离线安装

配置方式:
General -> “参数化构建过程” -> “Git参数”

在这里插入图片描述
配置完后保存,在job面板会多出一个"Build With Parameters",点击进入即可选择对应的标签或分支。
在这里插入图片描述

遇到的第一个坑:我是通过jenkins的插件管理,自动安装的最新版git-parameter插件,为0.9.18,而这个版本配置完“参数化构建”后出现无法拉取tag和branch的现象。
在这里插入图片描述
解决方法:以上问题并未发现明显的报错日志,因为毕竟最新版插件可能存在兼容问题,于是逐个更换旧版本插件,知道更换到0.9.15版本才正常。

插件下载地址:http://mirror.xmission.com/jenkins/plugins/git-parameter/0.9.15/git-parameter.hpi

离线安装:将插件下载后采用上传离线安装即可,“系统管理”->“插件管理”->“高级”->“Deploy Plugin”
在这里插入图片描述
在这里插入图片描述
安装完成后记得重启,在进入就没问题了。

第二个坑:按照上边配置完后,选择合适的参数构建,但发现拉取的git代码并不是指定的分支,而是仍然为默认分支的代码?

我们需要在jenkins拉取代码构建之前先"手动切换"到选中的分支或标签。
在这里插入图片描述
配置完后再进行构建,结果是成功的,并且通过log日志可以看出,在Maven构建之前执行了切换分支的操作。
在这里插入图片描述

问题:从日志中看出,其实拉取的还是master分支,只是后来切换到我们选择的$branch分支,所以其实我们应该直接在git拉取时直接使用$branch,而无需通过ssh切换到$branch分支。以上配置的问题在于,如果master无更新,则不会拉取内容,则即便选择的$branch分支有更新,也不会拉到本地。
在这里插入图片描述

配置完删除执行git checkout $branch的脚本节点即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/95069.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【ML笔记】5、支持向量机(SVM)

支持向量机&#xff08;SVM&#xff09;是一个强大的和通用的ML模型&#xff0c;能够执行分类&#xff0c;回归&#xff0c;甚至异常值检测&#xff0c;特别适合于复杂的中小型数据集。 1、线性SVM分类 我们可以看到&#xff0c;这两个类可以很容易地用一条直线(线性可分)分开…

GAN入门知识

GAN入门知识 结构 正式说 GAN 之前我们先说一下判别式模型和生成式模型。 判别器 判别式模型 判别式模型&#xff0c;即 Discriminative Model&#xff0c;又被称为条件概率模型&#xff0c;它估计的是条件概率分布(conditional distribution)&#xff0c; p(class|context) 。…

图书网上商店

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 1

docker-compose安装部署kafka

文章目录前言一、环境信息二、准备部署1.准备路径2.安装docker-compse&#xff0c;下载镜像3.生成yml文件2.执行部署三、登陆页面前言 记录一下使用docker-compose部署kafka平台的过程 参考&#xff1a;https://blog.csdn.net/QQ83512272/article/details/126368978 一、环境信…

Socket Websocket 客户端和服务端实现

最近在写一个上位机&#xff0c;用到了Websocket&#xff0c;这里就整理一下&#xff0c;顺便把Socket的东西也整理的了&#xff0c;方便以后查阅。 Socket Websocket 客户端和服务端实现Socket客户端和服务端实现Socket客户端Socket服务端实现效果Websocket 客户端和服务端实现…

QT Linux环境搭建——VM虚拟机和Ubuntu的安装

1、从ubuntu官网上下载iso镜像文件&#xff0c;该镜像文件用于安装linux操作系统&#xff0c;以下微官网链接 Enterprise Open Source and Linux | Ubuntu 选择一个最新的稳定版本下载即可&#xff08;好处是&#xff0c;不需要像一些别的网站&#xff0c;必须要注册&#xff…

基于java+springmvc+mybatis+vue+mysql的远程家庭健康监测管理系统小程序

项目介绍 本系统采用java语言开发&#xff0c;后端采用ssm框架&#xff0c;前端采用vue技术&#xff0c;数据库采用mysql进行数据存储。 前台&#xff1a; 登录注册、查看个人信息、留言反馈、查看健康信息、查看百科、社区交流 后台&#xff1a; 首页、个人中心、用户管理、…

陈天老师的Rust培训(2)学习笔记

所有权&#xff1a; Rust中的每一个值都有一个被称为其 所有者&#xff08;owner&#xff09;的变量值在任一时刻有且只有一个所有者。当所有者(变量)离开作用域的时候&#xff0c;这个值将被丢弃。 Copy的类型&#xff1a; 所有整数类型&#xff0c;比如u32。布尔类型所有浮…

本地springboot jar 部署到云服务器linux [安装jdk 安装msyql]

A). 安装jdk 参考博客CentOS 8 安装 JAVA 三种方式(yum / rpm / tar.gz) [rootiZt4ned91xzjstx1s6ftjvZ local]# rpm -qa |grep java [rootiZt4ned91xzjstx1s6ftjvZ local]# rpm -qa |grep jdk [rootiZt4ned91xzjstx1s6ftjvZ local]# rpm -qa |grep jre [rootiZt4ned91xzjstx…

bug:解决java.security.InvalidKeyException: Illegal key size or default parameters

bug:解决java.security.InvalidKeyException: Illegal key size or default parameters 1 复现 今天对接外链需要使用AES加密的时候&#xff0c;对方使用的是AES&#xff1a;AES/ECB/PKCS7Padding&#xff0c;但是在加密过程中&#xff0c;发现报错 报错信息&#xff1a;java.…

Spark Shell 的使用

Spark Shell 的使用 Spark shell 作为一个强大的交互式数据分析工具&#xff0c;提供了一个简单的方式学习 API。它可以使用 Scala&#xff08;在Java 虚拟机上运行现有的Java库的一个很好方式&#xff09;或 Python。 Spark Shell 命令 启动 Spark Shell 的时候我们可以指定…

JavaIO

CPU指令与内核态、用户态 在操作系统中&#xff0c;CPU负责执行指令,这些指令有些来自应用程序&#xff0c;有些是来自底层系统。 有些指令是非常危险的&#xff0c;如清除内存&#xff0c;网络连接等等&#xff0c;如果错误调用的话有可能导致系统崩溃。 因而CPU将指令分为特…

Excel表格的打开密码如何设置和取消?

给Excel表格设置“打开密码”是保护表格的其中一种方法&#xff0c;这样只有输入正确的密码才能打开表格。 那Excel表格的打开密码如何设置和取消呢&#xff1f; 首先&#xff0c;打开Excel表格&#xff0c;点击菜单栏的【文件】选项&#xff0c;然后依次选择【信息】-【保护…

java项目-第175期ssm高校校园点餐系统-java毕业设计

java项目-第175期ssm高校校园点餐系统-java毕业设计 【源码请到下载专栏下载】 今天分享的项目是《ssm高校校园点餐系统》 该项目分为2个角色&#xff0c;管理员、用户和食堂。 用户可以浏览前台,查看菜品&#xff0c;并进行预约和选座&#xff1b; 同时可以跳转到后台查看自己…

基于jsp+mysql+ssm矿场仓储管理系统-计算机毕业设计

项目介绍 本系统采用了BS架构&#xff0c;利用web技术实现了矿场信息的后台管理&#xff0c;针对矿物质的相关信息&#xff0c;销售情况进行管理。是一款后台信息管理系统&#xff0c;具有管理员和员工两个用户权限&#xff0c;系统设计简单&#xff0c;主要是学习资源&#x…

[R语言]正态分布

目录 分布 连续型变量的分布 正态分布 正态分布的推导 正态分布密度曲线 dnorm 正态分布的概率计算 正态分布累积曲线 总体分位数和尾概率 正态分布案例之一 R语言正态分布函数 正态分布相应的概率计算 正态分布的检验 shapiro.test()函数 Kolmogorov-Smirnov连续…

5.3 10篇美食类小红书爆文拆解【玩赚小红书】

案例一&#xff1a;金牌保姆分享12个万能做饭小技巧 ​ 标题&#xff1a; 万能做饭小技巧这个词可以看的出这个方法都是偏向技巧类&#xff0c;对于人人都有做饭的需求来说&#xff0c;也忍不住让人想看看到底是什么内容。“金牌保姆”四个字可谓是将“万能”这2个字完美诠释&…

首次曝光,Alibaba大佬手撸堪称神级的SpringSecurity全彩手册

有人调侃我们说&#xff1a; 程序员不如送外卖。送外卖是搬运食物&#xff0c;自己是搬运代码&#xff0c;都不产出新的东西……透支体力&#xff0c;又消耗健康&#xff0c;可替代性极强&#xff0c;30岁之后就要面临被优化的危险……想跳槽&#xff0c;但是更高的平台难进&a…

2023年你应该了解的五大采购管理趋势

采购的未来看起来非常具有前景。随着新技术的出现&#xff0c;采购专业人员有许多新的机会来简化他们的工作并节省企业的资金。 以下是一些你应该了解的2023年采购领域趋势。 1、自动化 采购的最大趋势之一是各种任务的自动化。这可以是任何事情&#xff0c;从自动化询价&am…

STC15 - C51 - 操作寄存器时, 不要操作不相关的位

文章目录STC15 - C51 - 操作寄存器时, 不要操作不相关的位概述笔记生成.i文件的选项编译工程后, 查看.list文件和.i文件.c文件相关内容.list文件.i文件通过.i文件(预处理文件), 就可以看到最终实现代码有啥区别了不好使的代码好使的代码总结ENDSTC15 - C51 - 操作寄存器时, 不要…