
凌晨两点。

隔壁的猫发出那种类似叫春的声音,我的服务器同样在发出声响。并非是源于思念之情,而是由于我再次使用 kill -9 指令处理了那个令人厌恶的 java 进程。端口 8088 处于被占用的状态,其对应的 pid 为 20807,我注视着它,宛如在看着一个像赖床般不愿起身的孩子。
其实我只是想睡个安稳觉。
然而代码终究是得进行部署的。你大概也是如此,眼眶呈现黑色,不停地刷着控制台日志,对着GitLab的token吐出一句“你又过期了”。随后复制以glpat -开头的那串杂乱无章的代码,仿若在进行黑市交易那般。粘贴进去,点击一次,出现绿灯。

没人知道这套“自动化”背后,全是手动的泪。

## Git 明明记得一切,却从不告诉你哪里会崩

他们讲,运用Git去管理历史内容,借助Maven来管理构建流程。这番话语实在是极为正确 ,正确到如同教科书那般。

然而,教科书并不会向你告知:当你运用yum为CentOS安装Git之际,其版本低至连Jenkins都无法识别它,此时你必须前往进行源码编译,随后对着./configure所出现的报错愣神半小时。
更不会向你讲:你于IDEA内顺遂地commit,将其push至远程仓库之时,而后前往GitLab页面去点击那个Merge Request,一旦呈现绿色,你便认定一切已然妥当无误了。

但其实你忘了配置 .gitignore。

那个占据 200MB 空间的 node_modules,是被你关系亲密的好友连带推上去的。你欠缺自我认定的勇气脸皮去承认,我也缺失问询的勇气脸皮去问。
## Maven 是个好仆人,也是个坏主子

根目录下的 Root POM 无需改动,鉴于其所处位置恰好在根目录那儿。教程当中就是这般记述的。
于是你保持默认,点保存。然后那个橘红色的灯亮了。
server.port=8088
@RestController
@RequestMapping("/")
public class HelloController {
@RequestMapping
public String sayHello() {
return "Hello dev";
}
}
[错误],未能执行目标…… ,出现这种情况,是在执行某个任务时,遭遇了致使目标执行失败的状况。
你前往查看控制台输出,那儿有 400 行日志,你对其进行翻阅,一直翻到末尾,这时会看到一行内容如下:“阿里云仓库找不到 2.7.11 - SNAPSHOT”。
那么个时刻,你切实领会明白了啥叫做“SNAPSHOT”,即快照之意,迅速地,照那么一下便消逝不见啦,而你呢,也即将快速消失了。

你把版本改成 2.7.10,重新跑。
绿了。

## 包传过去了,然后呢?

配置通过 SSH 发送文件,需执行 Post Steps。

你万分谨慎地于“Transfer Set”之中填入source files,自workspace着手寻觅那个jar,把路径填写正确之后,勾选“Remove prefix”,将/target/前面多余的部分去除。
你以为它会在测试服务器的 /root 下出现。
但你没有 mkdir -p /root/myapp。
报错。File not found。
你并非不晓得要去构建目录,你不过是忘却了,你老是忘却,你还忘掉了今日乃是周五,下周一前来进行验收。

## 真正杀死你的不是 bug,是那个还活着的进程

脚本写好了。clean.sh。
先执行ps -ef命令,再通过该命令的输出结果执行grep java命令,接着以上一个命令的输出结果为基础执行grep -v grep命令,随后取上一个命令输出结果中第二列的数据,最后根据这些数据执行xargs kill -15命令。

你对着这行命令思索了三秒钟,为何要使用grep -v grep呢?这是由于倘若不添加它,grep自身也会被视作java进程而被终止。
是的,工具有时会把自己当成敌人。
你执行了。没反应。再加个 -9。好了,进程死了。
接着呀,你去运行 nohup java -jar ,随后呢,将输出引导重新定向至 log.out。

将浏览器打开,192.168.40.97这个地址中的8088端口,出现转圈的情况,出现转圈的情况,又出现转圈的情况。
你去看 log.out,只看到一行:

Web服务器启动了,其处于端口8088上。
它活了。你也活了。
## 一套“简单”的自动化部署
什么是简单?
那里有三台服务器,其中一台在运行着 Git,另外一台在运行着 Jenkins,还有一台在运行着你所说的那个总是沉睡不醒的 Spring Boot。

这并非单纯的简易,这乃是“简约”,将全部的繁杂都化简为日常的痛楚,就如同牙髓炎那般,构不成致命威胁,然而却会时不时地疼上一回,以此来提示你它依旧存在着。
我们谋求自动化,谋求到最终发觉最为自动的环节是:每一回都依靠手动去清理进程,每一回都凭借手动去删除 /target,每一回都经由手动去输入那个以 glpat- 起始的 token。

## 脚本写完了,猫不叫了
凌晨四点。
我把那个 clean.sh 加到 Pre Steps。

保存。
运行。

#14 构建。
控制台输出最后一行:

Finished: SUCCESS
我打开浏览器。
192.168.40.97:8088
[root@jenkins98 target]# java -jar jenkins-study-0.0.1-SNAPSHOT.jar
欢迎页。Hello World。
我突然不知道应该笑还是应该关掉终端去睡觉。
## 结不结束,它都在那里
其实这篇文章写到这里已经 1100 字了。
但我觉得什么都没说清楚。

是我没表述清晰,你头一回配通Git凭证之际,险些将PAT明文写到博客当中。
我未曾表述清晰,在你使用 mvn clean package 之后,target 目录当中放置着那个体积为 50MB 的 jar,你凝视着它,仿若凝视着自己刚刚诞生的婴孩。
我也没说清楚你删掉 nohup 进程时那种快感。
算了。
自动化的部署便是这般模样——你清清楚楚地撰写了一百行的配置内容,可到头来却发觉最具可靠性的竟然仍是那一行:

尝试终止myapp进程,先通过jps命令查找包含“myapp”的那一项,再提取该项每行第一个字段,最后给于该项进程类似强制终止的操作。
管你什么 Git 什么 Maven 什么 SSH 插件。
这个世界太复杂,我只想要端口不被占用。


Comments NOTHING