代码+编译环境一并保存Git仓库,Jenkins使用docker编译

大家好,欢迎来到停止重构的频道。

上期介绍了Jenkins的基本用法,本期补充介绍Jenkins使用docker进行软件编译。

如果对docker不太熟悉,可以先翻看往期《docker详解》。

我们按这样的顺序展开讨论:

1、为什么使用docker编译软件

2、环境准备

3、使用docker编译软件

为什么使用docker编译软件

首先讨论为什么使用docker编译软件

docker编译软件指的是,将软件的编译环境打包成docker镜像,Jenkins编译软件时,自动下载对应的docker镜像,并启动对应容器进行编译。

相比使用Jenkins插件,或者直接在服务器上安装编译环境并通过shell指令编译。

docker编译显得很麻烦,docker编译需要手工搭建并打包成docker镜像,需要docker镜像服务存储这些镜像,需要Jenkins服务器配置docker环境。

如果Jenkins服务运行在docker中则更麻烦。

如果仅仅是mavean、node等环境就能编译完成,且无多版本切换需求。则docker编译是完全没有必要的。

但是如果编译的程序特别复杂,例如云计算引擎、多版本交叉编译等。或者希望Jenkins能大杂烩地编译各种软件。

那么,docker编译软件的方式则是首选

因为docker环境隔离的特性,可以对每个项目量身定做一个干净的编译环境。干净的编译环境不会出现底层库冲突等问题​。

更重要的是,可以将编译环境以docker镜像的方式保存起来

我们习惯是将项目代码和对应的docker编译镜像保存在同一个Git仓库。也就是同时备份代码和对应的编译环境。

这样就不会出现光有代码,但无法还原编译环境的困境​。

环境准备

在使用docker编译之前,需要做一些环境准备,也就是在Jenkins服务器上安装docker

如果服务器单纯是给Jenkins用的,且Jenkins不是以docker方式安装的,则在服务器上直接安装docker服务即可。

如果像我们一样,喜欢将Git、Jenkins、文档资料都部署在同一台服务器。且喜欢使用docker运行这些服务的话。

需要在docker运行的Jenkins中,再内嵌安装docker。以防止污染宿主机docker环境。

但是在docker运行的Jenkins中,再内嵌安装docker是特别麻烦的。

Jenkins官方文档提供了另外一种实现方式,在宿主机docker上运行dind(docker in docker)容器作为docker编译的环境

这样Jenkins容器就可以远程使用这个docker编译环境了,详细官方文档地址放在评论区​。

但是,默认情况下Jenkins官方镜像不支持远程使用docker需要在Jenkins容器中安装docker client才能远程使用docker。

具体可以按照官方说明,以dockerfile的方式构造符合要求的Jenkins镜像,再使用这个Jenkins镜像运行对应容器,即可远程使用docker

这里需要特别说明的是,官网提供的dockerfile可能会由于网络原因构造失败,一般需要配置网络代理才能构造成功。

另外,最好去掉官方dockerfile中的Jenkins用户不然,容器将不能使用apt安装其他软件。

如果希望将旧的Jenkins容器改为这种docker编译的方式,也就是不希望重新配置Jenkins任务的话。

可以将旧的Jenkins容器中的jenkins_home文件夹拷贝出来,替换到新的Jenkins容器中,并重启容器。

这里需要提醒的是,这种方式只能适合新旧容器中的Jenkins版本相近的情况。

所以在用dockerfile构造新Jenkins镜像时,最好以对应版本的Jenkins镜像作为基础镜像。

Jenkins使用docker编译

环境准备完毕后,Jenkins就可以使用docker编译了。

实现docker编译一般分为3个步骤:编译镜像制作-镜像存储-容器编译

步骤:镜像制作

首先是制作用于编译软件的docker镜像。

可以使用Ubuntu、CentOS等基础镜像启动一个容器,在此容器上安装编译所需要的环境,并且编写启动脚本

最后将此容器打包成docker镜像即可。

启动脚本是,用于启动此docker镜像对应的容器时,自动执行相关编译命令

当然,docker镜像的制作是完全开放的。

我们的建议是,代码下载交由Jenkins完成,代码文件以挂载的方式将其引入容器,启动脚本只写编译程序的命令​。

例如,默认情况下,Jenkins会将代码下载在此任务的workspace目录下,则容器启动命令如图所示。

容器启动时会将workspace挂载到容器中的/Code目录,启动脚本可直接对代码进行编译。

编译后的程序可以放在/Code目录中,这样Jenkins就可以在workspace目录下获取到编译后的文件。

步骤:镜像存储

制作后的镜像,可以存储在本地。

但是,我们更推荐将镜像存储在镜像服务当中

