Docker+Jenkins+Git+GitLab实现DevOps

先了解一下Jenkins

Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,提供了数百个插件来支持构建,部署和自动化任何项目。我们可以使用Jenkins结合常用的版本控制工具(git、svn等)来实现自动部署项目,比如说我们从本地上传代码到Gitlab代码仓库,Jenkins就会帮我们自动同步代码,然后经编译打包之后推送至远程Docker仓库,再之后我们通过服务器从远程Docker仓库拉取镜像、创建及启动容器,然后就可以通过浏览器访问了,整个过程几乎都是自动完成的,而我们只需要上传代码就可以了,接下来我们一起来看看整个搭建过程吧。

本文环境

Docker Version 19.03.11:https://www.cnblogs.com/niceyoo/p/13096181.html

Maven Version 3.3.9:https://www.cnblogs.com/niceyoo/p/13068935.html

JDK Version 1.8.0_181:https://www.cnblogs.com/niceyoo/p/11483139.html

GitLab:https://www.cnblogs.com/niceyoo/p/13057533.html

Jenkins Version 2.222.4:参考本文

通过本文可以了解哪些

  • 通过Docker部署Jenkins
  • 使用Jenkins一键部署Springboot项目
  • 整合GitLab实现上传代码自动部署项目

如下Jenkins安装及配置过程

1、拉取代码

docker pull jenkins/jenkins:lts

2、创建并启动容器:

在构建的过程,由于我本身CentOS已经安装JDK、Maven了「可以参考上方的安装链接」,所以在这我就直接指定本地环境变量了,当然,如果你不指定的话,安装完Jenkins后还是可以在全局工具配置中修改的:

docker run --name=jenkins --privileged=true \
-u root \
--rm \
-d \
-p 8080:8080 \
-p 50000:50000 \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v $(which docker):/usr/bin/docker \
-v /etc/sysconfig/docker:/etc/sysconfig/docker \
-v /usr/java/jdk1.8.0_181:/usr/java/jdk1.8.0_181 \
-v /home/maven/apache-maven-3.3.9:/usr/local/maven \
-v /home/maven/repo:/usr/local/maven_repository \
-v /home/jenkins-data:/var/jenkins_home \
jenkins/jenkins:lts


启动后在浏览器输入:http://容器ip:8080 访问。

管理员密码需要我们在log中查询:

docker logs jenkins

3、安装推荐的插件

输入密码登陆后,会弹出插件安装提示,我们在这选择安装推荐的插件

接下来就进入漫长的等待状态~

4、创建管理员账号

安装之后,接下来创建一个账号:

进行实例地址配置,该地址将作为将来Jenkins的访问地址:

至此,保存并完成,会重启Jenkins,然后我们可以通过刚刚创建的账户登录「使用管理员root也可以」:

5、Maven配置修改

之前我们创建容器时复用了本地宿主机的Maven环境变量,但是安装完Jenkins后还是要指定一下Maven目录的,依次进入:系统管理 > 全局工具配置

首先是顶部的Maven,我们选择文件系统中的setting文件,文件路径使用创建容器时指定的Maven路径 usr/local/maven

/usr/local/maven/conf/settings.xml


然后拉到最下边Maven节点,点击新增Maven,起一个名字,然后指定maven路径,去掉自动安装的选项,然后应用>保存

6、新建一个任务

然后我们新建一个任务,选择构建一个自由风格的软件项目

点击确定之后会跳入配置界面,接下来就是配置我们的自动化操作,首先是配置项目的拉取地址,在这我是基于Gitlab的,关于Gitlab的搭建可以参考这篇:https://www.cnblogs.com/niceyoo/p/13057533.html

点击添加GitLab的账户密码,不添加时会报红,是没法在GitLab中拉取代码的:

接着我们选择一下构建指令执行shell

#!/bin/bash 
result=$(docker ps | grep "10.211.55.4:5000/niceyoo-demo") 
if [[ "$result" != "" ]] 
then 
echo "stop niceyoo-demo" 
docker stop niceyoo-demo 
fi
result1=$(docker ps -a | grep "10.211.55.4:5000/niceyoo-demo") 
if [[ "$result1" != "" ]] 
then 
echo "rm niceyoo-demo" 
docker rm niceyoo-demo
fi
result2=$(docker images | grep "10.211.55.4:5000/niceyoo-demo") 
if [[ "$result2" != "" ]] 
then 
echo "10.211.55.4:5000/niceyoo-demo:latest" 
docker rmi 10.211.55.4:5000/niceyoo-demo:latest
fi

