我们,走散了 一段明亮却又略显灰色的年华,时间的临近,无情的光阴卷着一群大小伙浪向火红的六月。这时光,带走了我们肆无忌惮的欢笑,流走了我们痴人说梦的理想。我们曾经的那些欢声笑语,那些争执,那些斗嘴都在时光的流逝下抛弃了我们,不带有丝毫的留恋。 我们努力过,拼搏过,也放弃过。我们有过酸甜苦辣,有过欢声笑语,也有过爱,有过恨。执着的过程属于这个世界里的我们,我们需要更多的磨砺,需要这个世界不断地打击。成长就是这样永不停歇进行着残酷的筛选,你活不下去的时候总是还有人坚强的站在那里。 留不住的时光,在指尖随着阳光跳跃着向前。 青春的风一路高歌。 逝去的岁月里,有着自己的回忆,甭管那些回忆是好是坏,只要是自己觉得珍惜的,那便是好的。 待得黄昏,独自一人在宁静的湖畔看日落后的余晖。 昨天的已经逝去,无论是好是坏,过去了的就是过去了的,谁也没法改变。 夏季的午后,站在炎炎烈日下,仰望淡蓝色的天空,你是否还记得在同一片蓝天下,过往的回忆。 回忆,回忆就像是波澜壮阔的大海里的一滴水,我们能记着的,只是冰山一角罢了。这个世界里,路人甲和路人乙多如牛毛。 手中的笔,能记得的也只是冰山一角里的一角。 回忆总是在睡梦里一次又一次的重复,像是一幕幕青春的话剧。 时光易碎,青春易逝。 年少的我们在时光里坚强的行走着,‘活下去’也许成了我们最强的信念。 青春没有挽留我们,就好像不再过儿童节那么自然,就像第一次摆脱儿童节时的洒脱。 有人说,青春是一首让人如痴如醉的歌,也有人说,青春是燃烧着的火把,还有人说,青春是在风中摇曳着的蒲公英,看起来美丽,实际上却身不由己。 这个世界上没有不散的筵席,同样的,也没有不散的青春。 青春如歌,一曲接着一曲,到处都有青春的气息,那婉转的音律飘荡在这个世界的各个角落。 我们,从童年向少年靠近再远离少年再靠近青年,是的,正值青春年少。 年轻且富有活力。 执着且坚忍不拔。 青春是一首有生命的诗,散发着无穷无尽的魅力。 再怎么美好的青春,也会成为回忆,成为一个人的回忆…… ——写在前面 我正处于年龄说大不大,说小也不小的年纪,就像约定好了不去回忆却又忍不住细细筛选,很多时候烦恼苦闷,偶尔有个老同学聊聊天就很知足,前些日子同贝爷瞎聊了很久,其中一些事情较为有趣,便许诺自己整理出来,集成一记。本来是我引开的话,却被贝爷放大,聊了很多,什么都聊。贝爷这个词儿来历简单,贝爷单名“贝”,加之那时候喜欢站在食物链顶端的男人——格里尔斯,所以这是一个略带调侃的绰号。他是一个个子不高,颜值不错的小伙儿,言语诙谐幽默,总能和姑娘找到话题聊上半天,所以这个故事就这样穿插着开始了。 历经两次中考,我终于拿着择校生的名额上了离家较远的一所高中。两次中考,两次惨淡的经历,两次被现实嘲笑。 这个故事略有些长,我也就不挑三拣四了,先从两次中考说起。 说起中考,那个年龄阶段的压力不亚于高考,首先得益于自身的认知程度不够,其次老师和父母的语重心长,想来不用说,大家的脑海里已经浮现出老师和父母的谆谆教诲了,言辞之犀利,用词之狠毒,若是诸葛在世也会为之感到颤栗吧,毕竟那似乎是无穷无尽,像是蜜蜂在耳朵边上筑上了巢,脑子里混混沌沌。 且让我算一算第一次中考我多少岁,掰完了手指算出来大概是十五六岁的样子,那时候我的脑子里还没有什么大的概念,不知道自己需要什么,不知道未来的是什么样子,整天按部就班的过活,完全一副案板上的肉——任人宰割的模样,那时候泡网吧打游戏,整天满脑子都是游戏,没人知道我第一次中考是什么样的。 我自嘲地笑了笑,那个时候的自己真的是太幼稚。 中考的时候每一堂考试我都是提前交卷,从来不去管试卷上答题的对错,只要是考卷没有留上空白感觉就万事大吉了,然后就飞奔向网吧,用“飞奔”一词绝对没有夸大,那速度真的是让人叹为观止,生怕晚了一步就没有了位置,然后一直打游戏打到下午开考前五分钟,好像那时候打游戏比吃饭还重要,感觉自己像世外高人,不食人间烟火。做梦都是自己在打游戏升级,那种激动的心情难以言表,如果那时候知道买彩票能中五百万的话,可能升级会比中了五百万还要激动。 还好,中考落榜把我拉回了现实,原来我也是要面对生活的,不能继续学业,那么只能外出务工,一想到整天顶着个太阳在工地上吭哧吭哧干个不停就心里打鼓,用了大半个月才下定决心,外出务工。可就是在我做出决定的时候,老妈打电话问我复读怎么样,我当即一口应下。 于是,复读的日子开始了,依旧是有些浑浑噩噩,但是至少还知道东南西北,勉强拿下了一张通往高中的通行证,这个通行证的费用让我很是自责,但仅仅是自责罢了,并未有什么实质性的行动,复读的那一年,我沉迷于网络小说。 终于要踏进一年前就要踏入的学校了,看着学校门口毛笔写就的苍劲大字,心里莫名的一阵激动,似乎这三年要是不干出个啥样那真是对不起自己,对不起人民币。 高中的生活也就这样正儿八经又似乎是糊里糊涂的开始了。 在我没有来到这个学校之前,内心是无限憧憬的,到了这个稍显偏远的地方才发现以往憧憬的似乎都是别人的学校,镇子的主干道整个被挖开,土堆满了道路两旁,破败的教学楼上能够看见雨水冲刷的污痕,还好,有几颗不大不小的树桩映衬,不显得那么荒芜。 报道的那一天正赶上下雨,学校大门口的那条小道凹凸不平,积满了雨水和道路两旁小食铺的污水,水面上还能看得见油花。小食铺的存在得益于学校食堂重新修建,另外,还有两栋教学楼和一栋宿舍楼的修建不致使未开学的校园显得那么冷清,附带一个不算大的运动场。 报道的流程简单至极,凭通知书录入个人信息,交择校费,拿到分班信息后就静静的等待正式开学。 等待开学的日子是相对快些的,要到一个新环境里心里难免有些忐忑和不安,辗转几个车站之后,我再一次站在了这个校名用毛笔写就的校门前,抬头望了望了那陈旧的字迹,深呼了一口气,穿过了不算宽敞的通向教学楼的水泥路。 寻了几分钟,终于发现了一楼楼道口高一十四班的踪影,斜斜的从门口望去,老旧的漆黄讲桌落在教室前面的讲台上,讲台下课桌分布均匀,中间四列,两边各两列,隔出两个过道,教室里已经不少人落座,并叽叽喳喳的说个不停,唯有前三排空了一大半的位置,我故作淡定的坐到了中间第一排靠右边过道的位置,并自顾自的拿出事先准备好的书翻看起来,不一会儿便觉得有些无聊,环顾四周,似乎所有人都叽叽喳喳的聊个没完,目光偷偷掠过刚踏进教室便瞥见的一个姑娘,齐耳的短发,略带坏笑的古怪模样,这都不是重点,重点是这个姑娘让我有一种惊艳的感觉,白皙的皮肤,清秀的脸庞,加上坏笑的模样,深深的吸引了我。我以为,我和这样的姑娘说上话都是很难的别说是随意的聊聊天了,不过这都是后话了。 班主任进入教室的步伐和姿势是极其霸气逼人的,踏进教室的瞬间,教室便鸦雀无声,在教室里回响的只有呼吸声和班主任那霸气的脚步声,似乎是皮鞋,卡其色上衣,一副厚重的眼镜彰显出了其学问和阅历。 极其简短的自我介绍,然后又以为什么上高中,上高中该有怎么样的觉悟为引,展开了纵横中华上下五千年历史的论证,最后他说,他是我们的班主任兼化学老师。 班主任姓苟,后来我们背后都亲切的称呼其老苟,当着他的面那是万万不敢的。 老苟简单的安排了几个临时负责人,从图书馆把所有的教材课本领回班级,点名并分发给每一人,然后清点人数分配寝室,结束一天的新生工作,次日正式上课。 男生寝室正在修建中,所以我得为自己的住所寻个好地方,恰巧一个高我一届的老同学也要租房,于是我俩凑合着在出校门右拐一百米处的农家小院租了个小单间,简单的搭了两个铁架床,一张大方桌几乎挤满了狭窄的空间,租金六百元一学期,因为房主一再要求需要先定下来,交了一百元定金。住宿的一大难题算是解决。我拿着锈迹斑驳的钥匙在门上的锁孔里试着开了两次,挺好使,生锈也就无所谓了。 我琢磨着要不要出去逛一逛熟悉熟悉周边的环境,我是极不情愿漫无目的的瞎逛的,但是为了空闲的时间有地方消磨,我也只能沿着大道逛来逛去,镇子不大,所以所谓的大道也就是一条横亘在中央的两车道柏油马路,道路的两旁是些各式各样的小商铺。作为一个资深网民,我需要找到的是一处能够让我在网络世界里畅游无阻的地方,中天网吧作为首选列入了我的冲浪名单,原因有三个,一是地方够大,二是离学校够近,三是我目前只发现了这么一处。 正式上课时并没有像我预想的那样会排座位,所以说第一排的位置我是得坐上一段时间了,反正我同第一排的位置结下了不解之缘,我也不知道为什么…… 月考之后成绩一出来便开始了座位的编排,首次由班主任亲自操刀,大刀阔斧的指挥着每个人的去向,反正我感觉老苟像是在下围棋,更形象一点应该是在下五子棋,因为他把男生女生错开编排了,目的是减少男生女生扎堆聊天的机会,可惜事与愿违,没有遂老苟的心意,虽然老苟也是绞尽了脑汁。 这次的座位编排实际上我是窃喜了一场的,因为进入教室我第一眼瞥见的那个姑娘坐在我同桌的后面,换个方式说,那个姑娘的座位在我的左后方。 没有半小时我们已经将周围的人的名字给弄清楚了,她,向沫,在没有认识她以前,感觉这类漂亮的姑娘应该是心高气傲,不屑与我等刁民为伍的,咳咳,在这之前确实是没有怎么和姑娘有过交集,虽然有一个暗恋着的姑娘。 这个蛮清秀的姑娘后来我给取了个不太好听却又十分霸气的绰号——向色狼。 其实这个源于我的绰号,我的绰号很别致——色狼。 “色狼”这个字眼算是被我给颠覆了,如果有一天很多姑娘笑着称呼你色狼作为一种调侃而非谩骂时就能深深的了解那是一种什么样的体验了。 这个绰号是从初中复读的那一年给带过去的,因为班上有一个和我在同一所初中同一年级的姑娘,她的好友同我关系不错,聊着聊着,就把色狼这个绰号给带到了高中。 这说起来又得牵扯到一件较为低级趣味的一件事,复读那一年,我和一几个男同学相互打趣,他们给我取了个绰号“法国老流氓”,其实名字还是比较长的,但是介于此文不偏向低级趣味,就点到为止了,其中一个小伙伴头发自然卷,被取名“卷毛阴”,我听这个词很是懵逼,旁边的姑娘都笑开了,而我依旧不知所然,看来那个时候的我真的是非常纯真……后来有人提示我让我倒着念,我这才释然,我给送我外号那小伙伴弄个了“中国老流氓兼棉花都日不动”的绰号,因为我我绰号全称是“法国老流氓兼钢板日穿”,我这流氓的称号只被保留前半截传开了,为什么是法国老流氓,而不是其他呢?这来自于当时学的那篇文章《我的叔叔于勒》,后来我自号流氓,姑娘亲切的打趣我色狼…… 向沫这姑娘英语出奇的好,借学习之名向姑娘请教问题便显得光明正大了,偶尔课间能聊的哈哈大笑引人侧目,怎么说呢,和漂亮的姑娘聊天很惬意,要是姑娘言语幽默一点的话那估计是停不下来了,能从上早自习聊到下晚自习,就这么自然,然而,那并不是我能达到的境界。 九门功课着实让人有些压力,好在九门课只是持续了一个学期的时间,高一下学期便文理分科了,当时的我一点也不像很多小伙伴那样纠结,让我学文科背那么多东西,那我只能大呼“阿门,干掉我吧!”我实在是不愿意去背绕口令一样的历史和政治,但是地理书上歪歪扭扭的地图我还是不抗拒的。 高一的时候周末还是双休,那时候我一个月回家一次,所以周末去哪里玩儿成了个大难题,中天网吧是首选,依旧是打游戏,却没有那么废寝忘食的那种状态了,但是玩起来了一时半会儿也放不下,也许我现在应该称之为情怀,一款游戏我能坚持玩到大学,我也是比较佩服自己了,游戏浪费了我绝大部分的时间以及数额不小的软妹币,倘若那时候我有把用来上网玩游戏的钱用来泡妹子,也不至于现在依旧单漂,可那时候我偏不,偏不!一根筋呐! 现在回想起那个时候网吧的火爆程度令人咂舌,一台电脑后面两三个人排着队要玩,还不算看客,这些人里面绝大部分都是未成年,所以啊,新事物的出现总会有那么一些人因此改变人生的轨迹,不完全都是好的。 我和向沫这姑娘聊天时我总是笑得很大声,笑声大是我一贯的风格,不仅声音大而且很别具一格,笑声总能引得旁人注意,说我笑得夸张,不过和漂亮的姑娘聊天笑得再夸张那都是可以理解的。 和漂亮的姑娘聊天固然是很美好的,但是这也得是在肚子不叫唤的情况下,不然说话的力气都没有,那还怎么愉快的聊天? 吃东西这个事情大家都有经历过,我就不做详谈了,反正就是米饭就着菜往嘴里扒拉就好了,我就啰嗦几句就好,我吃饭添米饭的次数让老板很尴尬的说:“让你跑路了,下次给你换个大碗。” 那时候我正处于长身体的时候,所以大家要理解,而这也是改变不了的事实——吃得多。 吃饱喝足后打打游戏上上网成了我生活的标准配置,而没事儿喜欢独自跑去上上网也为自己埋下了安全隐患。 依旧是双休,星期五晚上不上自习便开始放假,我一个人呆着哪能像现在这么耐得住孤寂,想着出去上上网,反正租住在校外,想啥时候回去都可以,因为没有带钱,零时借了十元钱的网费和一个中天网吧的会员,买了瓶矿泉水,老板很厚道的找了我九张一块钱的纸币,攥在手里一沓子,随手塞到了牛仔裤的裤兜里。 网吧的空气是十分的闷热和浑浊的,不太能够理解那个时候的我是怎么能够忍受得了的,并且还是那么兴致勃勃的通宵达旦。我想大部分的人去网吧的目的很简单,聊天把妹,然后除了游戏就是游戏,在金钱允许的情况下可能愿意一直面对那台不大的显示器罢…… 虚拟世界消磨时间的能力大家是有目共睹的,一不小心,诶!怎么这么快就到中午了?诶!怎么这么快天就亮了!所以,当我意识到我要睡觉的时候,看了看屏幕右下角的时间,已经快凌晨一点了。于是,果断的结账下机,喝了两口水,揉了揉干涩的眼睛,便要沿着过道出去,却不料被值班的网管叫住了,说前门关上了,得从后门出去,尽管内心是一百个不情愿,但我还是摸黑下楼,穿过黑黢(qu)黢(qu)的菜市场,好不容易看到了通向校门口——也就是我的租住地的那条路上远处微弱的灯光,心里才踏实了些。网吧晚上是不敢明目张胆的收留未成年人的,虽然大门关上了,还有后门可走,在心里把网吧老板赚昧心钱的行为谩骂几遍之后,心里算是舒畅了些。 我正准备抬脚往租住地走的时候,从灯光那边来了四个人,似乎和我同方向,这不禁让我缓了口气,我怕黑,虽然壮着胆子也能吭哧吭哧走回去,但是有几个人同行那就最好不过了,于是我就放慢了继续往前走的脚步,等他们慢慢的走过来,距离不长,大概十几秒就有两人和我并排走了,我正想搭讪,忽生警觉,但为时已晚,我的右边脑袋已经被莫名硬物敲击,那时候我整个脑袋瞬间空白,耳边嗡嗡的响个不停,右半边脸感觉到热乎乎的东西,我伸手摸了一下,有些黏糊糊的,闻起来甜丝丝的,略带腥味,我知道,这回我算是撞枪口上了。 还不待我反应过来,前边的两人也迅速的靠了过来,四个人架住我的胳膊把我推搡到了路边沿的台阶上,将我按在地上不由分说的拳打脚踢一顿,我死死的护住脑袋,任由他们拳头砸在我背上,踢在我腿上,那个拿莫名硬物的小伙子依旧使用他的武器狠狠的往我背上敲了两下,并给其他三人说,这货还挺硬要不要再给我头上来几下,估计有个人心虚了,说弄死了就麻烦了,于是,我算是暂时死不了了。 待四个人觉得把我收拾的差不多的时候,我又被四个人架了起来,其中一个人问我有没有钱,他是这么问的,兄弟,借点钱呗。 我一个穷苦老百姓家里的穷孩子,能有啥钱,我否认了我有钱,不过我说的是实话。 其中一个人似乎比较能主事儿,说了句继续打。 于是我又开始经历暴风雨般的袭击了,那一刻我脑袋清醒了许多,感受到落在身上的攻击带来的疼痛,不过那一刻却觉得很爽,这并不是我犯贱或者犯二,那个时候真是这样想的,我记得真真切切。 终于,我觉得有些扛不住了,大吼了一句,我有! 这似乎是把那几个混球给唬住了,也许是我突然地爆发让他们感到诧异,反正他们整体呆滞了大概十秒,十秒的缓冲让他们意识到他们的工作还是得继续的,我再一次被四个人架了起来。 他们以同样绅士的方式向我借钱,并表示说他们大老远的跑过来不容易。而我不一样,我是被揍的扛不住了,出此下策来避免继续挨揍,我依旧是否认我有钱。几个混球终于不陪我玩儿了,估计揍人也是一件较为消耗体力的活儿,几个人开始在我身上的口袋里翻来翻去,我觉得他们的素质还是不错的,至少搜到我的钥匙还是给我塞回了兜里,而不是随手扔掉了。终于,我那一沓子九块钱起了作用了,在此我再次感谢那个找我零钱的人,不管你是大爷还是个姑娘,谢谢你。黑暗的情况是没有办法数钱的,四混球之一拿着钱跑路灯下去数钱了,剩下三人围着我,并想争夺我手上的手机,奈何三个人没从我手上拿走,不是我劲大,实在是手机这玩意儿不属于他们…… 三个人抢我手机的时候,其中一个人掏什么东西,钥匙碰的哗哗的响,我心里一阵打鼓,该不会是刀?!我都做好拼命的准备了,那货却拿出个手机点亮了屏幕,估计是看看时间。这时候那个去数钱的货回来了,对着我的腰部就是一踹,我得感谢这货,虽然他不是帮我的,但是我依旧得谢谢他这霸气无比的一脚,借着冲力,瞬间冲破了三人的包围,我没有放弃这个绝无仅有的机会,撒开脚丫子狂奔了起来,他们意识到我跑了,迅速地追了上来,一阵玻璃摔碎的声音在身后响了起来,玻璃渣子溅到小腿肚上生疼,那时正值冬天,身着厚牛仔裤。 我知道那个差点干翻我的武器是个玻璃瓶,我一路没命的狂奔,似乎听到了风的声音。 那是我有史以来最快的速度,四个混球被我甩在了身后的夜幕里。 当我站在出租屋门外的时候,远处的狗叫声让我很是忐忑,将钥匙插进锁孔这样简简单单的动作我耗费了两三分钟,虽然有些看不清,但是更多的是慌张。我窜进好不容易打开门的房间里,迅速反手将门关上,累瘫在地上,背靠着门坐了好一会儿,直到远处的狗叫声消失,我才徐徐站起打开灯,坐在方桌前缓了好一会儿,拿了镜子照了照脸,右半边脸几条醒目的血迹,已经干掉了,我想看看头上的伤口,奈何眼睛不能拐弯,只能把镜子敲成两块照着看。三角伤口,一大撮头发被砸断粘在伤口边缘,伤口一圈像米糊一样的血迹,我以为自己快挂掉了,但是依旧弄了热水把脸擦了擦,然后抱着挂了就挂了的心态睡着了。 第二天一觉到天亮,还活着,内心是有些小激动的。 就近在小诊所简单处理了伤口,就回家了,被抢劫的当天晚上,父母外出务工回家。头上多了个补丁怎么能瞒得住,老妈问我的时候我就老实交代了,可惜他们并不相信,说我是不是打群架去了,这个时候我大概知道在他们那里我被定位在什么层次。 被抢劫,被群殴,想来这些事遇到一件便是不易,却让我碰上了。因为我是个没有背景没有关系的穷学生,再加之害怕被报复,这件事情就不了了之了,只是我头上的补丁跟着我大概一个月,为了保留我帅气的形象,我弄了顶黑色的编织帽戴在头上。 被群殴让我连续一个多月很是混乱,看到成群结队的人就觉得他们有什么企图,内心的紧张和警惕暴增,那真叫一个折磨,还好我并没有变得消沉。首先,我得感谢这四个混球,这件事让我意识到了以往不可一世的自己是多么的无知,多么的懦弱,多么的不堪一击。 我对自己进行了深刻的反思和剖析,得出了一个可有可无的结论——我很弱。从思想到肌肉似乎都不能体现我的懦弱,那种懦弱似乎是扎根在骨子里的,极度的自卑和不敢面对。 我决定从肌肉开始变得强大,时隔一天,我开始了自己的训练计划,二十个深蹲、十个俯卧撑。这样的运动量让现在的我看着想笑,不过我也深深的知道,只有经历过才知道成长这一过程的重要性和必要性,不论开始的时候是多么的弱小,种子会发芽,也许成不了参天大树,但是一定能够通过汲取养分茁壮的成长,强壮的茎干,茂盛的枝叶。 这件事对我的刺激有多大呢?我用人生的转折点来形容毫不为过。 我意识到了体能训练的重要性,并且一直坚持着,现在也是如此。想起那时候十个俯卧撑、二十个深蹲结束都是一额头的细汗,不禁唏嘘,生命就是这样的神奇。高中结束的时候,一些人说很佩服我,有两点,一是坚持锻炼了三年,二是我背单词的方式让他们叹为观止。 这倒不是因为我的英语成绩好,相反,我的英语成绩一塌糊涂,但是我就是喜欢死磕,就是不放弃,上英语课从来是笔记最全,但是,但是上天并没有眷顾我这个可怜的小伙儿,我看着试卷上的单词依旧是不知所云,这些都不能阻挡我学习英语的成神之路…… 高中的作业本是无格本,就是那种没有格子线条的作业本,就像美术作业本那样。我背单词就用这样的本子一个单词抄写十遍,我喜欢写的紧凑些,所以一页下来密密麻麻,密集恐惧症患者要是看到的话,会口吐白沫吧? 我以这样的方式背单词,从初中到高中,只是高中的时候格外卖力一些,直到高中结束,我攒了四五十本我抄写满单词的本子,那是一个什么样的概念呢,我拿去当废纸买,四五毛钱一斤,所得是三块五。这还不算中途写完就随手丢掉的,我并非刻意积攒,只要我想,两天时间我就能写完一个本子,所以对我来说并不是什么值得纪念的东西,曾有同学毕业时问我要了一本较为工整的留作纪念。用掉的笔芯我留下了大概三十多支,那种大鲨鱼的粗笔芯,小笔芯都直接被我给忽略了,那种笔半天一支,不值得收藏。也许很多人读完大学未必能用掉那么多笔芯吧。 我很笨,但并没有因此先飞,反而连奔跑都很困难。但是这也极大程度上磨练了我的耐心,就如同喜欢上一个姑娘,她们总是被我先磨去耐心,恋爱这件事儿能着急吗?难道姑娘都是这么着急把自己交接出去吗?反正我是搞不明白,也许很难有机会弄明白了。 说起姑娘我就有很多话要掰一掰了,虽然老大不小的年纪了,但依旧没恋爱过,不是说我不喜欢姑娘,实在是没有遇到。很多人问我什么叫没有遇到,难道人家姑娘缠着你说非你不嫁?非也非也,虽然我长的不帅,但是也有姑娘追过,那时候一天收一封信,连着俩月,不论我怎么侧面说我不喜欢她,那姑娘依旧不依不挠,被那个姑娘强行拉手,出其不意的拥抱,依旧没能拿下我,骚年们,说实话,换做是你们能做得到吗,我问了身边一些朋友,他们对我的行为嗤之以鼻,说换做是他们就顺势推倒了,可我偏不……我说我有喜欢的姑娘,可那姑娘还是很高兴的说,说她会让我喜欢她的,她说不要我哭。 最后,我的当面直接拒绝让那个姑娘哭了两周,两周。现在想想居然还有姑娘为了我这种情商低级的货伤心两周,我都不敢相信,而这确实是存在过的,依稀记得那个姑娘很可爱,长发,声音很好听。从没有和那个姑娘有什么联系,想来我喜欢的姑娘看待我的时候是满眼的不屑吧,也是,我这样什么都欠缺的小伙儿满大街都是。 所以说,我说的没有遇到是真的没有遇到,我不会花言巧语的哄骗,我只是很安静的存活着。 既然说到了我喜欢着一个姑娘,这点儿时间就来聊聊她吧。 遇到她的那一年我从新疆回到四川老家,并就近读书,同年,她从北京回来,到班上就和我同桌,似乎同桌都是带些感情的。 如果问我为啥喜欢她,抱歉,我也不知道,而且这一喜欢就是八九年,八九年是什么概念呢,假如你有个上幼儿园的小家伙,八九年之后就上高中了。这是怎么样的一种痴迷我不知道,和她的接触并不多,远不及我和陌生人搭讪聊得多,记得大学的时候她失恋了,那天Q聊到晚上十二点,我以早些休息为由结束了聊天。 我不太敢面对她,应该是有点自卑,也没有什么好的理由去搭讪,只有她生日,年三十的时候我敢光明正大的拨通电话,瞎聊两句,一般不会超过一分钟,迫于语塞,不得不结束通话,每年如此,直到一五年她说不要再联系她了,我答应了。 就这样,我喜欢的姑娘牵着她喜欢的人的手漫步在街头,那是怎么样的一副场景呢?我想象不出来…… 这份执着被喜欢的姑娘扼杀,也算是圆满,至少她没有对我谩骂,不理不睬。 看来有缘千里相会也只是偶然。 我该怎么去形容自己呢?我是没有什么合适的词汇。记得那时候最激动的时候就是她生日的时候,早早地准备好礼物,恨不得时间过得快一点,那是怎么样的心情我早已忘记。曾两次买了苹果给她,只是因为听说她喜欢吃果冻,我逛遍了那个小乡镇的每一个商店,似乎买了喜之郎。我并不知道苹果有什么意思,我只知道一句俗语“一天一苹果,医生远离我。”,而并非他人谣传的那样代表“爱”,懵懂的年纪连喜欢都弄不明白,何谈其他。 初三的那一年,我收到她送的一个橘子,我实在是弄不明白啥意思,我千方百计想保存那个橘子,可惜方法并不奏效,后来我就保存到我的肚子里了,味道不错。每当临近我生日的时候,我内心忐忑,我想她会送给我什么礼物呢?想的整宿整宿的睡不着觉,然而我并没有收到什么,我宽慰自己,或许她以为是农历呢?然而,我想多了。 失落,似乎吃饭都难以下咽,牙齿像注了铅一样难以开合,无精打采,昏昏沉沉。 这些都阻挡不了我喜欢一个姑娘,初中中毕业的那天,我没有参加班级的聚会,偷偷的在她所在班级的窗前瞎晃,然后去商店特意买了不冰镇的绿茶,目光遍历整个教室也没看见她,后来有人问我找谁,我说了名字,发现她坐在窗户下的死角,脱离了我的视线,绿茶被她随意的放在了桌子一旁,那天晚上我在顶楼的台阶上看夜幕里的星星,直到下晚自习。 毕业后五年不曾见过她,再见她时是我循着消息逛了大半个广场的收获。她,依旧。 关于我喜欢的那个姑娘就回忆至此,我怕到时候我不信守承诺又打扰到了她的生活,所以转移一下注意,讲一讲贝爷。 我和贝爷认识是较为有趣的,我和贝爷同班,却不是互相打个招呼那种认识。 英语课上因为杨老师调节一下气氛,贝爷自告奋勇的说要唱歌,都站到讲台上了,说还要个人合唱,我不幸的被点名了。唱了任贤齐的《风云决》,那叫一个撕心裂肺,导致杨老师再也不敢在课堂上用唱歌来调节氛围了,用杀猪的惨叫来形容我们的歌声那都有些不够惨烈,关键是我俩唱的太沉醉,杨老师都不好意思打断这惨烈的歌声…… 这算是和贝爷的友谊拉开了序幕,我这人没啥优点,就是脸皮厚,总喜欢到他家离去蹭吃蹭喝,煮点什么排骨肠什么的,而这货也不当那是自个儿家,下手都不客气,整的我都不太好意思去蹭饭,贝爷这招绝,绝,绝! 吊儿郎当是贝爷给我的第一印象,没什么主见,总是很盲从的和别人去瞎混,不是网吧就是网吧,还有,我们一群人都是狂热的网络小说追随者,什么天蚕土豆,我爱西红柿等等大神的作品几乎全部扫荡。 贝爷是个贼心大胆儿小的货,大晚上的,他非得拉上我去姑娘家串门,到人家姑娘家了,乘着姑娘开门还想亲人家来着,那时候我都想给这个小王八犊子一脚,感情拉上我就是给他壮胆调戏人家姑娘来了,好在姑娘的小姨在家,没有遂贝爷这货的心意。 我在贝爷的带领下认识了小镇上较为偏僻的几处网吧,有麒麟、苹果,还有个叫什么金钥匙什么的地方,至于那些没有名字的黑网吧就不一一罗列了。他是在这个小镇长大的,所以熟悉小镇的结构是逃避老妈追杀的必需。 贝爷是网吧里的常客,经常陪别人玩儿游戏,这货就是这样,盲从。好在这货还是知道东南西北的,能分清楚是非黑白,没有堕落到逾越道德底线的地步。 好了,贝爷这货就是这个样子,谈论个大男人没啥意思,匆匆几笔带过就好。说太多这货估计得削我了,非常感谢贝爷,空缺的两年时光里帮了我不少忙,所以我就不在这里继续将他抹黑了。 还是回到高一十四班,这个我好长一段时间都记不真切的名字,那种似乎没有存在于记忆里般。 大家应该会有这么一种共识,就是漂亮姑娘周围的男生特别多,我深有体会,不善交际的我能在短短几周时间里认识相当一部分男生,然后课间就跑过来找我聊天了,现在想想,这些货哪是和我吹牛,那不过是附带着的罢了,冲着漂亮的姑娘那才是其真实目的。这也就是有一段时间我坐在最后一排没什么人鸟我的强有力证明。 那句“醉翁之意不在酒”用在此处虽然不怎么恰当,但是能表达出这个意思就行了。 被群殴之后我去网吧的次数减少了很多,晚上超过七点求我去我也是死活不肯的,可能有这么一句话能形容那时候的状态“一朝被蛇咬十年怕井绳”。 训练依旧继续,我给自己设定了目标,三天加一个俯卧撑,下蹲后来就不采用了,改跑步了,每天起个早,溜一圈然后包子铺里弄几个豆角包子,那叫一个爽,说起这个豆角包子我的口水都开始往地上淌了,要不是我早起,我连涮锅水都见不到了,买包子的人跟抢一样,包子个儿大、馅儿多、味儿美,那么壮观的场面在离开高中后再也不曾见到过了,那对卖早点的大叔人很好,像我这种饭量大的,管够! 上学嘛,总是要上上课,认认真真学习学习的,不可能天天都有什么有趣的事情发生。 高一下学期,教学楼建成,搬到新教学楼后依旧在一楼,这方便了我们那位不辞辛劳暗中观察我们学习情况的班主任老苟,说起老苟我记得比较清晰的就是他带我们后期常说的那些话,他说,我们太费心神,他头发都白了很多,天天都要发火。是的,那时候确实是有些超脱那个年纪应有的固执了,一些事情把老苟气的够呛,整天都点着支烟,苦闷无处诉说。唯有上化学课时他的那股幽默才自然而然的显现,我很喜欢化学,并不是这门课是班主任的课,我从来不刻意的去学习,看过书就扔一边,习题正常完成,不怎么花功夫也能达到较为理想的结果,这和英语相差甚远,虽然我也喜欢英语这门课。 这个学期我坐到了最后一排,忘记了是因为成绩下滑还是什么其他的原因,反正就在最后一排呆了一段时间,那段时间有些浑浑噩噩,看了几天的火影动漫,因为在语文课上和大兵同学说什么被点名,检查笔记情况,大兵书和新的一样,书被狠狠的丢在了地上,我因有随时拿支笔在书上涂涂画画的习惯幸免于难。 事后老苟把我俩弄到办公室里,煞有介事的问我们怎么办,我和大兵都不说话,老苟抽了一根烟,找了根棍子,让我和大兵互打五十下。于是,我和大兵像挠痒痒一样打了对方五十次,老苟在旁边看的忍不住笑,让我们承诺在课堂上不调皮捣蛋,应下后随即回到教室。 不知怎么的,我好像觉得最后一排有些不太好,因为最后两排基本上上课就开始趴下睡觉,唯独我拿着笔煞有其事的在本子上涂涂画画,终于我不再想待在最后一排。 脱离最后一排得谢谢向姑娘,让她帮我占了个座位,她成绩比较靠前,人缘又不错,所以我就顺理成章的成了向色狼的同桌,依稀记得是第四排右手边靠窗户的位置,采光不错。 我是一个比较随意的人,什么没有就问向姑娘借,虽然她老是拒绝,但是我还是成功借走,比如说喝水的杯子,学校里基本上都是桶装的矿泉水,喝水就得自备水杯,我比较懒,就算是弄个杯子也没处搁,所以得原谅我问向姑娘借杯子,其实我也是非常不好意思的,请原谅我说了句假话。我觉得把人家姑娘的杯子当自己的用也是一种境界啊,这让现在的我佩服不已,可想而知,那时候是得有多厚的脸皮才能这么厚颜无耻…… 正值夏天,打开窗户吹吹风是一件很惬意的事情,奈何窗帘总是晃来晃去,忘了不知是谁把窗帘的两个角绑在一起,风一吹便鼓了起来,老远就能听到一群人的笑声,我的笑声尤为特别,风把窗帘吹起来像极了文胸,以至于很多姑娘都捂着嘴笑得咯咯咯的停不下来。由于我笑声太特别,一群人因为我的笑声哄笑起来,笑的有些停不下来的节奏。 我的笑声被向色狼制止了下来,她轻轻地在我腰上的肥肉上拧了一圈,再加上一副小邪恶的表情,我也只能停下我那疯狂无比的笑声。 怎么形容我的笑声我不知道,但是我可以讲一讲有关的故事。 夏天是有午休的,吃完饭便回教室,路上我和几个同学一道,临近教学楼的时候有人讲了个笑话,我顿时笑开了,笑声肆虐整个校园,致使整栋楼里的同学一涌而出向楼下观望,看看是哪个傻X脑子坏了,我全然未觉,然后我带动了一栋楼的笑声,这才将我惊醒,赶紧夺路而逃。 向色狼很可爱,我高中回忆里的绝大部分都是她,曾答应她三个要求,看来她是没有什么机会提出来了,毕竟人海茫茫,相遇是何年。 我记得她说过这么一句“希望再见到你的时候,你可以很有底气的说你过得很好。” 我发现我有一个毛病,一聊起姑娘就没完没了,因为,我要开始讲一讲向姑娘了,老是称呼人家色狼不太好,所以此后都称向姑娘。 她是一个很活泼的姑娘,和人讲话很和气,基本上没见过这姑娘耍过脾气什么的,认识这么多女孩子,关于她我了解的最多,家里几口人,家住在哪里,父母在哪里等等,我并非刻意收集,甚至我都不知道我是怎么知道的。 高中的晚自习直到晚上九点半,有时候打扫卫生什么的就十点了,我不知咋地,不放心这姑娘单独走回去,碰到她打扫卫生的时候,我也不去帮忙,我只是瞎晃悠等她出教室,然后蹭上去聊天,瞎掰。 她家离学校不远,出后校门直走大约三五百米,中间穿过一条马路,就是我刚到这个镇子看到的那条被挖开的路,这时候已经修筑完工。路不大不宽,但是车流量比较大,每次过马路我都替她捏把汗,她埋着个脑袋只管走,有一次她没注意到车直愣愣的往前,已经走了马路的三分之一,看到车疾驰而来我都不敢叫她,怕她停下来问干啥。在那之前我是离她三五米远送她回家,之后我就并排着走了,也就不管她什么态度了。 我印象比较深的就是有天她穿了裙子,三年我也就只见到她穿过这么一次,晚上依旧死皮赖脸的送她回家,下自习后下起了小雨,她带了伞,我清晰的记得她给我撑伞时的小调皮,很可爱,那是我见过的最可爱的一个姑娘了吧。 我曾对她说,要是这条路再长一点就好了,她似乎没有回答,只是说了句“老不死”。 这是她给我的称呼,很亲切的称呼,听上去那么的顺溜、自然。 能在我的生命里遇到这么一个姑娘,我觉得已是上天对我的眷顾,我不曾多想,因为我一无所有。现在闭上眼睛回想起那三年,有她,真好。 很多的时候我都忍不住想联系她,也确确实实的联系过她,通了电话却不知说些什么,每一次我的问题和内容都一样,以至于她有些不耐烦了。 姑娘,也许你以后会明白,能有一个挂念着你却有没有其他想法的人是多么的不容易。至少我至今不曾遇到过。她的厌烦让我失去了联系她的勇气。于是,她真的只能存在于我的回忆里了,我也深深的明白,她有她的世界和方向,我,只不过是过往。 这个姑娘让我心生一种保护的心理,不因她有男朋友而减退分毫,看着她在路上晃晃悠悠的背影我就很开心,心情舒畅,也许,上辈子或者上上辈子我一直守护者她。 这就是她了,一个可爱的心存小邪恶的姑娘。姑娘,谢谢你路过我的世界,点亮了我眼前的黑暗,谢谢。 不知不觉中,我迎来了高中的第一个暑假,这个暑假注定不是那么的有趣。在我还没有放假的时候,我暑假的行程已经被安排好了。 目的地在浙江温州龙湾工业区的一处鞋厂,家里人美名其曰:体验生活。与我同行的还有俩兄弟,家里人把我们撂那儿就没再管过,吃自己的喝自己的花自己的。 一个月的时间里,我每天都重复着同一个动作,那时候正值七八月份,坐在那里汗水都往下淌,室外更像是一个大大的蒸笼。 第一周对周围的事物倍感新鲜,虽然机械的重复着工作,但是内心是愉悦的。熟悉周遭的环境后连每走一步都显得那么的枯燥无味。唯一值得欣慰的是伙食还算是让我满意。 我的工作是在车间里的流水线上,干些刷胶打杂的活,因为上头有人打点过了,所以车间里的组长什么的都很照顾,即便是这样,在半个月的时候我临近崩溃的边缘,机械的工作让我产生了极其强烈的抵触情绪,愤恨、疑惑、悲伤等各种情绪一股脑儿涌上心头,那天晚上十二点我一个人在洗手间里哭了半小时,我想起了住在天堂里的奶奶,想起了以前那个混蛋的懦弱的自己,想起了喜欢的那个姑娘…… 我开始利用空闲时间写些日记,说是日记,其实更像是自我反思,内容不多,但是容纳了那时候内心的五味陈杂。 那一个月里每天工作至少十一个小时,几乎是没有时间思考其他的事情的,起初我是理解不了为什么这些人愿意干这些机械的工作,那似乎是没有尽头。直到快离开时看到一个中年女人带着十六七岁的女儿在流水线上忙乎的时候,我才明白,活下去的这种念想让得她们不得不继续这份无聊的工作。 而我,结束了为期一个月的生活体验,同时也写完了想给自己说的话。当后来我翻开那个潦草的脏兮兮沾满胶水的本子时,我笑了,那种似乎知道自己是这个样子的笑,很轻松,很惬意。 那个本子的第一页上写着这么一句话: 人应该有梦想,没有便不能谓之人生。 最后一句很简单:我应该为自己而活。 我早已忘记写下那些话的自己是怎样的一种心情,或许是热血澎湃的吧。 再次回到校园倍感亲切,心里急切的想要见到一些人,应该是姑娘。这时候我的座位已经是固定在了讲桌旁边,我特意申请的,那样出小差的几率很少。想想和向姑娘同桌的时候,早上桌子椅子有人擦,出小差有人提醒,坐到第一排就没有那么幸运了,也没有姑娘那般讲究,反正能凑合就行。偶尔想起向姑娘的口头禅便觉得有意思,也很怀念她蜻蜓点水般的轻揪腰上的赘肉,那时候我是没有腹肌的。即便是那时候一直坚持锻炼也没有练出什么肌肉来。 和她同桌的时候,课间休息时间她基本上都是闭上眼睛小憩一会儿的,有时候我出去她不给让开,我就只能耍流氓的说,要是憋爆了你得负责,然后她回一句老不死。想来那时候真是有趣。 也许是我幡然醒悟,觉得好好学习才行,然后我就开始了看起来很努力的学习生活,那个时候基本上告别游戏了,偶尔还去打打篮球,成绩上升缓慢,我也不是那么的急躁,只要我努力过就可以了,至于结果,好自然好的,坏也得接受。就像是生活,不是每时每刻都能笑呵呵的过活的。 锻炼依然在继续,风雨无阻,是那种冒着大雨也得训练十分钟的那种坚持,任凭雨点浸湿头发,这时候我已近能够一口气四五十个俯卧撑了,虽然后来才知道一点儿也不标准,但是好歹数量上去了,引体向上逐渐被我接受,于是我真切的感觉得到自己的成长了,我开始相信量变到质变,所以我不曾放弃很多的东西。 我的爱好不多,玩游戏的时候并没有发觉电脑有其他的用途,唯一会操作的就是开机、打开游戏,深入的接触电脑我得感谢一个陌生人,我并不知道他的名字,仅数面之缘,他是一个计算机的狂热爱好者,在零六年零七年我见到他的时候他就有有很多关于计算机的书,还有数量庞大的各种软件。我第二次见到他的时候,我小心翼翼的问能不能借给我几本书,我指了指集合出版的《电脑报》,他也就瞟了一眼,让我随便拿,也没有说让我还的话,我记得应该是拿了两本厚厚的书,用了一周时间通读完毕,然后还书,很多技术性文章我是硬着头皮看完的,我也不去深究,反正只要是汉字,一字不落。那是怎样的一种认真我已经忘了,虽然看的很认真,但并不代表有什么用。感谢那个陌生的大叔,把我带到了一个有趣的世界里。 我不知道是否有人有过类似的经历,如果有,感谢那个充当了我们生命旅途的引路人吧。 从那时起,我知道了计算机不只是能拿来打游戏。其中,编程是让我觉得很高大上的一种东西,我觉得很有意思,却受到所学知识的限制,看着那些密密麻麻的代码像是天书,然而,就是这样的天书也被我硬着头皮啃完了,虽然收获不是很大。也许,知识就是一个学习、沉淀、再学习的过程,这样就能解释一段时间后再接触就容易接受。 时常有朋友这样激励自己,说,生活不止有苟且,还有诗和远方。 或许把诗和远方换成妹子,我的老同学小胖会很赞同,这个小伙儿的专长是泡妹子,是正儿八经的泡妹子,成绩不错,人很懒,一身赘肉,依旧能撩妹,我等无知小儿只能高呼其厉害,就差膜拜了。他是我初中同学,高中又凑到一起了,不同班。 这货让我帮忙干的事情想想都觉着搞笑,他自个儿蒙头睡大觉,让我长途跋涉几十公里帮他买套套,他是这么说的,以后要是什么上刀山下火海的事情就叫他,话都说到这份上儿上了,我要是不去就不好了,虽然我没有什么需要上刀山下火海。 我至今都记得我左拐右拐的绕了好几条大街以最快的速度窜进一个成人用品店,出口就问,套套怎么卖。然后老板热情的介绍,几十元上百元不等,我哪有闲心和这老板瞎扯淡,就随便指了一盒,付钱走人。 然而这并不是就结束了,大白天和做贼一样的买了东西准备打道回府,小胖来电告知需要买避孕药,再一次豪言壮语冲刷我的耳朵,我不想帮也不行,遂折回小店,小店老板说没有,但是好心的老板告诉我不远处的药房有,我不辞辛劳的徒步至药房,临近中午药房没什么顾客,只有俩值班的姑娘,我在门口的电子秤上磨蹭了十分钟都不敢去问,最后心一横,厚着脸皮就去问了,我很直接的问有没有避孕药,那姑娘说有,并问我要紧急的还是什么短效的,我一脸的局促不安,心想这还分种类?我实在是不好意思让人家给我解释,我就说紧急的。然后那姑娘盯着我看了半晌,其实我啥也没干,我只是个跑路的……我拿着药几乎是飞奔出去的,太尴尬了。现在想想那时候还真是有意思,哪像现在胆儿那么肥,指不定还打趣小姑娘几句。 我是一个喜欢好人做到底的人,买东西包我去找小胖的时候他还在呼呼大睡,我把东西扔他脸上他就醒了,兴奋的嗷嗷直叫,那只穿个大裤衩的夏天,他一身肥膘往地上淌,反正我是搞不懂这货撩妹的手段,我等再次膜拜。 看来校外出租屋方便了很多寂寞难耐的小伙伴。 这并不是个例,我租住屋的旁边有一个高我一届的小伙儿,有天带了个姑娘聊天,聊到晚上十一点多还没有停的意思。租住屋的房子不隔音,只隔了一层单砖墙,没有通顶,呼吸声大一点都能听得到,所以这俩货从小时候聊,聊到我都觉得扯淡,我瞬间都有些懵逼,这个世界到底是怎么了…… 为了不被他们的聊天嘻哈的声音吵到,我带着耳机听着歌睡着了,夜里我被很有节奏感的声音吵醒,耳机已经阻挡不了了,那“咚、咚、咚”的声音我听了好一会儿才听出来是什么撞墙的声音,我和那个小伙儿的床之间就隔了一堵墙,撞击声伴随着粗重的呼吸声,时而夹杂着一两声让人邪火中烧的声音,我的内心是崩溃的,聊成那样居然发展成这样,一夜未眠…… 这个生猛的小伙儿连着个把月半夜把我从睡梦里拉出来聆听他们的表演,我的睡眠质量直线下降,后来我不得不挪了窝,正值寝室竣工,我搬到了寝室,至此便是与那粗重的呼吸声以及那最后时刻的冲刺告别了,我需要一个清新的环境,拒绝简单粗暴。 学校的寝室绝大部分人都是呆过的,我就简单的描述一下我所在的寝室,四张上下铺,整洁算不上,清爽也是排不上号了,没有什么古怪的味道我就觉得很不错了。记得初中那会儿,一个三十几号人的大寝室,不论是春夏秋冬,寝室里的味道让人窒息,什么狐臭、脚臭、汗臭等等掺杂在一起,怎一个难受了得,有些小伙伴还买了不怎么样的香水和空气清新剂,所有的味道混在一起那叫一个酸爽,回味无穷。 寝室位于一楼111,很霸气绝伦的名字,后来我与数字二结缘,说来凑巧,111寝室里的小伙全是光棍儿,这里面住着六个性格各异的人,一个孤僻、一个看网络小说痴狂、一个玩游戏痴狂、一个做题痴狂、一个吊儿郎当瞎混、一个傻叉,我就是那个傻叉。 我别称有好几个,曾因为朗诵感情色彩浓重,语文老师送我“深情王子”的称号,还有一个别称“问题少年”,并不是我有很多毛病,只是因为课堂上我的提问太多了。想起那时候的课堂是比较有趣的,有些时候我做化学题就像开挂一样,老苟题目没有读完我的答案已经飞奔而出,不论是单选还是多选,搞得旁边的同学问我是不是提前完成了,我说没有,反而引来一阵不削。也许人与人之间的距离就是这样被拉开的。 111寝室有一个小伙伴,我叫他维哥,他是一个刷题狂魔,每天晚上理综试卷一套,数学试卷一套,他就拿个充电的小台灯照明,一直到凌晨一两点,早上正常起床,白天正常上课,课间十分钟疯狂睡觉,这货的英语差到惨不忍睹,全靠蒙,四五十分已算是高分。我估摸着大概很多人身边都有这样的存在,打着爱国的旗号了放弃这门学科。不得不说这个理由太牵强,我们应该知道“师夷长技以制夷”,也应该知道熟练地应用一门语言对自己的帮助。所以,尽最大努力掌握,重要的是学习的过程,至于结果,好自然好,坏的也要接受。 这不禁让我想起老苟喜欢说的一句话,他说他只要结果,不要过程。我倒是觉得过程比结果重要的多得多,就举个简单的例子,吃饭是我觉得人生中最舒爽的时候,要是没有吃饭咀嚼品味的过程的话,我想就没有那般有趣了。 维哥是111寝室里唯一一个喜欢挑灯夜战的小伙伴,他的最佳战绩是感冒了打着点滴依旧坚强的刷题,两天。现在回想起那些睡梦中都能听见的笔尖摩擦纸张的沙沙声不禁感慨万分,那该是怎么样的一些夜晚,也许应该有一轮皎白的月亮挂在天空,透过窗户洒下灿灿银光,以映衬这样的情景。 不知道,这些年过去了,111寝室里还有那亮到凌晨的微弱的灯光吗?是不是还是那么奇葩的组合待在那里互不干扰。 那些日子里,我还是一直坚持着锻炼,新修建的运动场也已投入使用,晚上跑两圈,练练引体向上成了我的必修课。也就是不久后,我在这个场地上跑了俩小时,大概二十来圈,且听我细细说来。 那是一个注定不太寻常的日子,关于一个姑娘,向色狼。 向姑娘这时候已经不和我同桌了,我的座位在第一排的前面,也就是讲桌旁边,我特意申请的位置,我和任课老同桌。 贝爷向来是小道消息灵通,他告诉我,向姑娘喜欢班里的一个男生,我开始还故作惊讶的说,该不是我吧?!随即便被贝爷泼了冷水,贝爷也不明说,让我自己观察,我这才注意到和向姑娘隔了一条过道的男生,个子一般、长发、瘦削的躯干和脸庞。 也许是我和老师同桌太久,都没怎么注意到向姑娘的动向了,我暗中观察了一上午,我找贝爷求证,贝爷对我竖了竖大拇指,我便会意。 我的情绪波动不大,只是感觉心里堵得慌。晚自习后我没有像往常一样拿本书回寝室复习,直奔运动场,死命的奔跑,一圈又一圈,两三圈后我能明显的感觉到迈出的脚步越来越抬不动,呼吸越来越急促,我仅仅是放缓了脚步继续,我逐渐的觉得越跑越舒畅,一直跑到就寝号响起,我就那么直愣愣的后倒在足球场的假草皮上,汗水在脸上、身上肆意蔓延,我记得那晚天空里的星星很稀疏,也不是那么亮。我是被保安驱赶回寝室的。 我似乎明白向姑娘一下自习就窜没影了是为什么,大概是不想让我这种厚脸皮的人送她回家,但是我依旧是不依不挠,总有能跟得上她的时候。事实再次戳中了了我小小的心脏,我见着那男生送向姑娘回家了…… 我终于是长长的叹了口气,每天下自习后老老实实锻炼身体。 老苟对于高中阶段恋爱是有看法的,老苟说了,只要是发现一起,就通知家里人领回家结婚领证。可惜的是,直到高中结束我也没能见到老苟霸气的通知家长领孩子回家结婚的动作。对此,我略感遗憾。 直至高中结束,班上的小情侣都没有数量减少的态势,本来理科班就是僧多肉少,而肉偏偏自个儿跑到了别人的案板上,我除了长叹几声别无他法。 想来这也是很多人成绩不断下降的原因,毕竟那时候哪有心思听课看书写作业,不过具体的我就不知道了,请原谅我这个没什么见识的人,不知恋爱为何物。 也许人一旦倒霉起来,拦都拦不住继续倒霉。 话说也就是跑完二十圈的第二天下午,由于吃饭去了晚一点,经常去的小食铺没米饭了,我退而求其次,就近在旁边的小面馆准备吃面,老板说臊子没有了,泡萝卜条有一些,老板问我吃不吃,我已经懒得继续觅食了,要了一碗二两的面,老板应我的要求把泡萝卜条垫在了碗底,热腾腾的面端了上来,我随意的在碗里搅和了几下,吃了第一口,正准备吃第二口的时候,一只硕大的苍蝇藏在面条里,我想了半天,决定还是要尊重食物,有时候自个儿家也会出现这种情况,也不是什么大事儿,我把苍蝇的躯体摆在桌子上,继续填饱我的肚子,当最后一根面下肚,只剩下了一小堆萝卜条,我寻思着,萝卜条挺好吃,也不能浪费了,我拨弄了两下,我的头顿时大了一圈,胃里止不住的翻腾,萝卜条下藏着两三只苍蝇的躯体,我不知道我吃了几只,真是罪过,我想吃个素非得给我加肉。啥话不说,付钱走人,那是我有史以来吃的最闹心的一顿饭…… 我把吃面吃到苍蝇的事儿告诉贝爷,贝爷指着我笑的腰都直不起来,然后在班里大肆宣传,然后很多人都知道我吃了一碗苍蝇。 贝爷还厚颜无耻的借走了我的手机,用于打发语文课的时间,不巧的是被语文老师逮个正着,我的手机不幸殉职,然而贝爷也没有要赔我的意思,还厚颜无耻的说不好意思,我没有了手机我也算是清净了一段时间,那段时间的周末基本上都去爬山了,主要是贝爷约了几个姑娘,然而第二天那些姑娘被被子封印了,搞得贝爷五点钟就吭哧吭哧的忙活,又是准备吃的又是准备喝的,全白干。 说是白干,其实也不然,贝爷在我的带领下爬了一两次山,后来贝爷也被被子封印了。高中课程压力较大,周末补觉很正常,被子只是封印不住我罢了,周末同样不被被子封印的还有超哥,一个看起来很蛮实,实际上一身肉松松垮垮的小伙儿,这家伙也是一个背单词属于疯狂的那一类,然而这并没有什么卵用,和我的结局是一样一样的。我想我们能认识也是有一部分这个原因吧,他坐我对面,是的,我俩霸占了讲桌的左膀右臂。 我俩喜欢一路小跑上山,那是什么样的感觉呢,抬头看着山上跑很让人没有底气,几乎每一次上山我都是埋着头盯着脚下数着一步一步的往上,或跑或走或爬,不管怎样反正就是到山顶了,山顶的地势较为平坦,两座寺庙,这都不是我想说的。 山上有个地方比较有趣,一块大石头悬在崖边,号‘读书台’。 我和超哥基本上上山就到读书台,煞有介事的朗诵诗词,偶尔来上一大段文言,吼的那叫一个撕心裂肺,嗓子要恢复好几天。 山顶看日出也是比较不错的选择,不过我觉得要是有个姑娘陪着看看日出就更好了,我就是那么一想,能不能实现还不知道。 这个时候超哥还是很有冲劲的,成绩提升空间很大,也许是觉得再努力也就那样了,超哥后来和一拨儿人彻彻底底的改变了状态,只是把床从寝室挪到了教室。 这时候很多人开始放弃了,一些人放弃的很彻底,一些人慢慢的放弃。 超哥是慢慢的放弃那一类,至少曾努力过,还留了个念想。 我见过最彻底,也是对自己极不负责任的放弃方式:直接放弃学业。如果说不去上学还好些,但是打着上学的旗号拿着学费泡在网吧小半年这种行为真的不是很好。当父母到学校找孩子问怎么这么久不回家时发现自家孩子没上学,那是怎么样的一种着急和惋惜,还有恨铁不成钢。 我见着那对中年夫妻焦急的在那里傻站着,什么也做不了,男的一支烟接着一支烟,没见他停下,愁容满面。后来经老苟多方询问才问出那同学经常出没的地方,网吧和小镇一所中学的篮球场。 我个人认为,如果觉着自己确实坚持不下去了,果断的放弃未必不是一种方法,俗话说三百六十行行行出状元,有的时候一味的坚持只能证明自己的愚蠢。 我记得那时候的我也很迷茫,真的是很努力了,却没有半点成效,比如说英语,真的像茅坑里的石头——又臭又硬,我几度想直接放弃英语,但是又转念一想放弃了就真的没有啥希望了,继续坚持下去指不定会有什么收获,然而是我多虑了。 那时候正值夏天,高二下学期快结束的时候,我心里烦闷得很,就随便找了个本子在上面乱涂乱画,恰巧被老苟盯上了,老苟悄无声息的站在我旁边看了好一会儿,问我干啥,我看着老苟回了句,天气热心里不爽。老苟没说啥走了,我以为他要劈头盖脸的教训我一顿来着…… 临近全科目的复习,暑假也没有几天时间,高三的前夕也是山雨欲来风满楼,教室前的黑板上从踏进高中的第一天就开始了倒计时,看着数字越来越小却没有多少感觉,也许连续看了两年已经麻木了,看黑板的时候会自动开启忽略模式,只有值日每天机械的更改倒计时。 贝爷因为即将到来的高三待遇提高了不少,他老妈单独给他的房间装了空调,这把贝爷乐呵坏了,可以凉凉爽爽的玩手机了,顺带着看看书,也算是为高三做准备。 高三的复读班想来大家不会陌生,一个班上黑压压的一片脑袋,即便是课间十分钟也不怎么有人出来透透气,那是怎么样的一种压力我是体验不了了,有一个复读班就在我所在班级的隔壁,他们在我们还没有起床的时候就已经在教室里,当我们下晚自习时他们巍然不动。 有幸认识一个复读的小伙儿,听他说复读班有一个连续奋战六年的牛人,连续读了六年高三,我觉着都不真实,我不敢贸然的评论,让我连续六年我肯定是做不到的。 也许所有关于高中的记忆里高三是最为清晰、最为牢固的了,整天在各种检测试卷中游荡,只有吃饭的时候能感觉到自己是个活人,第一轮复习、第二轮复习就把时间削去了一半,整天回荡在耳边的是那些时间所剩无几的话。 那些日子里还算是平稳,我喜欢把晚饭时间拿来在教学楼旁瞎溜,闭着眼睛向前数着步数走,从最开始的两三步到后来的五六十步,就那么的在树荫下瞎晃悠,晚自习后再去觅食。这一年什么都是那么的压抑,连过年也是,回到家里家里人就念叨,那真叫一个心烦,只能当做啥也听不见,只管自己吃好喝好休息好,捎带着看看书。感觉自己就像是开启了登天模式,却无处下脚。 体能训练算是一种放松的办法,记得偶尔会有陌生姑娘站在远处帮我数数,那时引体向上已经能达到二十多,比起当初的一两个来说,我进步了。就头发的长度来说,我比以前退步了不少,只因和向姑娘说了句我要留光头,向姑娘一脸的不相信,从此我的头发长度介于两毫米到八毫米之间,倒不是说我非得在姑娘面前硬气一把,只是向姑娘让这个过程提前了一些。 贝爷就算是到了高三也没有临时抱佛脚的意思,依旧是吃饭上网睡觉看小说,雷打不动,枉费了他老妈给他装空调的一片心意。这货干的每一件事都让人匪夷所思,且不说对姑娘动手动脚。 班上有一些姑娘喜欢在课桌上摆上一个小宠物的玩偶,或者是一个玩偶模样的笔袋,不知贝爷哪根神经搭错了,对这些小玩意儿感兴趣了,有一个玩偶是个趴着的小狗的模样,粉粉的小舌头耷拉在下巴前,用可爱形容应该不会过分。 妄尘集 2019-05-06 1 条评论 6626 次浏览
RPM包制作 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: value #标签名称不区分大小写 %define macro_name value #用户自定义宏 #用户自定义宏的引用:%{macro_name} || %macro_name Name: name-version-release.rpm name-version-release.arch.rpm #name中一定不能出现短横线(dash),短横线有特殊意义 GROUP: 制作的软件包属于哪个组,可参考/usr/share/doc/rpm-version/GROUPS Vendor: 制作人 URL: rpm下载位置或网址 Packager: first name License: 一定要带上,看清楚源码包的授权,REDME/change logs Summary: 概述,尽量不要写太多 %description: 写大段的描述信息,建议一行不要太长,采取强制换行 #Define Package Dependencies 定义包的依赖(可省略) Requires: capability #安装rpm包时的依赖,可以出现多次 Povides: capability #该rpm包提供的能力 BuildRequires: capability #生成rpm包时的依赖,可出现多次 #设定build locations BUILD: 用于编译的目录 BuildRoot: 用于编译后安装的目录(假想根目录) %{buildroot} #假想根目录 $RPM_BUILD_ROOT #假想根目录 Source: 怎么命名源文件(如果只有一个使用source即可) #如果有多个则:source0、source1等等 #这些源文件必须位于source下,可以加http链接,但是它不回去下在,而是到SOURCE目录下去找 #通过source引入的文件通常不会自动安装到对应的buildroot路径下,需要手动进行安装 %{__install} -p -D -m 0755 %{SOURCE1} %{buildroot}/etc/rc.d/init.d/nginx #应用"SOURCE1"需大写 Patch: 补丁,如果有补丁,命名方式同source,命名patch是为了后面打补丁引用 %prep #将源代码解压到build路径下,设置环境变量并cd进去 %setup -q -n nagios #有些包解压后名称不带版本号,当cd时会报错,因此需要使用%setup的额外选项指定名称 -q #静默模式 -a #先进build目录再解压缩源文件 #-a 0 -a 1 展开source0、source1 -b #先解压缩,再进入build目录,当展开目录为多个且需要合为一个时 #-b 0 -b 1 展开source0、source1 #-b需要先使用-c,再解压缩之前创建目录,name-version %build #对于c语言,configure,make,make install #如果是perl程序,读帮助文档perl Makefile.PL %install #保留源文件时间戳 %clean #主要作用就是删除buildroot rm -rf %{buildroot} ~]# rpmbuild --clean nginx.spec Define installation Scripts %pre #安装前脚本 %post #安装后脚本 %preun #卸载前脚本 %postun #卸载后脚本 #脚本中有$1变量,指的是安装类型(处理类型) 判断 $1 == 1 安装 判断 $1 == 2 升级 #3-9都可以用,但是常用2 判断 $1 == 3 卸载 %files #任何包含进rpm包中的文件,都在这儿列出来必须在BuildRoot目录中安装生成,支持通配符、目录 %dir /PATH/TO/DIR #将指定目录当做空目录,不关心目录中内容 %doc File_Name #不写路径,在安装时放入/usr/local/share/doc/nginx-xxx %dirdoc /PATH/TO/DIR #将整个目录下的内容作为文档处理 %config /PATH/TO/FILE #指定配置文件 #noreplace,不替换以改变的文件 #*.rpm.new(新安装的配置文件) #*.rpmorig(不兼容时的新文件名称) %config(noreplace,missing ok) #missing ok,没有也没关系 %changelog * #以星号标识日期 #日期的格式为:星期,月份,日,年,制作者,邮件地址-版本号-release号 - #短横线标识注释,在这个版本里我们都干了什么事 %attr(mode,user,group) filename #给单个文件修改属主属组、权限,为横线时保留原有属性 %attr(-,user,-) filename %defattr(-,-,root,-) #默认权限定义 ============================================================ ``` ~]# ldconfig #重新读取动态链接库中的库文件 ~]# rpm -k *.rpm #检查rpm包的来源 使用gpg命令对rpm包进行签名 ~]# gpg --gen-key #生成秘钥 ~]# gpg --list-key #查看秘钥 ~]# gpg --ecport -a '...秘钥...' >RPM-GPG-KEY-* #将公钥提取出来,随安装包给用户 ~]# rpm --addsign *.rpm #对rpm包进行签名 ~]# rpm --import RPM-GPG-KRY-* #安装公钥 ~]# rpm --checksig *.rpm #验证RPM包 PGP: Pretty Good Privacy OpenPGP是一种规范: PGP是商业的软件,使用该软件加密的也得使用该软件进行解密,为了增强适用性,PGP公司写了open PGP规范,其他公司可以按照规范开发软件,以增强适用性,GNU组织根据该规范编写了一款软件,称为GNUPG-->GPG 制作RPM包时直接签名 ~]# vi ./rpmmacros %_signature %_GPG_Name CI/CD 2019-05-06 评论 3059 次浏览
Jenkins Job介绍 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.properties echo "[INFO] Done..." #Check test properties echo "[INFO] Check test properties" if [ -s test.properties ]; then cat test.properties echo "[INFO] Done" else echo "test.properties is empty" fi echo "[INFO] build finished" =========================================================== #点击保存并推出当前配置界面 ``` 任务的构建 在jenkins界面上点击对应job的“build with parametes“ deploy env的参数选项:dev/prod version定义 点击build开始构建 点击左侧边栏中构建中的job,可查看构建的过程(点击圆球直接进入) jenkins pipeline job基础架构 ``` 1. 所有的代码包含在pipeline{}层内【第一层】 2. stages{}层用来包含该pipeline所有stage子层,将pipeline管道分为若干个管道块,每一个管道块够可以去干一件事情,而且彼此不受影响【第二层】 3. stage{}层用来包含具体的我们需要编写任务的steps{}子层,用于添加pipeline语法模块,利用模块进行业务逻辑的相关编写操作。 4. steps用于添加我们具体需要调用的模块语句,如shell模块等 ============================================================= pipeline{ agent any environment{ host='test.example.com' user='deploy' } stages{ stage{ sh "cat $host" echo $deploy } } } ============================================================= ``` agnet区域 定义pipeline在哪里运行,可以使用any,none或具体的jenkins node主机名等,例如我们要指定在node1上执行可以写成 agent{node {lable 'node1’}} any:随机在一台jenkins上执行该任务 envrionment区域 1. “变量=变量值“定义我们的环境变量,通常与stages平级 2. 可以定义全局环境变量(如PATH),应用于所有stages任务 3. 如果需单独定义一些仅应用到特定stage管道块中的环境变量,我们可以直接将envrionment写到该区域内 script区域(可选) 1. 定义在steps中 2. 编写grovy脚本语言 3. 用来进行脚本逻辑运算(具有grovy基础) steps区域 1. echo:打印输出静态、动态语句到build构建任务log输出中 echo $deploy 2. sh:调用Linux系统shell命令在pipeline下编写shell脚本 sh "cat 'test.properties'" 3. git url:调用git模块进行git相关操作 git url: "https://..." jenkins pipeline job构建配置 ``` 1. 创建一个pipeline project jenkins管理界面新建任务 键入pipeline job任务名称 选择pipeline流水线任务并确定 2. 添加描述信息 This is my first pipeline job 点击应用 3. pipeline脚本配置 找到pipeline任务栏 编写我们的pipeline脚本 ============================================================= #!groovy pipeline{ angen{node {lable 'master'}} environment{ PATH='/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin' } parameters{ choice( choices: "dev\prod" description: "choose deploy environment" name: "deploy_env" ) string(name: 'version', defaultValue: '1.0.0', description: 'build version') } stages{ stage("Checkout test repo") { steps{ sh 'git config --global http.sslVerify false' #关闭当前git的全部ssl认证 dir("${env.WORKSPACE}") { git branch: 'matser',CredentialsId: “需要到jenkins管理界面查看git凭据ID”, url: 'https://git repo address' #添加了一个checkout test repo的stage,将git仓库中的源代码clone到jenkins当前任务下的workspace工作区域内 } } } #接下来创建第二个stage区域,相当于这个管道流水线的第二个子任务,用来将我们的pipeline传入的参数写入到我们上一个stage子任务clone下来的test properties中。 stage("print env variable") { steps{ #当前所有模块调用以及任务执行都在我们定义的dir中运行 dir("$env.WORKSPACE") { sh """ #三引号内以shell的风格编写shell语句 echo "[INFO] Print env variable" echo "Current deployment environment is $deploy_env" >>test.properties echo "The build is $version" >> test.properties echo "[INFO] Done..." """ } } } stage("Checkout test properties") { steps{ dir("$(env.WORKSPACE)") { sh """ echo "[INFO] Check test properties" if [ -s test.properties ]; then cat test.properties echo "[INFO] Done..." else echo "test.properties is empty" fi """ } } } } } ============================================================= ``` 点击保存并退出 点击立即构建,首次构建会提示找不到deploy变量,因为在首次构建pipeline job的时候我们的参数没有引入到我们当前的pipeline job当中,此时构建的按钮变为了"Build with parameters",点击它就可以看到我们在build之前需要添加的参数,点击build才能开始接下来的构建。 jenkins 应用 Jenkins 与Linux shell集成 ``` 1. 新建freestyle project 名称:shell_freestyle_job 选择freestyle_job并确定 2. 输入描述信息 在页面下找到"构建",选择增加构建步骤:执行shell 在界面文本框中添加shell语句,此处为一些主机信息查看语句 ============================================================= #!/bin/bash user=$(whoami) if [ $user == 'deploy' ]; the echo "hello,my name is $user" else echo "sorry,i’m $user" fi ip addr cat /etc/system-release free -m df -Th py_cmd=$(which python) $py_cmd --version ============================================================= ``` Jenkins参数集成 ``` 1. 进入jenkins管理界面,新建freestyle job 名称:parameter_freestyle_job 选择构建一个freestyle job并确定 2. 输入描述信息 选择参数化构建过程复选框 添加"选择参数" 名称:deploy_env 选项:dev uat stage prod 描述:Choose deploy environment 添加文本参数 名称:version 默认值:1.0.0 描述:fill in build version 添加bool值参数 名称:bool 默认值勾选则默认为ture 描述:Choose bool value 添加密码参数 名称:pass 默认值:密码字符串(如果不输入,在构建时会手动输入,脚本中调用pass变量时) 描述:Type your password 3. 添加构建步骤 选择执行shell,添加一个shell模块 添加shell语句 ============================================================= #!/bin/bash echo "Current deploy environment is $deploy_env" echo "The build is $version" echo "The password is $pass" if $bool; then echo "REquest is approved" else echo "request is rejected" fi ============================================================= 保存并退出 点击构建,可以查看到添加的参数选项 ``` Jenkins与git集成 ``` 使用jenkins内建的git插件将gitlab仓库的代码clone到jenkins本地,准备随后的代码构建工具。 1. jenkins界面新建freestyle job任务 名称:git_freestyle_job 选择freestyle_job并确定 2. 填写描述信息:This is my first git 找到源码管理选择git 添加git仓库地址"https://..." 选择git用户名和密码(系统凭据)并确定 点击构建 Jenkins与ansible集成 使用shell模块调用本地的ansible命令,从而实现jenkins能够集成ansible工具进行远程服务器的部署管理功能。 ansible虚拟环境3.6配置以及配置jenkins主机下deploy用户到目标主机的秘钥认证。 1. jenkins界面新建freestyle job任务 名称:ansible_freestyle_job 选择freestyle job并确定 2. 填写描述 This is my first ansible job 3. 构建模块选择"执行shell" ============================================================= #!/bin/bash set +x source /home/deploy/.py3-a2.5-env/bin/activate source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q cd /home/deploy ansible --version ansible-playbook --version cat testserver #详细清单目录 ansible -i testservers.testserver -m command -a "ip addr" set -x ============================================================= 保存并退出 构建任务 ``` CI/CD 2019-05-04 评论 3509 次浏览
Jenkins简介 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构建状态列表 CI/CD 2019-05-04 评论 2784 次浏览
ansible简介 使用python开发,以playbook作为基础部署架构 特点:仅依靠SSH协议通讯就可以完成全平台,无需编译,模块化的部署管理 作用:推送playbook进行远程节点快速部署 ansible与chef/saltstack的不同: chef: 使用ruby 语言编写,C/S架构,配置需要git依赖(实现版本控制功能) pipline脚本编写规范,需要编程经验 saltstack: 使用python语言编写,C/S架构,模块化配置管理 YAML脚本编写规范,适合大规模集群部署 (含有异步文件服务器,为客户端加快文件服务速度) ansible: python语言编写,无client,模块化配置管理 playbook脚本编写规范,易于上手,适合中小规模快速部署 优势: 1. 轻量级无客户端(agentless),SSH连接,无形中减少了客户端资源的占用,安全问题。 2. 开源免费,学习成本低,快速上手 3. 使用playbook作为核心的配置架构,统一的脚本格式批量户部署 4. 完善的模块化扩展,支持目前主流的开发场景 5. 强大的稳定性和兼容性 6. 活跃的官方社区问题讨论,方便Troubleshooting与DEBUG问题 在部署ansible环境时,避免python模块的冲突,保证部署的模块只会应用于ansible,而不会影响到其他工具的使用,将ansible与其他系统工具隔离开,使用python内置的virtualenv命令隔离python3.6语言环境,单独划分一个环境给ansible使用 ansible的部署: yum包管理安装 ansible成为系统全局下的工具,系统下任意的用户都可以使用,但是如果当前系统下的其他用户安装了其他的python模块,这里就会与ansible下的模块造成潜在的冲突。 因为在全局状态下,Python的模块安装后都会保存在Python的同一个Python扩展目录下,当ansible用到的模块与其他工具用到的模块一致时,但是调用模块的版本不同,这样势必会造成Python模块的管理混乱,最终影响产品部署交付。 我们可以clone ansible的源码至主机中,配合virtualenv实现ansible特定版本独立环境的创建,保证ansible在一个独立的python环境下运行。 ansible2.5+Python3.6部署: ``` 1. 安装python3.6版本,以及pip3 ~]# wget http://www.python.org/ftp/python/3.6.5/python-3.6.5.tar.xz ~]# tar -xvf python-3.6.5.tar.xz ~]# cd python-3.6.5 ~]# ./configure --prefix=/usr/local/ --with-ensurepip=install --enable-shared LDFLAGS=”-wi,-rpath /usr/local/lib” --prefix=/usr/local/ #指定安装目录 --with-ensurepip=install #安装pip包管理工具 --enable-shared LDFLAGS=”-wi,-rpath /usr/local/lib” #用来配置python3.6匹配当前系统的参数值 ~]# make ~]# make altinstall #~]# make && make altinstall #需要root权限执行 ~]# whitch pip3.6 ~]# ln -s /usr/local/bin/pip3.6 /usr/local/bin/pip #给pip3.6做软链接 2. 安装virtualenv,用于隔离python与ansible环境 ~]# pip install virtualenv 3. 创建ansible账户病安装python3.6版本env实例 ~]# useradd deploy && su - deploy #创建一个名为.py3-a2.5-env的实例目录 ~]# virtualenv -p /usr/local/bin/python3 .py3-a2.5-env 4. git源代码安装ansible2.5 #安装git环境及依赖 ~]# yum -y install git nss curl ~]# cd /home/deploy/.py3-a2.5-env ~]# git clone https://github.com/ansible/ansible.git ~]# cd ansible && git checkout stable-2.5 5. 加载python3.6 virtualenv环境 ~]# source /home/deploy/.py3-a2.5-env/bin/activate 6. 安装ansible依赖包 ~]# pip install paramiko pyYAML jinjia2 7. 在python3.6环境下加载ansible2.5(虚拟环境) ~]# source /home/deploy/.py3-a2.5-env/ansible/hacking/env-setup -q 8. 验证ansible2.5 ~]# ansible --version ``` ansible playbook入门和编写规范 playbooks表层目录结构: inventory/ testenv roles/ testbox/ tasks/ main.yml deploy.yml ``` 1. inventory/ #存放一个或多个server清单,用来保存目标部署主机的相关域名或者IP地址,以及该主机的变量参数。 #通常可以使用具体部署环境的名称给server清单进行命名,如devlop开发环境、UAT测试环境、production生产环境,对应保存在清单下的主机地址具体部署到哪个环境当中。 testenv文件结构: [testservers] #server组标列表标签,可以保存一个或者多个目标主机(IP或域名) test.example.com #目标部署服务器主机名 [testserver:vars] #server组列表参数(变量) #目标主机key:value键值对参数作为server组的变量声明 server_name=test.example.com user=root output=/root/test.txt 2. roles/ #用来保存我们需要部署的详细任务列表,可以存放一个或多个role,通常会命名为项目名称。 tasks/ #用于保存项目的主任务文件:main.yml main.yml任务文件 #文件位于roles目录下的项目目录下的tasks目录中,用来保存特定role下面要执行的具体任务乐章,文件中会有一个或多个task作为音符 #task一般由两部分组成 - name: print server name and user to remote testbox #任务名称,用于识别不同的task的作用 shell: “echo Currently {{user}} is logining {{server_name}} >{{output}}” #具体要执行的任务,通常会调用ansible内建的模块来编排我们的任务逻辑,此处调用的是inventory中定义的键值对参数。 3. deploy.yml #playbooks任务入口文件,它将调度我们roles/下需要去部署的项目,以及该项目下所有的任务,最终将任务部署到我们在inventory/中定义的目标主机中。 #核心文件,用来直接和ansible playbook命令直接对话,它将playbook下的编排内容展示给ansible命令,进行最终的演奏,将项目部署到对应的目标主机当中。 - hosts: "testserver" #调用对应server列表中的主机,inventory/testenv文件中的server组标签 gather_facts: ture #获取server基本信息 remote_user: root #目标服务器系统用户指定 roles: -testbox #指定roles/下的任务目录进行任务执行 ``` SSH免密认证 ``` 1. ansible服务器端创建SSH本地秘钥 ~]# ssh-keygen -t rsa #在本地创建rsa格式的公钥与私钥 2. ansible服务器端建立与目标部署机器的秘钥认证 ~]# ssh-copy-id -i /home/deploy/.ssh/id_rsa.pub root@test.example.com #将公钥传输到目标机器,实现ansible服务器端免密访问目标服务器 ``` 执行playbooks,将对应项目进行部署 ``` ~]# ansible-playbook -i inventory/testenv ./deploy.yml playbooks执行结果字段含义: PLAY RECAP #playbooks执行总结 主机名:test.example.com ok=2 #成功执行2个task changed=1 #有一个task有变动,对目标主机进行了修改 unreachable=0 #无法到达的主机数为0 filed=0 #语法结构没有错误 ``` ansible常用的模块: ``` file模块:在目录主机创建文件或目录,并赋予其系统权限 - name: create a file file: 'path=/root/foo.txt state=touch mode=0755 owner=foo group=foo’ #任务 copy模块:实现ansible服务端到目录主机的文件传递 - name copy a file copy: 'remote_src=no src=roles/testbox/files/foo.sh dest=/root/foo.sh mode=0664 force=yes’ remote_src=no #声明将ansible主机的文件传送到目标主机中 src=roles/testbox/files/foo.sh #源文件路径 dest=/root/foo.sh #目标路径 mode=0664 #指定目标主机copy的文件权限 force=yes #强制执行,同名覆盖 stat模块:用于获取远程文件状态信息,并将其信息保存在一个环境变量下供随后使用。 - name: check if foo.sh exists stat: 'path=/root/foo.sh’ register: script_stat Debug模块:打印到ansible执行输出,与stat结合使用 - debug: msg='foo.sh exists' #输出内容为:foo.sh exists when: script_stat.stat.exists #判断语句 command/shell模块:用来执行Linux目标主机命令,推荐使用shell模块 #shell环境会调用Linux环境下的/bin/bash,因此可以使用系统变量,重定向符、管道符等 #command不能使用特殊的用法 - name: run the script command: "sh /root/foo.sh" #执行目标主机上的指定目录下的脚本 - name: run the script shell: "echo 'test' > /root/test.txt" template模块:实现ansible服务端到目标主机jinja2模板传送 - name: write the nginx config file template: src=roles/testbox/templates/nginx.conf.j2 dest=/etc/nginx/nginx.conf Packaging模块:调用目标主机系统包管理工具(yum|apt)进行安装 - name: ensure nginx is at the latest version yum: pkg=nginx state=latest #CentOS|RedHat pkg=nginx #指定安装包的名称 state=latest #保证为最新的版本 - name: ensure nginx is at the latest version apt: pkg=nginx state=latest #Debian|Ubuntu service模块:管理目标主机系统服务,调用service或systemctl - name: start nginx service service: name=nginx state=started ``` Ansible 2019-05-04 评论 2437 次浏览
持续集成工具Jenkins 持续部署的关注点在于项目功能部署至服务器后可以运行,为下一步测试环境测试环节或最终用户正式使用做好准备。 经常性,频繁的吧所有的模块集成在一起进行测试,有问题尽早发现,这就是持续集成。 持续集成的关注点在于尽早发现项目整体运行问题,尽早解决。使用小版本不断进行快速迭代,不断收集用户反馈信息,用最快的速度改进优化。 持续交付的关注点在于研发团队的最新代码能够让最终用户体验到。 #####CI(持续集成) 持续集成是软件开发过程中的一种实现,通过将代码仓库与jenkins集成,是开发人员的每一次代码提交都能够在jenkins上自动进行任务的build构建,帮助开发团队第一时间发现问题并解决问题。 #####CD(持续交付) 在CI的基础上将构建好的软件版本通过jenkins的测试自动化部署,持续、安全、快速地交付到用户手中。 总体目标: 降低风险 减少重复过程 任何时间任何地点生成可部署软件 增强项目的可见性 建立团队对开发团队的信心 Jenkins可以整合GitHub和Subversion 自动化部署的实现:向版本库提交新的代码后,应用服务器上自动部署,用户或者测试员使用的马上就是最新的应用程序。 #####系统结构描述: 版本控制子系统 Subversion服务器 项目对应版本库 版本库中的钩子程序 持续集成系统 #####Jenkins 主体程序 SVN插件 Mavn插件 Deploy web container插件 #####应用发布子系统 JDK TomCat Jenkins使用天气来表示构建成功率 curl命令用来发送HTTP请求 ``` ~]# curl –X post –v [Jenkins_user_name]:[Jenkins_Password] –H“请求消息头信息” –http://[server_IP]:[Port]/Jenkins/job/[Jenkins_Project]/build?token=[身份验证令牌] ``` -X 指定请求方式 -v 显示响应结果 -u 携带用户名和密码 -H 携带请求消息头信息 Jenkins_URL/job/Project_Name/build?token=TOKEN_NAME Jenkins_URL http://Server_IP:8080/jenkins job 固定名称 Project_Name 自定义项目名称 build 固定名称 ?token=TOKEN_VALUE 值在jenkins界面自定义 当触发该触发器后会完成自动构建(浏览器访问该地址也会触发构建[代码提交通知jenkins的方法]) ![](http://fxme.top/usr/uploads/2019/05/1767111016.png) Jenkins: Jenkins Build的版本比代码库晚一个版本的解决办法:在Jenkins源码管理工程配置中,Repository URL为URL@HEAD,“@HEAD”意思为指向最新版区下载代码,GitHub上使用的每个repository的WebHook方式远程触发Jenkins的构建。 GitLab:开源分布式版本控制系统,使用ruby开发,管理项目源代码,版本控制复用与查找。 GitHub:分布式在线代码托管仓库,个人版本可以直接在线免费使用,企业版本收费且需要服务器安装。 GitLab的优势和应用场景: 开源免费适合中小型公司将源代码放置在该系统中 差异化的版本管理,离线同步以及强大的分支管理功能 便捷的GUI操作界面以及强大的账户权限管理功能。 集成度很高,能够集成绝大多数的开发工具 支持HA,保证在高并发下仍旧实现高可用性。 GitLab主要服务构成 1. Nginx静态web服务器,GitLab的proxy处理所有HTTPS静态访问请求。 2. GitLab-workhorse 轻量级的反向代理服务器,处理较大文件的上传下载(如push操作) 3. GitLab-shell用于处理Git命令和修改authorized keys列表 4. Logrotate 日志文件管理工具,负责处理日志的切割/打包等操作 5. Postgre sql数据库,保存所有的gitlab数据信息 6. Redis缓存服务器,加快前台的访问速度 本地需安装gitclient,保证能够进行clone gitlab的工作流程(可使开发人员并行完成后自身的feature需求,而又不会对主分支代码产生影响): 创建并clone项目 创建项目某Feature分支 编写代码并提交至该分支 (实际环境中,管理员会创建好项目仓库,并在该仓库下根据我们的业务需求去创建若干个feature特征分支,这些feature分支会以任务的形式分发给我们的开发) 推送该项目分支至远程Gitlab服务器 在Gitlab图形界面下找到自己的代码进行代码检查并提交master主分支合并申请 项目领导审查代码并确认合并申请 GitLab应用: Gitlab拥有强大的分布式版本控制系统,也有着出色的后台管理能力,后台的管理可以针对不同的项目/不同的用户去定制不同的访问策略。 GitLab运维需要获取的系统的关键值: CPU利用率/内存/磁盘使用率 保证在gitlab在一个高并发的情况下依旧能够快速稳定运转 admin需要分配不同的人对不同的项目拥有不同的权限 保证开发人员具有分支的克隆/删除/推送/提交/合并/创建分支等权限 保证项目领导在具有开发人员权限的基础的同时,具有检查项目用户/开启/禁用/保护分支/编辑项目信息/审核确认分支的申请的权限 ``` ~]# git -c http.sslVerify=flase clone CodeRepo_Addredd(仓库地址) #输入开发人员账号密码进行代码仓库的克隆 ~]# git check -b release-1.0 #创建名为release-1.0的分支并切换进该分支 #该分支下依旧存在clone的代码文件,在该分支下进行代码的编写 ~]# git add ~]# git commit -m “release-1.0” #本地提交feature更新 ~]# git -c http.sslVerify=flase push origin release-1.0 #将代码同步到远程的release-1.0的分支中 登陆到gitlab Dev账号,在界面上可以看到新提交的代码,点击create merge request将代码合并到master分支(申请) leader登陆gitlab界面通过合并申请 ``` CI/CD 2019-05-04 1 条评论 5610 次浏览