嗨,大家好!这里是道长王jj
~ 🎩🧙♂️
不得不说几天前的阿里和腾讯大规模“毕业”的消息多少给大部分资产阶级老板来了一剂强心剂。
特别是前几天我公司来了一位面试者,大概30岁出头,简历显示7年工作经验,会前端、会后端、会数据库、会架构啥都会,愿意同比上家降薪20%入职。
还得是打工人专门为难打工人👍👍
领导面完之后估计直接就飘了,想接收更多的“高质量毕业生 (牛马) ”,29号晚上找我开了所谓的“研发效能提升研讨会”,想把代码量列入年度考核指标,让我在技术方面给效能组提供支持。
哦吼!这不就来活儿了嘛。这好消息一定要跟大家分享一下。
📌现实是“代码量”绝不能是评判程序员好坏的标准
说到评估前端程序员的效能,我发现不论哪个领导层都会简单地使用代码量作为一种衡量标准。
甚至还想写进年度考核指标。
然而,这就像用炒菜的速度🍜👨🍳来评估一个厨师的能力一样,显然非常不对劲。
我们会更喜欢一个用心烹制美食,让你大快朵颐的厨师,而不是只知道快速炒菜,却让你吃得满口油腻的厨师。
在编程中,也是一样的。一个优秀的程序员,是代码界的艺术家🎨👨💻,作品的价值不是用料多少而去评判的。
❓git有这类命令提供“代码量”数据吗?
想要解决问题,那就必须了解敌人的武器是什么。
在 Git 中,使用 git log
命令可以查看提交的历史记录,包括提交的作者、提交的时间、提交的信息等。
而就是这个我们常用的命令中,有个参数--numstat
提供了这么一个侦探🕵️♂️服务。它深入每一个代码提交的现场,不仅要看看哪些文件被改动了,还要看看这些文件具体增加了多少行代码,减少了多少行代码。
假设你在一次提交中增加了一些内容,又删除了一些不需要的东西。它就能真实捕获到这类数据。
例如,当你使用这个命令:
git log --numstat
你会得到类似于这样的输出
commit a8d4766443f6d1286d61823b2b2a1088649ed075
Author: Author Name <author@example.com>
Date: Tue May 30 17:12:14 2023 +0200
This is a commit message
5 0 src/file1.txt
2 1 src/file2.txt
哦吼,找到了核心代码那就很好解决了。我们只需要使用shell脚本提取每一行的第1列和第2列的内容即可。
第1列 5
代表了file1.txt
增加的行数🚀
第2列 0
代表了file1.txt
删减的行数🔎
然后我们只需要继续寻找git log
命令其他能给我们关键数据的入参就可以了。我都帮你们找到了!
--author="xxx" # 作者
--since="2023-02-03" --until="2023-02-05" # 指定时间范围
--pretty=tformat: --numstat #设定输出范围,只输出代码行数统计
所以,这个脚本的关键代码我们已经梳理出来了:
# 获取xxx在2023-02-03 到 2023-02-05 内的提交记录,包括每次提交的代码行数统计。
git log --author="xxx" --since="2023-02-03" --until="2023-02-05" --pretty=tformat: --numstat
然后我们再使用shell脚本中的管道符,对 $1` 和 `$2
(也就是我们说的刚刚说的第1列第2列)进行求和,然后输出赋值即可。
💭如果真的想要应用,代码层面上可以怎么做?
每一个 coder
一定都对这个世界充满着非常强的好奇心,可是写 shell
我们不是专业的呀,怎么办?😢
那我们对功能先进行拆分一下看看。
- 尝试查询仓库中所有的作者的编码行数。
- 需要可以指定范围进行查询。
- 可以设置变量,自定义查询N天前到今天的代码量。
- 使用server酱进行推送。
那整个需求,已经很明了。
针对这些功能点,那就一边学习 (百度) ,一边写吧!直接上代码!GO!🚩
#!/bin/bash
# ************************************************
# 计算起始时间和结束时间
# ************************************************
# days: 表示统计的时间范围,这里设置为360天
# start_time & end_time: 表示统计的起始时间和结束时间
# start_time: 当前日期往前推 days 天
# end_time: 当前日期
# SERVER_KEY: server酱的私人key,使用外部传参传入使用
# ************************************************
days=360
start_time={
mathJaxContainer[1]}days days" +%Y-%m-%d)
end_time=$(date +%Y-%m-%d)
SERVER_KEY=$1
# ************************************************
# 初始化输出文件和消息标题
# ************************************************
# output_file: 输出结果保存的文件路径
# title: 变量表示消息的标题
# ************************************************
# 这里肯定有很多前端的小伙伴很迷茫,干嘛要创建一个临时文件?
# 我的理解是因为后面要用到`while`循环使用【子进程】去遍历每个作者的代码总行
# 但是【子进程】里的变量,在主进程是获取不到的,所以需要使用文件做中间存储
# ************************************************
output_file="/tmp/code_lines_output.txt"
title="团队编码统计"
# ************************************************
# 清空输出文件,确保每次运行脚本之前输出文件是空的。
# ************************************************
> "$output_file"
# ************************************************
# 使用Git命令获取在指定时间范围内提交过代码的作者列表
# ************************************************
# git log: 用于获取Git提交历史记录
# -format='%an': 指定输出每个提交的作者名字
# '%an': 代表作者名字
# -since="{
mathJaxContainer[2]}end_time": 指定时间范围
# sort -u: 对作者列表进行排序并去重。
# while read -r author; do 使用 `while` 循环遍历每个作者。
# ************************************************
git log --format='%an' --since="{
mathJaxContainer[3]}end_time" | sort -u | while read -r author; do
# 【核心代码】:获取作者在指定时间范围内提交的代码行数,使用 awk 命令计算每次提交的新增行数和删除行数之和,并累加得到总行数
num_lines=$(git log --author="$author" --since="$start_time" --until="$end_time" --pretty=tformat: --numstat | awk 'NF {sum += $1 + $2} END {print sum}')
# 检查 $num_lines 是否为空,如果为空则设置为 0
if [[ -z $num_lines ]]; then
num_lines=0
fi
# 将每个作者的信息追加到输出文件中
echo "$author : 在最近 $days 天中提交了 **$num_lines** 行代码! " >> "$output_file"
echo " " >> "$output_file"
done
# ************************************************
# 读取输出文件内容并构建消息内容
# ************************************************
message={
mathJaxContainer[9]}output_file")
# ************************************************
# 兼容中文,如果只发英文可以不要这段。
# ************************************************
# shell脚本对中文支持极差
# 这里用到了python库对中文字符进行编码
# 所以如果你的电脑没有python这里是运行不了的
# ************************************************
title_encoded=$(python -c "import urllib.parse; print(urllib.parse.quote('''$title'''))")
message_encoded={
mathJaxContainer[11]}message'''))")
# ************************************************
# 使用 POST 请求发送消息内容给 Server酱
# ************************************************
url="https://sctapi.ftqq.com/YOU_KEY.send"
curl -s -X POST -H 'Content-Type: application/x-www-form-urlencoded' -d "title=$title_encoded" -d "desp=$message_encoded" "$url"
# ************************************************
# 删除输出文件,保护文件系统不冗余
# ************************************************
rm "$output_file"
当你写完以上内容,就可以试试看能不能运行了
chmod +x ./test.sh # 如果没有运行权限,就运行这个命令
./test.sh xxxssdasdar2rfv3 # 把你的server酱的key传进去
如果一切顺利,你可能会看到类似的以下内容啦!(我这里用的是英文)🎇
🚶🏻♂️使用 Github Actions
完成消息推送
脚本完成之后我们就又可以使用我们的老朋友 Github Actions
帮助我们进行定时调度了。
- 首先,我们需要在自己的
github
仓库里创建一个叫做.github/workflows/run-shell-script.yml
的文件,然后把以下代码配置复制到这个文件中。
如果你用
gitlab
去找相应教程吧哈哈📬
name: Run Shell Script
on:
workflow_dispatch:
schedule:
- cron: "0 0 * * *" # 每天的 00:00 触发, 实际会8点左右触发,因为是UTC时间
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v2
- name: Set up variables
env:
SERVER_KEY: ${
{ secrets.SERVER_KEY }}
run: |
echo "SERVER_KEY={
mathJaxContainer[13]}GITHUB_ENV
- name: Run Shell Script
run: |
chmod +x ./test.sh
./test.sh $SERVER_KEY
- 创建一个
test.sh
脚本,将上文中已经写好的shell脚本放在仓库的根目录下🏴☠️。 - 在你的
GitHub
仓库中设置一个新的secret,名字叫做SERVER_KEY
,然后把你需要的值填入这个secret🔐。
此后每天早晨,领导们就会准时收到一份准确的代码量数据报告。
这份报告为他授予“毕业证书”的行为,提供所谓的数据支持。
他甚是感动,第二天就以“破坏团队内部团结”,给你发了第一份“毕业证书”。
🤣后记
使用外交手段永远是人类文明的最优解。
本脚本仅属于技术研讨和整活向应用,请千万不要在工作环境中部署使用。
如果执意执行,可能会面临以下后果:
- 公司业务代码开始出现严重缺陷,甚至可能出现数据库意外损坏等等问题
- “中途退学”率飙升,其中不乏贵司支柱
- 入选年度企业红黑榜
等等未知问题。
🎉 希望本次整活儿能够帮助你练习使用shell
脚本和Github Actions
, 并能从中感受到玩代码的乐趣。如果你有任何疑问或者想进一步讨论相关话题,请随时告诉我。🚀✨