这个地方解释一下为啥要用到shel脚本,这个脚本有两个操作,首先是通过 docker ps | grep "10.211.55.4:5000/niceyoo-demo"查询是否存在容器,如果存在的话则stop停止容器,然后再rm删除容器,第二步是通过 docker ps -a | grep "10.211.55.4:5000/niceyoo-demo"查看是否存在该镜像,如果存在则 rmi 删除该镜像,为啥要删除镜像+容器?其实这样是帮助我们把每次自动化构建镜像、容器之前都把旧的给删除掉。

“10.211.55.4:5000/niceyoo-demo” 是我项目打包后的镜像名称,组成规则为:镜像地址/项目名称

然后添加Maven指令,用于构建项目,简单说一下这个地方,我在项目的 pom.xml,文件中使用了 docker-maven-plugin 插件,同时替换了 mvn pavkage 指令,当每次执行该命令时就会自动提交至Docker远程私有仓库中,私有仓库是基于Docker+Registry搭建的,关于Registry的搭建可以参考这篇:https://www.cnblogs.com/niceyoo/p/13058238.html

clean package

如下是SpringBoot项目 pom.xml 文件中的插件编写,已经把注释写的很清楚了:

<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.0.0</version><configuration><!--镜像名称--><imageName>10.211.55.4:5000/${project.artifactId}</imageName><!--指定dockerfile路径--><!--<dockerDirectory>${project.basedir}/src/main/resources</dockerDirectory>--><!--指定标签--><imageTags><imageTag>latest</imageTag></imageTags><!--远程仓库地址--><registryUrl>10.211.55.4:5000</registryUrl><pushImage>true</pushImage><!--基础镜像jdk1.8--><baseImage>java</baseImage><!--制作者提供本人信息--><maintainer>niceyoo apkdream@163.com</maintainer><!--切换到ROOT目录--><workdir>/ROOT</workdir><cmd>["java","-version"]</cmd><entryPoint>["java","-jar","${project.build.finalName}.jar"]</entryPoint><!--指定远程docker地址--><dockerHost>http://10.211.55.4:2375</dockerHost><!--这里是复制jar包到docker容器指定目录配置--><resources><resource><targetPath>/ROOT</targetPath><!--指定需要复制的根目录,${project.build.directory}表示target目录--><directory>${project.build.directory}</directory><!--用于指定需要复制的文件,${project.build.finalName}.jar表示打包后的jar包文件--><include>${project.build.finalName}.jar</include></resource></resources></configuration><!--执行mvn package时,替换为执行mvn package docker:build--><executions><execution><id>build-image</id><phase>package</phase><goals><goal>build</goal></goals></execution></executions></plugin></plugins>
</build>

接下来再添加一个执行shell,用来执行构建容器:

docker run --rm  -d -p 9999:9999 --name niceyoo-demo  10.211.55.4:5000/niceyoo-demo

部分参数解释:在这我用的 -p 9999 端口,--nama 后面指向的是重命名后的容器名称 niceyoo-demo + 镜像的名称 10.211.55.4:5000/niceyoo-demo,接下来就是应用+保存了:

到这,我们就可以运行一下了,点击立即构建,然后通过点击 Build History 中的 控制台输出

等待一会,最后看到下图所示,BUILD SUCCESS 就可以了

然后我们在Registry私有镜像仓库看一下是否推送:

再看看最后一步的shell脚本帮我们创建并启动容器了没~

到这我们就可以在浏览器访问项目了:

7、创建Gitlab钩子

我们要实现的最终效果是一上传代码就帮我们自动执行如上整个过程~,那么我们需要配合Gitlab的钩子实现,首先我们先去系统管理 > 插件管理 安装 GitLab 插件。

安装后我们进入项目配置界面,切换至构建触发器

我们复制这个链接,然后进入GitLab项目中的 setting > Webhooks 「注意,这里是项目中的,非GitLab的setting配置」:

点击Add webhook时,如果出现 Url is blocked: Requests to the local network are not allowed

解决方法: 进入GitLab首页顶部的小扳手 setting > Network 目录,执行如下4步,不要忘记最后点击 save changes

然后我们再回到之前界面重新添加一下链接,点击Add webhook配置之后测试一下:

如果上方提示200代表配置成功:

然后我们回到Jenkins项目面板就可以看到自动构建了:

到这基本就完成自动化创建了,只要上传代码就能完成构建了,比如我们通过Idea上传代码至GitLab,那么Jenkins就会帮我们实现自动化部署了:

上传完代码后Jenkins自动构建的截图:

可能会出现的问题 - 仅针对本文

1、/usr/bin/docker: 2: .: Can’t open /etc/sysconfig/docker

/usr/bin/docker: 2: .: Can't open /etc/sysconfig/docker