当然,如果不打算集中存储这些镜像的话,则甚至不打包成镜像也是可以的。

我们推荐是,采用Git服务集中存储这些编译镜像。将代码和对应的编译镜像保存在同一个仓库

以Gitlab为例,需要先在Gitlab的文件配置中打开远程访问的设置,且重启服务。不然docker将不能访问Gitlab。

如果Gitlab是http服务,而非https,则需要对编译用的docker服务进行配置修改,添加刚在Gitlab配置中设置的地址

不然docker会由于不信任http地址而报错​。

接下来需要在Jenkins的容器中,使用docker命令登录Gitlab。登录成功后,即可拉取存储在Gitlab的docker镜像。

在Gitlab管理页面中,可以在对应仓库管理页面的Container Registry中,查看docker登录、更新镜像等命令,或者查看已经上传的镜像。

这里值得一提的是,一个Git仓库可以存储多个版本的编译镜像,推荐docker镜像的版本与代码的tag相呼,应这样能方便复原历史版本编译。

步骤:容器编译

在以上准备工作都完成后,Jenkins就可以使用docker镜像进行编译了。

在Jenkins任务中,可以使用Shell指令或者docker插件完成配置。

这里以Shell指令为例,拉取镜像、使用镜像进行编译如图所示。

其中,拉取镜像的指令虽然每次都会执行,但是docker镜像有分层、识别码等机制。

所以在镜像没有变化或者变化不大的情况下,是不会消耗太多时间的

另外,在使用镜像进行编译的指令中。

我们推荐采用编译完成后自动删除容器的方式,当启动脚本执行完毕后将自动删除编译容器。

推荐将Jenkins任务的workspace目录挂载到编译容器中,这样后续Jenkins步骤也可以在workspace中找到编译完成的文件。

总结

本期主要介绍了Jenkins使用docker编译软件,可能对大多数开发者来说,没什么必要。

但是,对于维护管理多个项目的团队来说,这种方式是更加推荐的。这种方式对于项目维护、项目归档更加友好。​

因为仅仅是备份代码,对代码进行版本管理,而不备份编译环境的话,就很容易出现。​

光有代码,而由于人员流动、旧版本开源服务停止维护等原因,导致无法还原编译环境的问题

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

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

相关文章

网址访问小工具(模拟浏览器)

网址访问小工具(模拟浏览器) 文章说明核心代码运行截图源码下载 文章说明 本篇文章主要是我写的一个小demo,感觉效果还蛮不错的,作为一个记录新想法的实现思路;介绍了模拟浏览器页面的一些页面实现的小细节。 采用vue3…

文理学院数据库应用技术实验报告0

文理学院数据库应用技术实验报告0 实验内容 打开cmd,利用MySQL命令连接MySQL服务器。 mysql -u root -p查看当前MySQL服务实例使用的字符集(character)。 SHOW VARIABLES LIKE character_set_server;查看当前MySQL服务实例支持的字符序(collation)。 SHOW VARIABLES LIKE c…

ReactOS系统中平衡二叉树按从左到右的顺序找到下一个结点

