docker+jenkins+maven+git构建聚合项目,实现自动化部署,走了800个坑

流程

主要的逻辑就是Docker上安装jenkins,然后拉取git上的代码,把git上的代码用Maven打包成jar包,然后在docker运行
这个流程上的难点

  • 一个是聚合项目有可能Maven install的时候失败。
    解决办法:在基础模块的pom文件上添加
<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>

        </plugins>
    </build>```

* 一个是jenkins是在docker上运行的,那么如何git上的代码用Maven打包成jar包,然后在docker运行是个问题
解决办法:用远程shell脚本,直接在宿主机上执行命令,相当于jenkins去git拉代码打包成jar之后,然后把手动jar包变成容器运行的步骤写成脚本让jenkins去执行
#### Docker安装jenkins
* 下载Jenkins的Docker镜像:
 `docker pull jenkins/jenkins:lts`
* 在Docker容器中运行Jenkins:

```bash
`docker run -p 8080:8080 -p 50000:5000 --name jenkins \ -u root \
-v /mydata/jenkins_home:/var/jenkins_home \
-d jenkins/jenkins:lts`

注意-v之后的“/mydata/jenkins_home”这个很关键,jenkins拉取下来的代码和install之后的代码都会在这个目录下,docker执行的时候也需要在这个目录下。

  • 运行成功后访问该地址登录Jenkins,第一次登录需要输入管理员密码:http://192.168.6.132:8080/
    在这里插入图片描述
    使用管理员密码进行登录,可以使用以下命令从容器启动日志中获取管理密码:
docker logs jenkins

1
从日志中获取管理员密码:
在这里插入图片描述

选择安装插件方式,这里我们直接安装推荐的插件:
在这里插入图片描述

进入插件安装界面,联网等待插件安装:
在这里插入图片描述

安装完成后,创建管理员账号:

在这里插入图片描述

jenkins安装maven

  • 有一个简单安装的方法,但是对于网络要求很高
    通过系统管理->全局工具配置来进行全局工具的配置
    在这里插入图片描述
    但是这种方式对网络要求比较高,可能下载不下来。可以看下面的方案
  • 利用挂载容器来安装maven
    注意并不能在docker的jenkins容器里安装maven,这样在重启之后maven就没有了,可以在jenkins的宿主机里安装maven,把maven安装到上面启动jenkins是的/mydata/jenkins_home路径下面,然后在jenkins里配置。
    在系统管理->全局工具配置里,配置MAVEN_HOME,主要这个路径是jenkins容器里的路径,而不是/mydata/jenkins_home路径。
    在这里插入图片描述
    在系统配置->系统配置里
    在这里插入图片描述

jenkins连接远程ssh

因为需要执行docker命令,docker又不是在jenkins容器里,所以需要远程shell命令来执行,这块要注意,网上说的ssh plugs插件现在不能安装了,需要另外的办法。

  • Jenkins安装Publish over SSH插件
  • 配置服务器相关信息
  • 要先在jenkins所在的机器上生成秘钥。生成方式为:
ssh-keygen -t rsa         #产生公钥与私钥对

因为没加密码所以一路enter完成。此时在 用户名文件夹/root/.ssh/文件夹下生成两个文件:
is_rsa 为密钥文件
id_rsa.pub 为公钥文件
查看秘钥

vim /root/.ssh/is_rsa
  • 打开 系统管理——>系统设置,下拉到底部的Publish over SSH区域。
    在这里插入图片描述
    Passphrase:根据网上的资料说这里是生成秘钥时的密码,如果生成秘钥没有加密码,直接enter到底生成的,则这里不用填写。(保存后会有些·········表示空密码)。

Path to key:网上说这里填的是私钥的路径,没尝试,因为在下面填写了私钥key。

Key:私钥的值。要将文件里的内容都带着。

点击SSH Servers的“增加”,新添目标服务器。

Name:你起的可以分辨服务器的名称。

Hostname:目标服务器的ip,一般服务器之间交互的话用内网ip就行。

Username:登录目标服务器的账号。

Remote Directory:将jenkins构建的文件发送到目标服务器的哪个文件夹下。
在这里插入图片描述

jenkins自动化流程部署

  • 首先我们需要新建一个任务:
  • 设置任务名称后选择构建一个maven风格的软件项目:
  • 然后在源码管理中添加我们的git仓库地址:
  • 此时需要添加一个凭据,也就是我们git仓库的账号密码:
  • 填写完成后选择该凭据,就可以正常连接git仓库了;
    在这里插入图片描述
  • 之后我们需要添加一个构建,选择调用顶层maven目标,该构建主要用于把我们的源码打包成jar包
    在这里插入图片描述
  • 之后添加一个执行远程shell脚本的构建,用于在我们的jar打包完成后执行启动Docker容器的脚本:
    在这里插入图片描述
    脚本如下,都有注解只要有点docker基础的都能看懂,也可以先在服务器上执行一下试试