出现这个问题说明创建的Jenkins是无法使用宿主机里的docker命令的,我们可以进入jenkins容器执行docker version,正常情况是可以打印信息的,而不正常则如上方错误提示。

这个问题可以通过挂载 -v /etc/sysconfig/docker:/etc/sysconfig/docker 完成,再回到第2步看看是不是漏掉了。

2、You don’t have either docker-client

You don't have either docker-client or docker-client-latest installed. Please install either one and retry.

这个问题我曾尝试使用 yum 安装最新的 docker-client,最后放弃了,然后就在纠结为何别人没出现这个问题,后来几经测试,果断卸载重装!

猜测之前使用 yum 默认安装的 docker 实在是太老了, 默认安装的是1.13.x版本,而现在最新版本都 19.x 了…

卸载重装最新版是不会把之前下载的镜像删掉的,前提是不要完全删除干净哈,我测试过了,咳咳…

yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-enginerm -rf /etc/systemd/system/docker.service.drm -rf /var/lib/dockerrm -rf /var/run/docker  

安装最新Docker可以参考这篇:https://www.cnblogs.com/niceyoo/p/13096181.html

然后再重新拉取Jenkins,重新创建一下容器。

推荐阅读

CentOS中安装Docker步骤

基于Docker搭建私有镜像仓库

基于Docker搭建Gitlab代码存储

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

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

相关文章

毕业两年的大专生程序员工作总结(java后端)

文章目录前言这一年做了啥去年的学习清单今年的学习清单第三年的规划最后唠叨的话前言 如题&#xff0c;这是我毕业第二年的工作总结&#xff0c;对第一年工作总结感兴趣的请戳这《毕业一年的大专生程序员工作总结》&#xff0c;再简单介绍一下我以及这个系列的文章。 关于我…

Docker开启远程安全访问

一、编辑docker.service文件 vi /usr/lib/systemd/system/docker.service找到 [Service] 节点&#xff0c;修改 ExecStart 属性&#xff0c;增加 -H tcp://0.0.0.0:2375 ExecStart/usr/bin/dockerd -H fd:// --containerd/run/containerd/containerd.sock -H tcp://0.0.0.0:23…

Netty入门篇-从双向通信开始

百度百科描述 Netty是由JBOSS提供的一个java开源框架&#xff0c;现为 Github上的独立项目。Netty提供异步的、事件驱动的网络应用程序框架和工具&#xff0c;用以快速开发高性能、高可靠性的网络服务器和客户端程序。 也就是说&#xff0c;Netty 是一个基于NIO的客户、服务器…

asp.net 页面静态化

页面静态化,有三种方式 伪静态 真静态,折中法 现在我做的是折中发 创建一个asp.net 页面, 连接跳转到还未生成的页面 创建HttpHandle类 using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.IO;/// <summary>/// HttpHa…

Netty心跳机制-长连接

前文需求回顾 完成对红酒窖的室内温度采集及监控功能。由本地应用程序温度传感器定时采集室内温度上报至服务器&#xff0c;如果温度 >20 C 则由服务器下发重启空调指令&#xff0c;如果本地应用长时间不上传温度给服务器&#xff0c;则给户主手机发送一条预警短信。 Netty…

带你反编译APP然后重新打包「MacOS」

最近有小伙伴留言&#xff0c;怎么把一款APP改成自己的信息呀&#xff0c;咳咳&#xff0c;这又来送题材了&#xff0c;今天水一把APP反编译回编译&#xff0c;文中会针对一款APP进行简单的修改信息&#xff0c;问问题的小伙伴还不火速右上角支持一下。 MacOS跟Windows我会分开…

反编译一款APP然后重新打包(Windows环境)

最近有小伙伴私信我&#xff0c;怎么把一款APP改成自己的信息呀&#xff0c;咳咳&#xff0c;这又来送题材了&#xff0c;今天水一把APP反编译回编译&#xff0c;文中会针对一款APP进行简单的修改信息&#xff0c;问问题的小伙伴还不火速右上角支持一下。 MacOS跟Windows我是分…

Vmware下CentOs7 桥接模式下配置固定IP

1.安装完CentOS7后 修改虚拟机网络适配器配置&#xff1a;改成桥接模式 2.设置Vmware的 编辑->虚拟网络编辑器 3.重启CentOs7 , 查看网络 # ip addr interface是&#xff1a; ens33 4.查看本地真实机ip&#xff0c;然后配置虚拟机固定ip windows 进入命令行模式cmd&#xf…

MacOS svn:E230001 Can‘t use Subversion command line client: svn The path to the Subversion executabl