ReactOS系统中平衡二叉树按从左到右的顺序找到下一个结点MmIterateNextNode()按从左到右的顺序找到下一个结点 文章目录 ReactOS系统中平衡二叉树按从左到右的顺序找到下一个结点MmIterateNextNode()按从左到右的顺序找到下一个结点MmIterateNextNode() MmIterateNextNode() /*…

解锁知识潜力:十款企业培训知识库全面解析

在当今这个快速变化的时代,企业要想保持竞争力,就必须不断提升员工的技能和知识水平。知识库作为企业培训的重要工具,不仅能够帮助员工快速获取所需信息,还能促进知识的共享和创新。 1. HelpLook AI知识库 亮点功能:…

React第十一章(useReducer)

useReducer useReducer是React提供的一个高级Hook,没有它我们也可以正常开发,但是useReducer可以使我们的代码具有更好的可读性,可维护性。 useReducer 跟 useState 一样的都是帮我们管理组件的状态的,但是呢与useState不同的是 useReducer…

python基础综合案例(数据可视化-动态柱状图)

1.基础柱状图的构建 打开浏览器,你会发现这是一个动态图,会随着时间变化而变化 具体效果大家可以看我主页有个动态柱状图视频 本质上来说,是和我们构建一个折线统计图差不多的,只是把对象换了一下 如果我们需要反转x和y轴&#…

从SQL到NoSQL:数据库类型及应用场景

在当今数据驱动的时代,数据库技术已经成为了支撑各类应用的核心。在讨论数据库类型时,SQL数据库与NoSQL数据库无疑是最常被提及的两种主流选择。 一、SQL数据库(关系型数据库) SQL数据库,通常也被称为关系型数据库&am…

YOLOv8实战野生动物识别

本文采用YOLOv8作为核心算法框架,结合PyQt5构建用户界面,使用Python3进行开发。YOLOv8以其高效的实时检测能力,在多个目标检测任务中展现出卓越性能。本研究针对野生动物数据集进行训练和优化,该数据集包含丰富的野生动物图像样本…

【动手学强化学习】part6-策略梯度算法

阐述、总结【动手学强化学习】章节内容的学习情况,复现并理解代码。 文章目录 一、算法背景1.1 算法目标1.2 存在问题1.3 解决方法 二、REINFORCE算法2.1 必要说明softmax()函数交叉熵策略更新思想 2.2 伪代码算法流程简述 2.3 算法代码2.4 运行结果2.5 算法流程说明…

LSTM(Long Short-Term Memory,长短期记忆网络)在高端局效果如何

lstm 杂乱数据分析 LSTM(Long Short-Term Memory,长短期记忆网络)在高端局,即复杂的机器学习和深度学习应用中,展现出了其独特的优势和广泛的应用价值。以下是对LSTM在高端局中的详细解析: 一、LSTM的优势…

大语言模型驱动的跨域属性级情感分析——论文阅读笔记

前言 论文PDF下载地址:7156 最近想搜一下基于大语言模型的情感分析论文,搜到了这篇在今年发表的论文,于是简单阅读之后在这里记一下笔记。 如图1所示,在餐厅领域中的"快"是上菜快,属于正面情感,但…

jfif图片怎么改成jpg?几种非常简单的jfif转jpg方法

jfif图片怎么改成jpg?随着图像技术的日新月异,用户在图像的编辑、处理与分享过程中,常常需要根据实际需求,灵活转换图像格式,以适应多样化的应用场景。正是这一需求,催生了将jfif格式向jpg格式转换的广泛实…

一些剪视频需要下载视频、chatTTS文字转语音的相关代码

可以在YouTube下载视频,下载字幕,以及需要文字转音频的一些代码,自己写的,目前也是能实现一点小需求~ 是需要下载FFmpeg、yt-dlp.exe、chrome_cookies插件,需要下载的自行search,不再赘述 人机验证 需要…

电能表预付费系统-标准传输规范(STS)(22)

6.5.2.3 DecoderKey classification 6.5.2.3.1 Classification of decoder keys STS DecoderKeys are classified according to the KT values given in Table 32 and inherit their type from that of the VendingKey, from which they are derived. STS decoderkey根据表32…

msvcr100.dll丢失怎么办,总结六种解决msvcr100.dll丢失的方法

​msvcr100.dll是Microsoft Visual C 2010 Redistributable Package中的一个关键动态链接库文件。它包含了运行由Visual C 2010编译的应用程序所需的一系列函数和类。简单来说,许多使用 Visual C 2010 编译的应用程序在启动或运行过程中会依赖 msvcr100.dll 文件。如…

Java基础 —— IO流详解

IO流 在Java中,IO(输入/输出)流是用于在程序与外部世界(如文件、网络、内存等)之间传输数据的机制。IO流分为两大类:输入流(InputStream/Reader)和输出流(OutputStream/…

软硬件开发面试问题大汇总篇——针对非常规八股问题的提问与应答(代码规范与生态管理)

软硬件开发,对于编码规范、生态管理等等综合问题的考察尤为重要。 阐述下环形缓冲区的用途 环形缓冲区(Ring Buffer)是一种固定大小的数据结构,常用于实现数据的流式传输或临时存储。在环形缓冲区中,当到达缓冲区的末尾…

计算机网络:数据链路层 —— 虚拟局域网 VLAN

文章目录 局域网虚拟局域网 VLAN虚拟局域网 VLAN 概述实现机制IEEE 802.1Q帧以太网交换机的接口类型Access 接口Trunk 接口Hybrid 接口不进行人为的VLAN划分划分两个不同VLANTrunk接口去标签后进行转发Trunk接口直接转发 局域网 局域网(Local Area Network&#xf…

【Vulnhub靶场】DC-6

DC-6靶场下载地址:https://download.vulnhub.com/dc/DC-6.zip​​​​​​ 目标 本机IP:192.168.118.128 靶机IP:192.168.118.0/24 信息收集 主机发现 arp-scan 192.168.118.0/24 根据上图得出目标主机为192.168.118.143 扫描端口&#x…

深入理解Java基础概念的高级应用(1/5)

目录 1. Java内存模型:堆、栈与方法区 示例代码:对象存储位置 2. 类加载器的工作原理 示例代码:自定义类加载器 3. JVM如何执行字节码 字节码指令示例 4. Java基础数据类型的存储与操作 自动装箱与拆箱 示例代码:基础类型…