当前位置: 首页 > news >正文

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布

前言

一个项目完整的生命周期是从开发的coding阶段和coding阶段的质量测试,再到多次发布投入使用。目前大部分的测试阶段并不是从coding结束后开始的,而是和coding同步进行的。可能今天早上coding完成一个功能,下午就要投入测试。在这期间,我们可能会因为需求发生变化功能需要改进缺陷需要修复等问题要更新服务。这个过程是重复而且是复杂的,也容易出现部署、更新失误的情况。因此我们有了自动构建的需求,和CI/CD(持续构建/持续发布)差不多类似。

愿景

在这里插入图片描述
我们最后要实现的像图片中这样,可以选择要构建的分支要发布到哪一台服务器以及要更新的服务,之后点击构建,完成指定的服务构建以及发布到指定的服务器上。

Jenkins环境搭建

前提环境

  • Docker环境
  • 可以使用docker-compose,建议版本为:Docker Compose version v2.1.1,不然可能会出现docker-compose: not found的情况
  • 拉取 jenkinsci/blueocean:1.25.7-bcc31d32159f镜像
  • 拉取maven:3-alpine镜像

启动Jenkins

docker run \-e TZ=Asia/Shanghai \--network host \-d \-u root \--name jenkins \-v jenkins-data:/var/jenkins_home \-v /var/run/docker.sock:/var/run/docker.sock \-v "$HOME":/home \-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose \jenkinsci/blueocean:1.25.7-bcc31d32159f

-v jenkins-data:/var/jenkins_home: 将jenkins容器里面的/var/jenkins_home(jenkins配置信息)映射到Docker volume,并将其命名成jenkins-data
-v /var/run/docker.sock:/var/run/docker.sock: 允许jenkins使用docker环境
-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose: 允许jenkins使用docker-compose

解锁jenkins

第一次访问jenkins地址:http://ip:8080
在这里插入图片描述
密码在jenkins启动日志里
在这里插入图片描述

自定义Jenkins

在这里插入图片描述
选择安装推荐的插件
如果遇到安装部分插件失败,可以去找到系统管理——插件管理——已安装,先卸载掉失败的插件,再去可选插件中搜索并下载.
ps:卸载和下载完需要重启才能生效,但是博主经常遇到点重启,它只关闭不重启,可以手动启动。

创建第一个管理员用户

在这里插入图片描述

实例配置

在这里插入图片描述

插件下载

  • Git Parameter Plug-In,git参数化构建,构建时可以指定构建分支
  • Publish Over SSH插件,远程发布
  • Extended Choice Parameter Plugin,选择参数添加扩展功能
  • Docker,集成docker
  • Docker Pipeline,通过流水线构建和使用Docker容器
  • Docker Compose Buid Step Plugin,集成docker-compose

全局凭据配置

配置gitlab的账号密码
在这里插入图片描述

系统配置

点击系统管理——系统配置

Publish over SSH配置

在这里插入图片描述

SSH Servers新增在这里插入图片描述

创建任务

创建一个流水线任务

在这里插入图片描述

参数化构建

Git参数

在这里插入图片描述

服务器参数配置

在这里插入图片描述

服务名配置

在这里插入图片描述

流水线配置

代码仓库配置

在这里插入图片描述

关闭轻量级检出

在这里插入图片描述

示例项目内容

项目结构

在这里插入图片描述

docker-compose.dev.yml

version: "3.0"
services:holiday-management:build:context: holiday-managementargs:APP: target/holiday-management.jarplan-scheduler:build:context: plan-schedulerargs:APP: target/plan-scheduler.jar

docker-compose.yml

version: "3.0"
services:holiday-management:restart: alwaysimage: holiday/management:latestenv_file: ./config/.envports:- 10018:10010plan-scheduler:restart: alwaysimage: plan/scheduler:latestenv_file: ./config/.envports:- 10028:10020

Jenkinsfile