注意&#xff1a;本文仅针对于 MacOS 系统。 错误信息如下&#xff1a; Cant use Subversion command line client: svn The path to the Subversion executable is probably wrong. Fix it.好家伙&#xff0c;今天发现 IDEA 中的 SVN 突然不能用了… 因为之前的 SVN 是使用 …

创建线程都有哪些方式?— Callable篇

今天我们来看一道面试题引发的思考 问&#xff1a; 创建线程都有哪些方式&#xff1f; 答&#xff1a; 我了解的有四种创建方式&#xff1a; 继承Thread类创建线程类通过Runnable接口创建线程类通过Callable和Future创建线程通过线程池创建 相信大家回答这个问题没什么难度吧…

ASP.NET Core 网站发布到Linux服务器

长期以来&#xff0c;使用.NET开发的应用只能运行在Windows平台上面&#xff0c;而目前国内蓬勃发展的互联网公司由于成本的考虑&#xff0c;大量使用免费的Linux平台&#xff0c;这就使得.NET空有一身绝技但无法得到广大的施展空间&#xff0c;.NET平台被认为只适合开发企业内…

如何暂停一个正在运行的线程?

今天把小伙伴问懵了&#xff0c;小刚&#xff0c;你知道怎么停止一个线程吗&#xff1f; 这…&#xff0c;这…&#xff0c;stop&#xff1f; 原来平时小刚这小子只知道创建线程&#xff0c;不知道怎么暂停线程呀~[狗头] 停止线程是在多线程开发中很重要的技术点&#xff0c;…

Docker中搭建FastDFS文件系统(多图)

关于FastDFS FastDFS 是以 C 语言开发的一项开源轻量级分布式文件系统&#xff0c;他对文件进行管理&#xff0c;主要功能有&#xff1a;文件存储&#xff0c;文件同步&#xff0c;文件访问&#xff08;文件上传/下载&#xff09;等&#xff0c;特别适合以文件为载体的在线服务…

SpringBoot集成FastDFS依赖实现文件上传

前言 对FastDFS文件系统安装后的使用。 FastDFS的安装请参考这篇&#xff1a;https://www.cnblogs.com/niceyoo/p/13511082.html 本文环境&#xff1a;IDEA JDK1.8 Maven 1、引入依赖 简单说一下这个依赖部分&#xff0c;目前大部分都是采用的如下依赖&#xff1a; <…

SQL取最大值编码(自动编码)

SQL取最大值编码(自动编码) 用途 : 使用SQL语法做出自动编码效果&#xff0c;例如将单号自动1后&#xff0c;产生该笔单号 Table说明 SQL语法 SELECT AREPLICATE(0,7-len(convert(varchar,((MAX(right(ae002,7)))1))))(convert(varchar,((MAX(right(ae002,7)))1))) from ygmae …

微信小程序里如何使用npm?小程序集成友盟举例

1、执行npm初始化指令 小程序根目录&#xff0c;命令执行如下指令&#xff1a; npm init执行后会让加载项目初始信息&#xff0c;具体截图如下&#xff1a; 2、执行安装npm包指令 在这我们举个例子&#xff0c;以接入友盟统计SDK为例&#xff0c;执行命令如下&#xff1a;…

Spring MVC 5 + Thymeleaf 基于Java配置和注解配置

Spring MVC 5 Thymeleaf 注解配置 Spring的配置方式一般为两种&#xff1a;XML配置和注解配置 Spring从3.0开始以后&#xff0c;推荐使用注解配置&#xff0c;这两种配置的优缺点说的人很多&#xff0c;我就不说了&#xff0c;自行体会&#xff0c;下面就用注解配置实现一个Sp…

docker镜像无法删除 Error:No such image:xxxxxx

1、前言 docker镜像无法删除&#xff0c;通过 docker images 查看镜像明明存在就是删除不了。 删除提示&#xff1a;Error&#xff1a;No such image&#xff1a;xxxxxxx 具体截图内容如下&#xff1a; 2、解决方法 进入目录&#xff1a; cd /var/lib/docker/image/over…

python中集合set,字典dict和列表list的区别以及用法

python中set代表集合&#xff0c;list代表列表,dict代表字典 set和dict的区别在于&#xff0c;dict是存储key-value&#xff0c;每一个key都是唯一的&#xff0c;set相对于dict存储的是key&#xff0c;且key是唯一的,list除了变量外都可以存储 dict{"a":1,"b&qu…

第6课 仿Siri机器人-语音朗读和语音识别

一、功能设计输入文本&#xff0c;单击“朗读”按钮&#xff0c;由手机读出该文本&#xff08;如果没有输入文本&#xff0c;则弹出消息框警告“请输入文本&#xff09;&#xff1b;单击“识别”按钮&#xff0c;读入语音&#xff0c;从文本框中输出文字。&#xff08;另&#…