linux·note - 几人行
type: channel
link: http://www.jiuyu.team/index.php/author/1/
description: 几人行
items: 博客停更通知
items: Docker container 修改MAC
items: JumpServer简介
items: 我的青春里没有爱情
items: 操作系统原理--Linux篇（摘录）
items: 我们，走散了（二）
items: 我们，走散了
items: RPM包制作
items: Jenkins Job介绍
items: Jenkins简介

博客停更通知
type: item
date: 2020-06-11T20:03:00+08:00
description: 为了更加方便的整理笔记，在本地实现了笔记管理，大量的时间被项目占用，笔记也仅留存到本地，暂时停更，还请见谅。

Docker container 修改MAC
type: item
date: 2020-04-21T13:46:40+08:00
description: docker run --lxc-conf="lxc.network.hwaddr=92:20:de:b0:6b:61"

JumpServer简介
type: item
date: 2020-04-01T13:19:00+08:00
description: #### 1. 部署 https://jumpserver.readthedocs.io/zh/docs/setup_by_fast.html jms_core部署在宿主机，需要在container之前启动 容器中 #### 2. 维护 自动部署脚本会下载py3的虚拟环境，启动jms_core的时候依赖该虚拟环境 安装目录：/opt/jumpserver ``` ~]# source /opt/py3/activate # 激活python虚拟环境 ~]# /opt/jumpserver/jms start -d # 启动jms_core服务 ~]# docker start jms_koko ~]# docker start jms_guacamole ``` ######断电等异常情况会导致jms_core启动失败，需要手动启动jms_core服务

我的青春里没有爱情
type: item
date: 2020-03-10T01:15:00+08:00
description: 我的青春里没有爱情。 关于这样的一句话的展开我想写很久了，一直没有开始。我知道，我不能回避我的懒惰和对世界的认知程度之低，没有意识到学习需要目标，也没有更快更有效的通过学习获得自己想要获得的能力。 起初，我想围绕这句话去叙述我喜欢了很久的一个女孩，那时候我在高中。只是有想做这么一件事的念头，并非是很强烈。后来有一段时间网络泛起了对曾经青春美好回忆的热潮，一时间铺天盖地的都是青春里的爱情。一点不夸张的说，我很羡慕主角儿都能在那样的年龄里去经历一场情感纠葛的风暴，而处在风暴之外的我很想说，青春里的懵懂、悸动被这样夸张放大是刺向我灵魂的利剑。我在初中的时候就知道，金钱是维系一段感情的基础，‘经济基础决定上层建筑’不能读一读就结束了。生于农村，长于城乡结合部，活在市井的我和我们不管是出于畏惧，亦或是出于自知都应该知道，在不对的年龄，感情的萌芽就像是地雷的引信逐渐被拉开，引信拉开后的结果就是，‘嘭’的一声血肉横飞。恰好我是属于又畏惧又自知的那一类，毕竟穷这个字儿离我太近了，近到只需想一下，准备给喜欢的女孩送什么生日礼物？这个念头就能把所有的假设全部摧毁。即使我的的勇气似有千军万马支撑，在实际情况下也会溃不成军，夺路而逃。这就是我的认知，我一直知道我很穷，包括金钱的缺乏和知识的贫瘠，还有对未来的一无所知。我一直没有足够多的勇气来支撑我的表达方式，我不能简单的说’我有一颗红心两手准备‘。对我来说，我想在能力和认知相匹配的时候去做把握大一些的事情，我不喜欢赌，赌一把也许能赢，但未必守得住。柴米油盐酱醋茶背后的有多少辛酸的故事无需一一展开，但是琴棋书画诗酒花是靠想象就能有的吗？ 距离想写这么一段话的念头的那一刻，近三千日子从身旁奔袭而过，我甚至看不清自己奔跑时的模样。似乎一直就是在埋头狂奔，很多次都奔到了另一个方向，我不知道究竟是什么样的力量把我从另一个方向不断的纠正，我猜测这股力量叫‘自知’，也许还掺杂着不少对生活的‘畏惧’。 我的青春里没有爱情。我觉得这句话不应该夹杂失落的情绪，没有不代表不好，当然也不应该是喜极而泣，至少在很多人看来，年轻才有理由肆无忌惮。我也想过以怎样的语气才能让这句话听起来不伤感、不侥幸，奈何才疏学浅，很多次读出来都是牵强的苦笑，因为我的目标被别人实现了。我并没有觉得受到灵魂上的打击，也没有觉得很遗憾，只是目标突然消失难免会有些不适应。这整个自我迭代的过程中，也许会很累，也许会不知所措，也许会对自己有更清晰的认识，知道自己想要成为什么样的人。