pipeline {agent anyenvironment {def remoteId = "${PUBLISH_SSH_SERVER}" def service_names = "${SERVICE_NAMES}".replace(",", " ")def half_finished_images = "${service_names}".replace("-", "/").replace(" ", ":latest ")def images = "${half_finished_images}" + ":latest"def deploy = "deploy"}stages {stage('项目构建') {agent {docker {image 'maven:3-alpine'args '-v /home/.m2:/root/.m2'}}steps {echo "打包项目"sh 'mvn clean install -DskipTests=true'echo "构建镜像"sh "docker-compose -f docker-compose.yml -f docker-compose.dev.yml build ${service_names}"}}stage('下载镜像') {agent anysteps {echo "下载镜像"sh "docker save ${images} -o images.tar"}}stage('发往远程'){steps {sshPublisher(publishers: [sshPublisherDesc(configName: """$remoteId""", transfers: [sshTransfer(cleanRemote: false, excludes: '',execCommand: """echo '准备解压发布文件并部署'cd /home/deploy/cpmc#解压到当前目录,并去除一级目录docker load < images.tardocker-compose up -d ${service_names}echo '镜像加载成功'""",execTimeout: 120000,flatten: false,makeEmptyDirs: false,noDefaultExcludes: false,patternSeparator: '[, ]+',remoteDirectory: "cpmc",remoteDirectorySDF: false,removePrefix: '',sourceFiles: "images.tar, config/.env, docker-compose.yml")],usePromotionTimestamp: false,useWorkspaceInPromotion: false,verbose: true)])}}}
}

构建发布

在配置好以上的内容之后,在Dashboard-cpmc-Build with Parameters构建、发布远程

在这里插入图片描述

查看发布日志

点击构建历史下的最新一次构建——Console Output
在这里插入图片描述
构建成功~
ps:如果构建失败可以根据错误提示去解决。博主写这篇博客的时候也是构建了10余次才最后构建成功。。
在这里插入图片描述

最后

到这里,整一套自动构建远程发布就实现啦~欢迎留言讨论!

相关文章:

Jenkins+Docker+Maven+gitlab实现自动构建、远程发布

前言 一个项目完整的生命周期是从开发的coding阶段和coding阶段的质量测试&#xff0c;再到多次发布投入使用。目前大部分的测试阶段并不是从coding结束后开始的&#xff0c;而是和coding同步进行的。可能今天早上coding完成一个功能&#xff0c;下午就要投入测试。在这期间&a…...

centos7克隆虚拟机完成后的的一些配置介绍

系列文章目录 centos7配置静态网络常见问题归纳_张小鱼༒的博客-CSDN博客 文章目录 目录 系列文章目录 前言 一、配置Hadoop要下载的压缩包 1、下载对应版本的Hadoop压缩包 2、我们如何查看自己电脑的端口号 3、下载jdk对应的版本 二、虚拟机centos7克隆虚拟机完成后的一些基本…...

C语言/动态内存管理函数

C程序运行时&#xff0c;内存将被划分为三个区域&#xff0c;而动态开辟的内存区间位于堆区。 文章目录 前言 一、内存划分 二、malloc函数 三、calloc函数 四、realloc函数 五、free函数 总结 前言 在使用C语言编写程序时&#xff0c;使用动态内存是不可避免的&#x…...

华为OD机试题,用 Java 解【任务调度】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不要…...

河南农业大学2023春蓝桥杯赛前训练第一场

A 滑板上楼梯 贪心 要求最少次数&#xff0c;尽量多跳三阶的&#xff0c;不能连续跳三阶&#xff0c;三阶后面一定要跟着一个一阶&#xff0c;相当于直接跳四阶 每次跳四阶都是两步&#xff08;3、1&#xff09;&#xff0c;如果 % 4 之后&#xff0c;正好剩下 3 &#xff0c…...

docker-dockerfile

