#2 | 居家隔离的新发现（高效做饭、实现多仓库分支管理自动化……）

宝子们，这里是 Bo2SS 的新系列，主要分享平时的一些思考，有生活中的，也有技术上的。相比之前的技术长文，这个系列整体的风格是比较轻快的。（友情提示：文末有多仓库分支管理脚本的示例，滑到最后，看看你是否需要？）

“该回家的回家，不要出来了。该回家的回家，不要出来了……”

周二早上 7:30，我被不停播放的喇叭声吵醒，我的第一反应是看眼小区群。

没错，喜提 “隔离大礼包” 了。

近日伙食

本来啊，都没想过自己工作日会有时间做饭，一般也就周末下下厨，犒劳一下自己。

但是隔离第一天，晚上视频家人的一句 “外卖多不卫生”，再加上当天点的外卖确实难吃，于是我决定从第二天起，亲自下厨。

先说说我体会到的自己下厨的好处，多了去了：

好吃（管够），有仪式感（幸福感的来源之一），让家人觉得我过得很好（事实如此）……

更重要的是，我还意外发现，在这个过程中，我可以在更高的维度上思考问题，不陷入细节。

本来做点家常便饭并不需要花费太多的脑力，所以大脑还留有一些思考的余地。

而且相比坐在电脑前，做饭时的大脑又少了各种无用信息的干扰，反而可以更加集中精力地思考问题的关键。

话说回来，其实我们在洗澡、上厕所时，也很容易获得灵感，这其中的道理是类似的。

正可谓 “有得必有失”，既然得到了这么多好处，我们肯定也要失去点什么？对，我们要多花些时间和精力。

但其实做上面的美食花不了多少时间。

这里我先对比一下自己做饭和点外卖的时间消耗数据：

| 自己做饭 | 点外卖 | 获胜方（时间更短者）
1. 选购 | 在美团买菜上选购两荤两素 | 在美团外卖上点餐 | 基本持平
2. 下楼取 | 一次就可以取完一天的 | 两餐要取两次 | 自己做饭
3. 制作 | 煮饭 + 炒菜 | 无需制作 | 点外卖
4. 收场 | 洗碗 | 几乎不需要 | 点外卖

看起来点外卖更胜一筹，但其实煮饭 + 炒菜的时间可以做到 “忽略不计”：

煮饭：借助Stretchly休息提醒工具，自己平时工作的节奏是，每半小时休息 20 秒，每 1 个半小时休息 4 分钟，所以在 4 分钟休息的时候就可以去提前煮饭。

炒菜：选择美团买菜里的象大厨或者农耕记快手菜，制作过程可以控制到 10～20 分钟。

快手菜里面给你准备好了洗干净的、切好的食材（如果不放心，可以自己再洗一遍），还有油和调料（如果不放心，可以用自己的油和调料，调料一般用生抽、盐代替就够了），另外还给你准备好了炒菜步骤指南，你只需要像拼乐高积木一样按部就班地动动铲子就可以了。

注意选择保质期是几天而不是几个月的，这样菜一般都是新鲜的。

再看看洗碗这个新增项目：

我可以选择在饭后或者 4 分钟休息时间来做，利用好碎片化时间。

有时候嫌油多，可以先给碗过过水，泡一泡，再洗。

另外，我还发现，洗碗时，手一前一后擦碗的动作，和健身中推（练胸）和拉（练背）的动作效果一致，所以洗碗还可以弥补一点我平日本该有的运动量（的确，据观察，自己的胸肌和背阔肌没有明显减弱的迹象🐶）。

除了时间消耗，刚刚还提到了要多花些精力，这是无法避免的，尤其是刚开始学炒菜。

但是正可谓 “有失必有得”，消耗了时间和精力，也总能换来另外的价值。

近日娱乐

吃着自己做的菜，再看看红军的历史，巴适得很。

最近在看的是高希希导演的这部《毛泽东》，我特别喜欢青年毛泽东演员侯京健的那股神气。

说说我很喜欢的几幕～

1）外出求学

一天，表兄文运昌到毛泽东家里来，告诉他可以去湘乡县立高等小学堂去读书，那里可以学到很多新知识。

毛泽东当时在父亲给找的粮行里当学徒，但是自己对做生意并不感兴趣，所以征求父亲的同意。

他的父亲其实只想毛泽东赶紧挣点钱养家，家里还有两个弟弟和一个妹妹，可没想过还要花钱供他去读书。

不过在毛泽东的极力劝说下，他的父亲最后还是勉强答应了。

于是毛泽东，走出故乡，并写下一首七绝诗 “孩儿立志出乡关，学不成名誓不还。埋骨何须桑梓地，人生无处不青山” 送给父亲。

17 岁的毛泽东虽然上的是小学一年级，但是他不懂就学，不懂就问，学得非常快。

2）开书店

当时毛泽东一行人为了传播新思想，开了一个书店（文化书社）。

但是书店的启动资金比较有限，财务提议除了卖一些文化相关的书，还可以卖一些畅销书、俗书，增加收入。

这个建议被毛泽东否决了，他认为开书店的目的是为了集结志同道合之人，把认同他们思想的人聚拢。而如果卖畅销书、俗书，那就不好分辨进来的读者了。

这一点对我写公众号也很有启发，我不希望去写一些博人眼球的内容，更希望在这里能慢慢地和大家分享自己的思考，结交一些趣味相投的人。

另外，毛泽东放在今天也一定是 “流量大咖”，当时这个书社开张他还请到了湖南省省长来剪彩。

3）毛泽东被排挤

毛泽东的 “农村包围城市” 战略和游击作战十六字方针（“敌进我退，敌驻我扰，敌疲我打，敌退我追”）屡试不爽，帮助红军打了好多胜仗。