操作系统原理--Linux篇（摘录）
type: item
date: 2019-05-11T16:45:50+08:00
description: 太多设计内核代码段，特别是数据结构相关，没有进行仔细阅读，仅挑了部分浅显易懂的部分记录，还需要加强学习。正在阅读《深入理解Linux内核》，不求能看懂多少，像看小说那样打发时间就挺好。 操作系统原理（Linux篇） LInux内核主要由5个子系统组成： 进程管理 存储管理 文件管理 网络管理 进程间通信 Linux进程组成： 正文段： 存放进程要执行的代码，只读。 用户数据段： 进程直接操作的所有数据，包括进程运行处理的数据段和进程使用的堆栈。 系统数据段： 存放一个反应进程状态和运行环境的所有数据，这些数据只能由内核访问和使用，在系统数据段中包括进程控制块PCB。（PCB是一个名为task_struct的结构体，成为任务结构体，task_struct大约1000B，成员和功能归纳为9个方面） 1. 进程状态标志state和flags 2. 进程的标识，标识进程标识的成员：pid、uid、gid等 3. 进程的族亲关系，p_opptr，p_pptr，p_vsptr，p_cptr,p_osptr 4. 进程间的链接信息：Next_test,Prev_task..... 5. 进程间调度信息 6. 进程间时间信息 7. 进程的虚拟信息 8. 进程的文件信息 9. 与进程通信有关的进程 进程的上下文： 进程的运行环境是动态变化的，在Linux中把进程的动态变化的环境总和成为进程上下文。 1. 当前进程 2. 进程切换 3. 上下文切换 4. 进程通过系统调用执行内核代码时，内核运行是为进程服务，所以此时内核运行在进程的上下文中。 系统上下文： 内核除了为进程服务，也需要为操作系统本身任务服务，如响应外部设备的中断，更新相关定时器，重新计算进程优先级等。故把系统在完成自身任务时的运行环境成为系统上下文。 Linux中的进程都是由当前进程使用系统调用fork()创建的，而实际上fork()中进一步调用内核函数do_fork()来完成。 Linux信号的作用和种类： 信号机制 采用信号机制在进程间通信时传送的只是一个成为信号的数据，他不能传递更多的其他信息。 1. 信号的主要作用是把系统中发生的某些事件通知给进程。 2. 信号的主要特征是它的异步性，即什么时候出现信号是不可预知的。 3. 信号的数量与机器平台等有关，它与硬件平台的字长对应，如80x86的字长为32位，则信号有32种。 4. 系统中的每个信号都是一个整数，称为信号值，Linux通过宏定义给每个信号量定义了一个符号常量，称为信号名，以SIG开头。 5. 进程可以同时处理多个信号。 6. 每种信号在signal中只有一位，故不能识别接收了一个还是多个信号。 7. 信号没有优先级，可以以任意顺序处理接收到的信号 进程接收到信号处理的两种方式： 1. 交给内核进行处理 2. 有进程自行处理 Linux管道的概念 管道是Linux进程间通信的手段，管道实际上就是一种共享文件，所以管道的机制是以文件系统为基础实现的，数据在管道中以先进先出的方式，并以字符流的形态传送。 管道有两种： 匿名管道：只能在父子进程间通信 匿名管道与一般的文件不同，它没有纳入文件系统的目录，不占用外存空间，仅适用内存作为数据传输的缓冲区。缓冲区的大小决定每次写入管道的字节数，该值由全局符号常量PIPEBUF确定，缺省值为一个物理页面。 命名管道：可以在任意进程间通信 对称FIFO管道，与匿名管道的区别是，命名管道有文件名，在文件系统中可见，可以实现任意进程间通信。 ~]# mkfifo myfifo #创建一个命名的管道文件 分页存储管理： 把进程的地址空间划分为大小相等的片段，成为页或页面，相应的内存空间也分为页面相同大小的若干块，成为物理块或帧。 内存页面大小必须适中，若页面太小，减少了内存碎片的总空间，有利于提高内存的利用率，但是会使每个进程要求较多的页面，从而引起页表过长，占用大量内存，此外还会降低页面换进换出的效率。若选择较大页面，虽然可以提高页面换进换出的效率，但是会使页面碎片增大，因此页面的大小选择适中，X86架构中默认是4K 页表： OS为每个进程建立一张页面与物理块号的对照表，以便实现地址映射。页表在内存中占有一块固定的存储区，页表的大小由进程或作业的长度决定。 用于控制和历内存的硬件机制成为存储器管理单元MMU（Memory manage Unit） 80x86具有两种存储管理模式 1. 实时地址模式 2. 受保护的虚拟地址模式 内存的最大容量由物理地址长度决定，80x86机器的地址总线为32bit，2^32约为4GB 文件与文件系统 文件：具有文件名的一组信息组合，包括两部分 文件体：文件本身的信息 文件说明：文件存储和管理信息；如文件名、文件内部标识、文件存储地址、访问权限、访问时间等 …