1.常用保留字指令 FROM : 基础镜像MAINTAINER: 维护者姓名和邮箱RUN : Run ["可执行文件"&#xff0c;参数1]&#xff1b; Run [shell命令]EXPOSE: 暴露出的端口号WORKDIR: 登录后的位置USER: 执行用户,默认是rootENV: 构建过程的环境变量ADD: 将宿主机的文件拷贝到…...

【JavaEE】浅识进程

一、什么是进程1.1 操作系统学习进程之前首先要了解我们的操作系统&#xff08;OS&#xff09;&#xff0c;我们的操作系统实际上也是一款软件&#xff0c;属于系统软件的范畴&#xff0c;操作系统早期采用命令提示框与用户交互&#xff0c;我们启动某个软件&#xff0c;打开某…...

Java_Spring:1. Spring 概述

目录 1 spring 是什么 2 Spring 的发展历程 3 spring 的优势 4 spring 的体系结构 1 spring 是什么 Spring 是分层的 Java SE/EE 应用 full-stack 轻量级开源框架&#xff0c;以 IoC&#xff08;Inverse Of Control&#xff1a;反转控制&#xff09;和 AOP&#xff08;Aspec…...

使用Maven实现第一个Servlet程序

目录 前言&#xff1a; Maven 什么是Maven 创建Maven项目 Mevan目录介绍 Servlet程序 引入Servlet依赖 创建目录结构 编写代码 打包程序 部署程序 验证程序 idea集成Tomcat 下载Tomcat插件 配置Tomcat的路径 Smart Tomcat工作原理 小结&#xff1a; 前言&#…...

【MySQL】MySQL的优化(一)

目录 查看SQL执行频率 定位低效率执行SQL 定位低效率执行SQL-慢查询日志 定位低效率执行SQL-show processlist 查看SQL执行频率 MySQL 客户端连接成功后&#xff0c;通过 show [session|global] status 命令可以查看服务器状态信息。通 过查看状态信息可以查看对当…...

win kubernetes dashbord部署springboot服务

文章目录前言一、新建springboot工程二、制作镜像1.编写dockerfile2.使用阿里云镜像仓库3.使用dashbord部署服务总结前言 使用win版docker desktop安装的k8s&#xff0c;kubenetes dashbord。 一、新建springboot工程 就是简单一个接口。没什么说的 二、制作镜像 1.编写dock…...

Linux之进程终止

本节目录1.进程终止2.exit与_exit函数1.进程终止 进程终止时&#xff0c;操作系统做了什么&#xff1f; 释放进程中申请的相关内核数据结构和对应的数据和代码。本质就是释放系统资源。 进程终止的常见方式 a.代码跑完&#xff0c;结果正确 b.代码跑完&#xff0c;结果不正确…...

全网独家首发|极致版YOLOv7改进大提升(推荐)网络配置文件仅24层!更清晰更方便更快的改进YOLOv7网络模型

有不少小伙伴和我交流YOLO改进的时候&#xff0c;都说YOLOv7的网络配置文件长达104层&#xff0c;改起来很费力&#xff0c;数层数都要数很久&#xff0c;还很容易出错&#xff0c;而且基于YOLOv5代码架构&#xff0c;Debug起来也确实比较费时&#xff0c;所以博主对YOLOv7网络…...

C++入门 谁都能看懂的类和对象

类 C语言结构体中只能定义变量. 在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数。 //c语言 typedef struct ListNode {int val;struct ListNode* next; }LTN; //c struct ListNode {int val;//c中可以直接用这个&#xff0c;不用加structListNode* next…...

C++ STL:string类的模拟实现

目录 前置说明 一. 构造函数和析构函数的模拟实现 1.1 构造函数 1.2 析构函数 二. string类对象容量及成员相关的函数 2.1 获取字符串有效字符数、容量及_str成员变量获取相关函数 2.2 扩容及变长相关函数 2.3 字符串清空和判空函数 三. 运算符重载函数 3.1 赋值运算…...

并发编程---线程池(六)

阻塞队列的应⽤——线程池一 线程池基本概念二 线程池三种常⽤创建⽅式2.1.newFixedThreadPool线程池&#xff1a;2.2.newSingleThreadExecutor线程池&#xff1a;2.3.newCachedThreadPool线程池&#xff1a;2.4. 线程池代码演示三 线程池创建的七个参数四 线程池底层原理理解&…...

【Java实战】不会还有人用if else进行参数校验吧

当请求参数很多&#xff0c;几乎每一个参数都需要后端去兜底校验时&#xff0c;你还在写if else去判断参数是否为空吗&#xff1f;&#xff1f;要校验为空的参数三四个还好&#xff0c;要是十几个&#xff0c;业务逻辑还没开始就写二三十行代码开始堆山了嘛&#xff0c;教给大家…...

深度学习部署(十六): CUDA RunTime API _vector-add 使用cuda核函数实现向量加法

1. 知识点 nthreads的取值&#xff0c;不能大于block能取值的最大值。一般可以直接给512、256&#xff0c;性能就是比较不错的 (input_size block_size - 1) / block_size;是向上取整 对于一维数组时&#xff0c;采用只定义layout的x维度&#xff0c;若处理的是二维&#xff…...

堆结构的两个应用

堆排序 堆结构很大的一个用处&#xff0c;就是用于堆排序了&#xff0c;堆排序的时间复杂度是O(n∗log2n)O(n*log_2n)O(n∗log2​n)量级的&#xff0c;在众多排序算法中所处的地位也是高手级别的了。 但很多人在使用堆排序的时候&#xff0c;首先认为我必须得有一个堆数据结构…...

Java中的 static

1 static 静态变量 1.1 静态变量的使用 static变量也称作静态变量&#xff0c;也叫做类变量 静态变量被所有的对象所共享&#xff0c;在内存中只有一个副本 当且仅当在类初次加载时会被初始化 静态变量属于类 通过类名就可以直接调用静态变量 也可以通过对象名.静态变量…...

ctf show web 入门43

打开靶场代码逻辑如下&#xff1a; if(!preg_match(“/\ |/|cat/i”, $c)) 它过滤了三个关键内容&#xff1a; \ (空格)&#xff1a;你不能直接在命令中使用空格&#xff08;例如 ls -l 或 cat flag 都会失败&#xff09;。 / (正斜杠)&#xff1a;你不能使用路径符号&#xf…...

oh-my-prompt:模块化终端提示符引擎的设计、配置与性能优化

1. 项目概述&#xff1a;一个为现代终端量身定制的提示符引擎如果你和我一样&#xff0c;每天有超过一半的工作时间是在终端&#xff08;Terminal&#xff09;里度过的&#xff0c;那么一个高效、美观且信息丰富的命令行提示符&#xff08;Prompt&#xff09;绝对能让你事半功倍…...

从工程师漫画竞赛看技术社区运营与内容创作之道

1. 项目概述&#xff1a;一场载入史册的漫画标题竞赛在技术圈子里&#xff0c;工程师们除了埋头画电路、写代码&#xff0c;其实也藏着不少幽默细胞。2011年6月&#xff0c;一场由《EE Times》举办的漫画标题竞赛&#xff0c;就上演了堪称史上最胶着的对决。这场竞赛的核心&…...

告别esptool失败!用乐鑫官方Flash工具给ESP8266刷MicroPython固件(保姆级图文)

ESP8266刷机新选择&#xff1a;乐鑫官方Flash工具全流程指南 为什么选择官方工具替代esptool&#xff1f; 每次看到命令行里跳出的红色报错信息&#xff0c;是不是有种想把开发板扔出窗外的冲动&#xff1f;"端口不存在"、"擦除失败"、"权限不足"…...

从零构建高频无线传输系统:调幅技术实战解析

1. 调幅无线传输系统入门指南 第一次接触调幅无线传输系统时&#xff0c;我也被各种专业术语搞得一头雾水。简单来说&#xff0c;调幅(AM)就是通过改变载波信号的幅度来传递信息的技术。想象一下快递员送包裹&#xff1a;载波就像快递车&#xff0c;而我们要发送的信息就是包裹…...

Spring Boot 2026教育技术演示项目全栈架构与工程实践解析

1. 项目概述&#xff1a;一个面向未来的教育技术演示 最近在整理开源项目时&#xff0c;我注意到了 holzerjm/GACEP-Spring-2026-demo 这个仓库。乍一看&#xff0c;这个标题信息量不小&#xff0c;它像是一个技术演示&#xff0c;但前缀 GACEP 和 Spring-2026 又透露出…...

手把手教你用Gstreamer和V4L2在Zynq MPSoC上搭建视频流Pipeline(HDMI IN to DP OUT)

从HDMI到DP&#xff1a;Zynq MPSoC视频流处理全链路实战指南 当你的Zynq MPSoC开发板已经完成硬件设计&#xff0c;Petalinux系统也顺利启动&#xff0c;却发现HDMI输入的视频信号无法正确显示在DP接口的显示器上——这种"最后一公里"的集成问题往往最令人抓狂。本文…...

41《CAN总线报文周期、抖动与实时性分析》

CAN总线基础:从物理层到数据链路层的核心概念 一、一个让我熬夜的CAN问题 去年调试某款车载ECU时遇到个诡异现象:同一批次的控制器,有的在-20℃低温下CAN通信完全正常,有的却频繁丢帧。示波器挂上去一看,显性电平的下降沿斜率明显变缓,从正常的15ns拖到了40ns。查了三天…...

英雄联盟智能助手:5个核心功能让你的游戏体验提升300%

英雄联盟智能助手&#xff1a;5个核心功能让你的游戏体验提升300% 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否曾因错过对局接受而被…...

手把手教你用STM32和电位器,临时搭建一个TTL转485调试器(附电路图)

应急调试利器&#xff1a;用STM32和电位器快速搭建TTL转485监听器 在嵌入式开发现场调试时&#xff0c;最让人头疼的莫过于设备串口输出异常却找不到合适的调试工具。上周在客户工厂就遇到了这样的窘境——需要监控设备TTL串口数据&#xff0c;但手边只有RS485转换器和几根杜邦…...