#!/bin/bash
# 等待三秒
echo sleep 3s
sleep 1
echo sleep 2s
sleep 1
echo sleep 1s
sleep 1
      
echo "结束进程完成"

cd /mydata/jenkins_home/workspace/ceres/ceres-api/target

cp /mydata/jenkins_home/workspace/ceres/Dockerfile /mydata/jenkins_home/workspace/ceres/ceres-api/target/
# 修改文件权限
chmod 755 $JAR_NAME

echo "看看docker能不能用"
docker -v

echo "停止容器"
# 停止容器
docker stop ceres

echo "删除容器"
# 删除容器
docker rm ceres
echo "删除镜像"
# 删除镜像
docker rmi ceres
echo "打包镜像"
# 打包镜像
docker build -t ceres .
echo "运行镜像"
# 运行镜像
docker run -d -p 9000:9000 --name ceres ceres

如果执行有问题可以把这个打开,看看是哪出错了
在这里插入图片描述

  • 之后点击保存操作,我们的任务就创建完成了,在任务列表中我们可以点击运行来执行该任务;

在这里插入图片描述

  • 我们可以通过控制台输出来查看整个任务的执行过程:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重谈“协议” + 序列化和反序列化

目录 1、重谈 "协议" 协议的概念 结构化数据的传输 序列化和反序列化 2、网络版计算器 2.1、服务端serverTcp.cc文件 服务端serverTcp.cc总代码 2.2、客户端clientTcp.cc文件 客户端clientTcp.cc总代码 2.3、协议定制Protocol.hpp文件 服务端需要的协议 客户端需要…

惠普官网驱动程序与软件下载,如何安装打印机驱动

惠普&#xff08;HP&#xff09;是一家全球知名的计算机硬件制造商&#xff0c;其产品涵盖台式电脑、笔记本电脑、打印机、扫描仪等。为了保证产品的正常运行和最佳性能&#xff0c;惠普为其设备提供了驱动程序和软件的下载服务。本文将介绍如何在惠普官网下载所需的驱动程序和…

【Linux】 基础IO——文件(中)

文章目录1. 文件描述符为什么从3开始使用&#xff1f;2. 文件描述符本质理解3. 如何理解Linux下的一切皆文件&#xff1f;4. FILE是什么&#xff0c;谁提供&#xff1f;和内核的struct有关系么&#xff1f;证明struct FILE结构体中存在文件描述符fd5. 重定向的本质输出重定向输…

Linux基础

环境搭建&#xff1a;linux安装、远程连接常用命令&#xff1a;文件、目录、拷贝、移动、打包、压缩、文本编辑安装软件&#xff1a;文件上传、jdk、tomcat、mysql项目部署&#xff1a;Java应用、Python应用、日志查看、系统管理、用户权限Linux是一套免费使用、自由传播的操作…

ngx之日志切割

正确记日志方式是每天都进行切割重新写&#xff0c;保留固定的时间后可使用 find 删除。 用系统自带有的 logrotate /etc/logrotate.d 下面再建立一个文件&#xff0c;这里是nginx &#xff08; 中途有 ctrlZ 暂停过任务&#xff0c;后面fg恢复的 &#xff09; /usr/local/ng…

不同类型的电机的工作原理和控制方法汇总

电机控制是指对电机的启动、调速&#xff08;加速、减速&#xff09;、运转方向和停止进行的控制&#xff0c;不同类型的电机有着不同的工作原理和控制方法。 一、无刷电机 无刷电机是由电机主体和电机驱动板组成的一种没有电刷和换向器的机电一体化产品。在无刷电机中&#xf…

【leetcode】链表(2)

目录 1. 环形链表 解题思路 2. 环形链表 II 解题思路 3. 删除排序链表中的重复元素 解题思路 4. 删除排序链表中的重复元素 II 解题思路 5. 移除链表元素 解题思路 6. 链表的中间结点 解题思路 1. 环形链表 OJ&#xff1a;环形链表 给你一个链表的头节点 head &am…

第二章 作业(6789B)【编译原理】

第二章 作业【编译原理】前言推荐第二章 作业678911最后前言 以下内容源自《编译原理》 仅供学习交流使用 推荐 无 第二章 作业 6 6.令文法G6为 N→D|ND D→0|1|2|3|4|5|6|7|8|9 (1)G6的语言L(G6)是什么? (2)给出句子0127、34和568的最左推导和最右推导。 &#xff08;…