我们，走散了（二）
type: item
date: 2019-05-07T00:30:00+08:00
description: 贝爷应该不会忘记这件事情，因为这个让我佩服的五体投地的贝爷凑过去用舌头舔了舔玩偶耷拉的舌头，当着小狗玩偶主人的面，完了贝爷还一脸嘻哈，别个姑娘不乐意了，抓起玩偶就朝贝爷砸了过去，我只是看见贝爷很尴尬的样子，我想他一定是在反思自己怎么是这样的一个人。 贝爷虽然喜欢调戏姑娘，但是还是有喜欢的姑娘。这货时常会把写给姑娘的诗拿出来让我鉴赏，内容我是记不得了，不过高中结束的时候他写满了一个笔记本，但姑娘依旧是别家的。 不得不承认贝爷胆子很大，啥都敢干，不像我干什么都有些畏畏缩缩，我曾经也敢，后来开始怕了，怕很多的东西。 贝爷追过班上的一个姑娘，艺体生。高三下学期开始不久，艺体生回到班上补习文化科目。那个姑娘喜欢玩游戏，英雄联盟。于是贝爷把所有空闲的时间都砸到网吧里去练技术去了，成绩下滑相当快，能赶上火箭的速度，这并没有结束，基本上每节课贝爷都把座位换到那个姑娘的旁边，这一点在那姑娘失恋的那段时间体现相当明显，贝爷坐在旁边拉着人家的手一个劲的安慰，那姑娘坐在那里嘤嘤的哭，整上午整下午的坐在那里一天，连尿尿这种人生大事他都能一直憋着，我不禁感叹贝爷的忍耐极限，在此向贝爷致敬。只是不知道那姑娘为啥让贝爷拉手却又不同意贝爷的死追烂缠，兴许这是很多姑娘的通病，给点甜头吊足胃口，只是这个世界上不是所有人都像贝爷那样，胃口大一点的说吃掉就吃掉你了，姑娘们可明白。爱情可以有，但是要责任和承担与之并行，否则那只是情爱了。在这个走肾不走心的时代眼睛要擦亮一点，那是你们的下半辈子的归宿。 贝爷干的事有些搞笑，他把他老妈买给他解暑的冰淇淋啥的统统都拿给人家姑娘了，人家照单全收，贝爷陪姑娘减肥跑步，满嘴跑火车，一脸献媚，我晚上体能训练的时候常常见俩人不是坐着聊天就是慢慢晃悠，我实在是看不下去，也不愿去当那个千瓦的大灯泡。 贝爷有天突然问我，他说只有一个多月了他要不要表白，我一脸懵逼的问他那你俩在一起瞎逛个毛线，感情就是贝爷自个儿厚脸皮，我说我没啥经验，不懂。 想来贝爷内心是苦苦挣扎了许久的，他终于在那个周末拨通了那个姑娘的电话朝着麦大吼了一句，吼得有些撕心裂肺，反正我是干不出来，这不符合我的逻辑。 “我喜欢你！做我女朋友好不好？！” 当贝爷吼完这句话后，那姑娘再也没有联系过他…… 这时候贝爷才开始疯狂的啃书，然而并没有什么卵用，复读之路上注定有他的脚步和孤独的背影了。 比起贝爷，我好过多了，下学期有个漂亮的姑娘陪我在食堂吃了一个学期的午饭，姑娘姓唐，我一直称呼她糖姑娘，一个可爱、漂亮、身材很棒的姑娘，请不要怀疑我的纯真，我就是和糖姑娘一起吃个午饭，虽然她老是以不能长胖了的理由把肉一个劲的往我的碗里夹。我不挑食，和糖姑娘一起吃饭的时候我的饭量出奇的好，双份。我能吃到食堂只剩下两三人，糖姑娘老是笑我吃得多，说我浪费粮食，我从没反驳过，我吃得多是事实。高三突然的结束后，我居然有些不习惯，饭量骤减，一份的量都不到。 糖姑娘喜欢着齐膝的连衣裙，不管是远远的看着还是凑近说说话很清新，她就是一个这样的姑娘，我曾开玩笑的说裙子的肩带会不会断掉，糖姑娘也会小脸微红说我是个不正经的家伙，我笑笑，装作很遗憾的的样子说太可惜了。 很感谢糖姑娘从我的生活中路过，她的笑能带走我所有的不高兴，她时而扎着马尾，或者长发披肩，甜甜的笑容和银铃儿般的声音，我想起她的时候总是会笑那时候的我运气太好，能遇到那么有意思的姑娘。后来开玩笑问她，那时候我有没有机会成为他男票，她肯定的说，有。 也许，当糖姑娘看见我送的那个牛奶杯会想起我这个很能吃的货。 高三下学期的压力很大，然而不像以前那般每周都有时间去爬山了，只能抽空释放一下压力。 我曾和班上的一个男生约定中午放学不吃午饭就以最快的速度爬山，那一次的记录是从校门口到山顶用了二十七分钟，那一次我几乎是手脚并用才上去的，也是那一次才明白一步一个脚印是多么的实在。下山用了两个小时，我俩绕着小镇走了半圈。 真正差点把我弄休克的是和锐哥等人爬山，我非得一口气跑上四百多步的石阶，上是上去了，差点儿没有机会走下山顶，就那么的摊在阳光下晒了好一会儿我才缓过气儿。 锐哥理综很棒，好的没话说。个子中等偏上，瘦削，细胳膊瘦腿是我对他的外表的描述，沉默是他最大的优点，他能静得下心，虽然他也在复读的路上留下了脚印。 临近毕业，学校抽了一天的时间给我们拍照留念，全班合影留念的时候老苟没来，他是后来给P上去的。 这天贝爷依旧很疯狂，他和一姑娘打赌一口气喝掉一罐蜂蜜，然后真的一口气喝掉了，只是贝爷喝完后着急到处找水喝，随手拿了个杯子就喝，那个杯子是向姑娘的，后来贝爷告诉我说他是故意的，我不禁感叹贝爷的套路深。 班级合影留念后基本上就是各自发挥，我老远看见一排男生围成半圆站在一起合照，我也就毫不客气的凑了过去，难得有机会凑到一起留影，拍完后我说洗了给我留一张。 唯一的合照是和物理老师，很壮…