但远在上海的党中央急于立功，认为红军有进攻大城市的实力，所以多次下达进攻大城市的命令。

中央的命令难违，但毛泽东知道红军目前的实力还不够，所以很多时候是做做样子。

不过毛泽东也因此背上了 “逃跑主义” 右倾分子的名号，不断被中央排挤。

直到第五次反围剿，中央派博古（比较年轻，没有什么实战经验）担任总书记，李德担任军事顾问（德国人，为了保密，起了个中文名），他们的 “碉堡对碉堡” 硬碰硬战略导致红军损失惨重。

在这之后，毛泽东又慢慢回归正位。

4）飞夺泸定桥

我在毕业后的川西之旅中，经过过泸定桥，底下的大渡河，听水流声都能让我背脊发凉。

而当时敌人为了防止红军过河，提前把板子都掀掉了，只剩下铁索。

红军为了渡河，是顶着对岸的机枪，一队人冲锋，踩着绳索吸引火力，一队人铺桥板子，一队人递板子，后面人再渡河。

据说当时在南京的蒋介石问手下，他们为什么不直接炸桥呢？手下回答他们根本没想到红军还会边铺板子、边前进。

蒋介石叹了口气，说道，“和毛泽东打仗，就不能以常规思路预判他们的行动”。不过后来他还是没料到红军会翻越雪山，从而让红军会师了。

看毛泽东打仗，总会让我想起诸葛亮（之前写过一篇聊三国的：历史 | 如果《三国演义》人物来应聘互联网，你会选谁呢？），看似差距悬殊的较量，他们总能顺势应变、绝处逢生，十分精彩。

另外，关于这部剧的视频资源，我更喜欢在西瓜视频上看，因为这里的弹幕超级多，看起来很有氛围。

时不时有人给你介绍一下出场的这个人的事迹。比如我看到国民党的薛岳，那当然是把他当作我们的敌人，但弹幕一说他是抗日名将，顿时又会心生敬畏🫡。

也有人会发表对某件事的不同看法，或者可能被忽略的背景……

而bilibili则相对清静，可能是上架较晚的缘故。

好啦，前面说的是生活中的一些体会，下面来聊点技术上的思考。

近日思考：多仓库分支管理自动化 V1.0

姑且叫它 V1.0 吧，因为除了现在做的自动创建分支能力，一定还可以延伸出很多能力，等需要时再迭代。

最终结果：自动给多个仓库创建分支🌲。

自动化前：分别去每个仓库，填写相关参数，点击按钮。

自动化后：~~ 分别去每个仓库，~~ 填写相关参数，点击按钮。

不知道你们有没有遇到这样的情况，每次产品到了一个新的阶段，需要给代码创建新的分支，比如用于测试。

如果是给一个仓库创建一个分支也还好，但我们组相关的仓库多达五六个，所以我们需要给每一个仓库做这样一个简单又枯燥的重复操作（创建分支），作为程序员，我不允许有这样的情况发生。

于是，我借助持续集成工具 Jenkins（方便他人使用）和 Shell 脚本语言，实现了上述过程的自动化。

现在我只需要 2 步就可以轻松完成上面的过程：

1）进入 Jenkins 项目，填写 2 个构建参数：当前版本、上一版本。

⚠️：

我们的分支名是基于版本名的；

我们会基于上个版本的 release 分支创建当前版本的 test 分支。

2）点击 Build 按钮，等待结果。

这里我用自己的两个 Github 仓库做了试验，相关日志如下：

✌️：日志清晰展示了操作的过程和结果。

⚠️：我们要操作的仓库是在 Configure > Source Code Management > Git > Repositories 里配置的。如果需要新增仓库，只需在配置里添加，无需修改脚本。

V1.0 的 Shell 脚本如下（里面有具体的说明）：

Copy
# 主流程
main() {
#1
set +ex # e：异常不退出；x：不显示执行的命令
declare -a success_list # 记录成功的仓库
declare -a failure_list # 记录失败的仓库
echo "========================⚙️已完成准备工作⚙️========================\n"

#2
echo "========================🆒正式开始🆒========================"
remote_hosts=`git remote`
echo "🌿要操作的仓库有：\n${remote_hosts}\n"

# ️遍历管理的远端仓库们，仓库在Source Code Management > Git > Repositories里添加
# ⚠️可以通过Advanced > Name配置仓库别名，方便检查日志
for remote_host in ${remote_hosts}; do
CreateAndPushTestBranch ${remote_host}
done

#3
echo "========================🌲输出结果🌲========================"
echo "✅成功的有：${success_list[*]}"
echo "❌失败的有：${failure_list[*]}"
echo "\n\n"
}

# 创建并推送test分支
# 入参1：远端仓库别名
CreateAndPushTestBranch() {
echo "========================💼开始操作仓库：$1💼========================"
target_host=$1 # 记录仓库别名

echo "1. 创建分支 git checkout -b"
# current_version、last_version是构建参数，在General中定义
git checkout -b test/${current_version} ${target_host}/release/${last_version}

echo "2. 推送分支 git push"
git push ${target_host} HEAD
if [ $? -eq 0 ]; then
success_list+="${target_host} "
result="成功✅"
else
failure_list+="${target_host} "
result="失败❌"
fi

echo "3. 清理分支 git branch -D"
git -c advice.detachedHead=false checkout ${target_host}/release/${last_version} # -c advice.detachedHead=false，临时屏蔽detachedHead警告
git branch -D test/${current_version}

echo "\n👉${target_host}仓库创建并推送test/${current_version}分支：${result}\n"
}

main; exit

尾声

保持思考，大胆实践，希望这篇文章对你有所帮助～

这里是 Bo2SS，对这个系列有什么建议，欢迎宝子们留言，咱们下周次见～