【开发】后端框架——SpringBoot

title: SpringBoot top: 56 categories: 开发后端框架 tags:开发后端框架SpringBoot abbrlink: 1864766114 date: 2022-03-15 21:49:17 前置知识&#xff1a; Spring Mybatis SpringMVC 学习视频&#xff1a;https://www.bilibili.com/video/BV1PE411i7CV?spm_id_from333.337…

【Linux】进程控制

进程创建fork/vfork1.1.fork函数初识在linux中fork函数时非常重要的函数&#xff0c;它从已存在进程中创建一个新进程。新进程为子进程&#xff0c;而原进程为父进程。#include <unistd.h> pid_t fork(void); //返回值&#xff1a;自进程中返回0&#xff0c;父进程返回子…

前端实现一个名言生成器

The sand accumulates to form a pagoda✨ 写在前面✨ JS是什么&#xff1f;✨ 名言生成器✨ 页面搭建✨ 功能实现✨ 写在前面 在上周我们通过HTML、CSS实现了一个简单的‘我的相册‘页面的搭建&#xff0c;很多伙伴呢跟我说难道前端就只能做一些页面搭建的工作吗&#xff1f;…

Linux系统编程 - 基础IO(IO操作)

目录 预备知识 复习C文件IO相关操作 printf相关函数 fprintf snprintf 读取文件 系统文件IO操作 open函数 umask()函数 open函数返回值 预备知识 1.你真的理解文件原理和操作了吗&#xff1f;不是语言问题&#xff0c;是系统问题2.是不是只有C/C有文件操作呢&#x…

【Java开发】设计模式 08:组合模式

1 组合模式介绍组合模式是一种结构型设计模式&#xff0c;它允许将对象组合成树形结构&#xff0c;以表示部分-整体的层次结构。组合模式使得客户端可以统一处理单个对象和组合对象&#xff0c;从而简化了客户端代码。在组合模式中&#xff0c;有两种类型的对象&#xff1a;叶子…

【C语言初阶】函数

文章目录&#x1f490;专栏导读&#x1f490;文章导读&#x1f337;函数是什么&#xff1f;&#x1f337;函数的分类&#x1f33a;库函数&#x1f33a;自定义函数&#x1f337;函数的参数&#x1f337;函数的调用&#x1f337;函数的嵌套调用和链式访问&#x1f33a;嵌套调用&a…

小游戏也要讲信用

当下&#xff0c;小游戏鱼龙混杂&#xff0c;官方为能更好地保护用户、开发者以及平台的权益&#xff0c;近日宣布7月1日起试行小游戏主体信用分机制。 主体信用分是什么呢&#xff1f;简单来说&#xff0c;这是针对小游戏主体下所有小游戏帐号行为&#xff0c;对开发者进行评…

深度学习中的学习率设置技巧与实现详解

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

(五)Tomcat源码阅读:Engine组件分析

一、概述 在阅读源码之前我们需要对各个类的关系有一个清晰的了解&#xff0c;下面就是Engine各个类之间的关系&#xff0c;我们将会按照从上到下的顺序阅读源码。 二、阅读源码 1、Container &#xff08;1&#xff09;注释 Container可以处理请求并给予相应&#xff0c;并…

JavaScript-扫盲

文章目录1. 前言2. 第一个 JavaScript 程序3. javaScript 的基础语法3.1 变量3.2 数据类型3.3 运算符3.4 条件语句3.5 数组3.6 函数3.7 作用域3.8 对象4. WebAPI4.1 DOM 基本概念4.2 常用 DOM API4.3 事件4.4 操作元素4.5 网页版猜数字游戏4.6 留言版1. 前言 提问 java 和 java…

集合之CurrentHashMap 1.7总结

文章目录底层实现构造方法默认的三个参数什么是Unsafe类&#xff1f;它有什么作用&#xff1f;为什么CurrentHashMap 调用Unsafe方法不会报错&#xff1f;我们自己创建的对象调用会报错&#xff1f;CurrentHashMap的key&#xff0c;value可以为null吗&#xff1f;CurrentHashMa…

水风险指数定义及计算:水资源压力等

水风险指数&#xff08;Water risk indicators&#xff09; 水风险指数&#xff08;Water risk indicators&#xff09;是用来评估水资源可持续性和水相关风险的一种工具&#xff0c;可以通过多种指标来衡量。 1.1 水资源压力&#xff08;water stress, WS&#xff09; 定义…