我们，走散了
type: item
date: 2019-05-06T23:46:00+08:00
description: 一段明亮却又略显灰色的年华，时间的临近，无情的光阴卷着一群大小伙浪向火红的六月。这时光，带走了我们肆无忌惮的欢笑，流走了我们痴人说梦的理想。我们曾经的那些欢声笑语，那些争执，那些斗嘴都在时光的流逝下抛弃了我们，不带有丝毫的留恋。 我们努力过，拼搏过，也放弃过。我们有过酸甜苦辣，有过欢声笑语，也有过爱，有过恨。执着的过程属于这个世界里的我们，我们需要更多的磨砺，需要这个世界不断地打击。成长就是这样永不停歇进行着残酷的筛选，你活不下去的时候总是还有人坚强的站在那里。 留不住的时光，在指尖随着阳光跳跃着向前。 青春的风一路高歌。 逝去的岁月里，有着自己的回忆，甭管那些回忆是好是坏，只要是自己觉得珍惜的，那便是好的。 待得黄昏，独自一人在宁静的湖畔看日落后的余晖。 昨天的已经逝去，无论是好是坏，过去了的就是过去了的，谁也没法改变。 夏季的午后，站在炎炎烈日下，仰望淡蓝色的天空，你是否还记得在同一片蓝天下，过往的回忆。 回忆，回忆就像是波澜壮阔的大海里的一滴水，我们能记着的，只是冰山一角罢了。这个世界里，路人甲和路人乙多如牛毛。 手中的笔，能记得的也只是冰山一角里的一角。 回忆总是在睡梦里一次又一次的重复，像是一幕幕青春的话剧。 时光易碎，青春易逝。 年少的我们在时光里坚强的行走着，‘活下去’也许成了我们最强的信念。 青春没有挽留我们，就好像不再过儿童节那么自然，就像第一次摆脱儿童节时的洒脱。 有人说，青春是一首让人如痴如醉的歌，也有人说，青春是燃烧着的火把，还有人说，青春是在风中摇曳着的蒲公英，看起来美丽，实际上却身不由己。 这个世界上没有不散的筵席，同样的，也没有不散的青春。 青春如歌，一曲接着一曲，到处都有青春的气息，那婉转的音律飘荡在这个世界的各个角落。 我们，从童年向少年靠近再远离少年再靠近青年，是的，正值青春年少。 年轻且富有活力。 执着且坚忍不拔。 青春是一首有生命的诗，散发着无穷无尽的魅力。 再怎么美好的青春，也会成为回忆，成为一个人的回忆…… ——写在前面 我正处于年龄说大不大，说小也不小的年纪，就像约定好了不去回忆却又忍不住细细筛选，很多时候烦恼苦闷，偶尔有个老同学聊聊天就很知足，前些日子同贝爷瞎聊了很久，其中一些事情较为有趣，便许诺自己整理出来，集成一记。本来是我引开的话，却被贝爷放大，聊了很多，什么都聊。贝爷这个词儿来历简单，贝爷单名“贝”，加之那时候喜欢站在食物链顶端的男人——格里尔斯，所以这是一个略带调侃的绰号。他是一个个子不高，颜值不错的小伙儿，言语诙谐幽默，总能和姑娘找到话题聊上半天，所以这个故事就这样穿插着开始了。 历经两次中考，我终于拿着择校生的名额上了离家较远的一所高中。两次中考，两次惨淡的经历，两次被现实嘲笑。 这个故事略有些长，我也就不挑三拣四了，先从两次中考说起。 说起中考，那个年龄阶段的压力不亚于高考，首先得益于自身的认知程度不够，其次老师和父母的语重心长，想来不用说，大家的脑海里已经浮现出老师和父母的谆谆教诲了，言辞之犀利，用词之狠毒，若是诸葛在世也会为之感到颤栗吧，毕竟那似乎是无穷无尽，像是蜜蜂在耳朵边上筑上了巢，脑子里混混沌沌。 且让我算一算第一次中考我多少岁，掰完了手指算出来大概是十五六岁的样子，那时候我的脑子里还没有什么大的概念，不知道自己需要什么，不知道未来的是什么样子，整天按部就班的过活，完全一副案板上的肉——任人宰割的模样，那时候泡网吧打游戏，整天满脑子都是游戏，没人知道我第一次中考是什么样的。 我自嘲地笑了笑，那个时候的自己真的是太幼稚。 中考的时候每一堂考试我都是提前交卷，从来不去管试卷上答题的对错，只要是考卷没有留上空白感觉就万事大吉了，然后就飞奔向网吧，用“飞奔”一词绝对没有夸大，那速度真的是让人叹为观止，生怕晚了一步就没有了位置，然后一直打游戏打到下午开考前五分钟，好像那时候打游戏比吃饭还重要，感觉自己像世外高人，不食人间烟火。做梦都是自己在打游戏升级，那种激动的心情难以言表，如果那时候知道买彩票能中五百万的话，可能升级会比中了五百万还要激动。 还好，中考落榜把我拉回了现实，原来我也是要面对生活的，不能继续学业，那么只能外出务工，一想到整天顶着个太阳在工地上吭哧吭哧干个不停就心里打鼓，用了大半个月才下定决心，外出务工。可就是在我做出决定的时候，老妈打电话问我复读怎么样，我当即一口应下。 于是，复读的日子开始了，依旧是有些浑浑噩噩，但是至少还知道东南西北，勉强拿下了一张通往高中的通行证，这个通行证的费用让我很是自责，但仅仅是自责罢了，并未有什么实质性的行动，复读的那一年，我沉迷于网络小说。 终于要踏进一年前就要踏入的学校了，看着学校门口毛笔写就的苍劲大字，心里莫名的一阵激动，似乎这三年要是不干出个啥样那真是对不起自己，对不起人民币。 高中的生活也就这样正儿八经又似乎是…

RPM包制作
type: item
date: 2019-05-06T23:16:19+08:00
description: rpm包的制作是根据spec file来实现的，我们能够写spec file文件就能够实现制作rpm包了，spec file文件中都是一些命令，他告诉rpm包的制作工具rpmbuild，一步步如何解压一个软件包，如何去编译一个软件包，编译完成后如何做成不同的rpm包，rpm包之间有什么样的关系，每一个rpm包中应该包含什么样的文件。 spec file文件的语法 在各个段落中如何定义软件包的相关信息，如何控制编译，如何去列出包中所包含的文件，以及如何在spec file文件中使用宏（macro）。 #####一般来说制作一个rpm包大致包含以下几个方面的工作 ``` ============================================================= 1. 明确我们打算做的rpm包是什么东西 2. 收集制作软件包的原材料，最好是最原始的源码包 3. 收集软件包所需要的补丁 4. 制作rpm包是否适合老版本升级，是否需要执行一些清理旧包 5. 规划好rpm包的依赖关系，这个包依赖什么rpm包，这个rpm包向其他rpm包提供什么样的能力（capability） #编译依赖、安装依赖 6. 制作rpm包 7. 测试rpm包是否能够安装 ============================================================= ``` rpm包的制作需要有一个制作车间，需要有一定的目录结构 ！！制作rpm包一定不能使用root用户制作，使用普通用户来制作rpm包，因为在制作过程中如果某个命令写错了，root用户执行后的结果是灾难性的，且rpm包的制作过程中用不着root用户权限 将原材料放入规划好的目录结构中（特定目录） 创建spec file文件 编译源码生成rpm包 ``` 我们需要在特定的目录中提供5个子目录（目录名大写） BUILD：让源代码解压后存放的位置，但是我们不用管，只需要提供一个目录（真正制作过程在这个目录下） RPMS：制作完成后的RPM包存放位置（按照架构存放，例如i386目录，需为特定平台指定子目录），RPM包的编译可以实现交叉编译 SOURCES：所有收集的原材料存放在这里（conf文件，源码补丁文件等） SPECS：spec file文件，每个RPM包的制作必须要有一个spec file文件，作为rpm包制作过程中的指导文件，通常以软件包的名称命名，以spec结尾。 SRPMS：SRC格式的RPM包的存放路径 ``` redhat系统上，在/usr/src/redhat/目录下有Build RPM包的目录，权限为root，普通用户没有权限，多数情况下，我们不会在该目录下进行生成rpm包，在任何一个地方只要准备了这么几个目录都可以作为rpm包的制作车间，到底使用谁来作为当前用户rpm包的宏相关定义（rpm包为了工作有很多系统变量，和操作系统没有关系） ~]# rpmbuild --showrc #显示所有相关宏定义 宏的格式为：%{...} 名称为：_XX(一个下滑线的为定义spec文件本身环境的使用情况) 名称为：__XX(两个下划线定义的通常是命令) 定义宏的目的：在不同的系统上，路径很可能不一样，用以引用当前系统上的命令真正在什么地方。 macrofiles： 定义这些宏在什么文件中设定的（使用冒号隔开），生效的次序是自前而后的，如果配置文件中某个宏重复了，则以最后读取到的为准。 _topdir: 用于定义制作车间的路径 在家目录下创建文件~/.rpmmacros 写入%_topdir /RPM_BUILD_PATH #指定一个当前用户有权限访问的目录 spec file文件结构 intraduction section #介绍段，rpm -qi能够查询到的信息 prep section #准备阶段，解压缩源码包并cd进去 build section #编译阶段 install section #安装阶段（安装到某一个目录下，非当前系统） clean section #清理阶段 files section #文件段，列出收集的文件，打包到rpm包中 change log section #改变日志段（版本信息变更） spec文件语法 ``` ============================================================ #定义的标签（冒号前的顶格字段），在spec文件中可以使用%{name}的方式进行引用标签后（冒号）的值 #%{?dist},该处的问号能进行判断，存在就赋值，不存在则不填 #所有以"#"开头的为注释，但是注释中不能出现"%",非得出现可写为"%%" TagName: valu…

Jenkins Job介绍
type: item
date: 2019-05-04T21:17:24+08:00
description: 1. 有若干个job或project构成的庞大的开发平台系统，我们可以将开发测试，部署或基础运维相关任务通过创建一个任务或者项目，保存在jenkins任务列表中，方便日常的运维开发、维护工作。 2. 可以利用其内建模块或特定的脚本语法，将我们的工作内容抽象成jenkins job，这个任务里通过配置相关的参数及工具模块，从而作为一个可执行的任务，最终保存在jenkins平台下。 3. 每一次执行完一个任务成为一个build，可以通过查看这个build获取所需要的结果。 4. build构建信息会保存在jenkins上作为build log，可以通过查看不同时间点的log信息，从而debug任务中出现的各种问题。 5. jenkins下所有的任务构建后的所有项目相关文件，例如clone的仓库代码，maven打包生成的编译包，配置的参数文件，都会保存在jenkins的主目录workspace下，以我们当前任务名称命名的目录，作为这个job的workspace，可以查看这些工作空间中的文件，去定位无法在日志中无法定位的问题细节。 Jenkins freestyle与pipeline job的区别 freestyle job 1. 需要在界面添加模块配置项与参数完成配置 2. 每个job仅能实现一个开发功能 3. 所有的配置只能通过前台手动完成，无法将配置代码化，不利于job配置迁移与版本控制。 4. 逻辑相对简单，无需额外的学习成本 pipeline job ``` #匹配持续集成与持续交付的概念 1. 所有的模块、参数配置都可体现为一个pipeline脚本 2. 可以定义多个stage作为项目部署的每一个阶段，构建一个管道工作集串联所有的工作。 3. 所有的配置代码化，方便job配置迁移与版本控制，对有改动的部分进行版本控制，将脚本的改动定位到代码层面，方便后期的审计工作。 4. 需要学习pipeline脚本语法基础 ``` jenkins job构建配置 1. 配置jenkins server本地代码仓库 2. 安装gitclient，curl工具依赖 3. 关闭系统git http.sslVerify安全认证 4. 添加jenkins后台git client user与email 5. 添加jenkins后台git credential凭据 jenkins freestyle job构建配置 1. 在界面上创建一个freestyle project 指定任务名称 选择构建一个自由风格的软件项目 2. 编辑描述信息 写入对该任务的描述信息 3. 进行参数的配置 找到“参数化构建过程”并勾选 添加相应的参数值 4. 可添加一个文本参数并写入相应值 写在这里的参数最终最为我们预先build构建前项这个任务传送参数的接口 5. 先添加选项参数 名称：deploy_dev #作为部署环境的名称 选项： #作为任务构建前的参数选项，传入任务中 dev #开发环境 prod #生产环境 描述：Choose deploy envrionment #作为参数选项的描述任务 6. 添加文本参数 名称：version 默认值：1.0.0 描述：build version 通过传入一个预先设定好的默认参数或者自定义参数作为构建我们build这个任务前的参数值到job当中 7. 源代码管理 我们可以通过配置源代码管理选项，将git代码仓库的项目源代码clone到jenkins本地进行随后的项目部署工作。 在配置job的界面向下滑动，找到源代码管理 选择git Repository URL中输入仓库的URL地址 Credentials中选择在凭据中创建的git用户、密码 此时页面上的错误提示消失，表示git仓库认证成功 Branch Specifier */master #保证克隆的是master分支的代码 8. build配置 添加一个shell模块，编写我们的核心build任务，并最终完成我们的freestyle job配置内容 web界面向下拉动，找到“构建“，并增加构建步骤：执行shell ``` ============================================================= #!/bin/bash export PATH="/bin:/sbin:/usr/bin:/usr/sbin:usr/local/bin:/usr/local/sbin" #print env variable echo "Cuurent deployment environment is $deploy_env" >>test.properties echo "The build $version" >>test.propert…

Jenkins简介
type: item
date: 2019-05-04T21:08:48+08:00
description: Jenkins是一个开源持续集成工具，使用java语言开发 功能：提供软件开发的持续集成服务 特点：支持主流软件配置管理，配合实现软件配置管理持续集成功能。 Jenkins的优势和应用场景： 1. 主流的开发平台，兼容所有的主流开发环境。 2. 插件市场可与海量业务流开发工具实现集成 3. job为配置单位与日志管理，使运维与开发人员能协同工作的工具 4. 权限管理划分为不同job不同角色 5. 强大的负载均衡功能，保证我们项目的可靠性 jenkins的安装配置管理 ``` 1. 安装jenkins前的环境准备 #添加yum源 ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo #导入key，验证yum仓库的安全性 ~]# rpm -import https://pkg.jenkins.io/redhat-stable/jenkins.io.key 2. 保证系统java的版本为8.0或8.0以上，保证jenkins可以调用本地的java环境启动该服务 ~]# yum -y install java ~]# java -version #确定是否安装成功及版本是否匹配 3. 关闭系统防火墙 4. 关闭SELinux，并重启（强制访问控制策略） 5. yum源安装jenkins最新版本 ~]# yum -y install jenkins 6. 创建jenkins系统用户（服务） ~]# useradd jenkins 7. 更改jenkins启动用户与端口 ~]# vi /etc/sysconfig/jenkins JENKINS.USER=jenkins JENKINS.PORT=8080 8. 启动jenkins ~]# systemctl start jenkins 浏览器访问IP:8080 获取权限 安装推荐插件 创建管理员 ``` Jenkins管理界面 新建任务：新建一个jenkins job 用户：创建用户 构建历史：查看所有build构建的log记录 系统管理：配置管理系统相关配置选项 我的视图：创建自定义的dashboard界面 凭证：添加git密码，ssh key公钥 新建视图：创建自定义的dashboard界面 构建队列：build队列 构建执行的状态：所有build构建状态列表