🙊整活向:定期给老板推送同事的代码量

简介: 总有领导想把公司往倒闭里整。但是每天推送每个人的代码量倒是挺有趣的,git log本身就自带这个功能,不来看看吗?

嗨,大家好!这里是道长王jj~ 🎩🧙‍♂️

不得不说几天前的阿里和腾讯大规模“毕业”的消息多少给大部分资产阶级老板来了一剂强心剂。

特别是前几天我公司来了一位面试者,大概30岁出头,简历显示7年工作经验,会前端、会后端、会数据库、会架构啥都会,愿意同比上家降薪20%入职。

还得是打工人专门为难打工人👍👍

领导面完之后估计直接就飘了,想接收更多的“高质量毕业生 (牛马) ”,29号晚上找我开了所谓的“研发效能提升研讨会”,想把代码量列入年度考核指标,让我在技术方面给效能组提供支持。

哦吼!这不就来活儿了嘛。这好消息一定要跟大家分享一下。

image.png

📌现实是“代码量”绝不能是评判程序员好坏的标准

说到评估前端程序员的效能,我发现不论哪个领导层都会简单地使用代码量作为一种衡量标准。

甚至还想写进年度考核指标

然而,这就像用炒菜的速度🍜👨‍🍳来评估一个厨师的能力一样,显然非常不对劲。

我们会更喜欢一个用心烹制美食,让你大快朵颐的厨师,而不是只知道快速炒菜,却让你吃得满口油腻的厨师。

在编程中,也是一样的。一个优秀的程序员,是代码界的艺术家🎨👨‍💻,作品的价值不是用料多少而去评判的。

❓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 我们不是专业的呀,怎么办?😢

那我们对功能先进行拆分一下看看。

  1. 尝试查询仓库中所有的作者的编码行数。
  2. 需要可以指定范围进行查询。
  3. 可以设置变量,自定义查询N天前到今天的代码量。
  4. 使用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传进去

如果一切顺利,你可能会看到类似的以下内容啦!(我这里用的是英文)🎇

image.png

🚶🏻‍♂️使用 Github Actions 完成消息推送

脚本完成之后我们就又可以使用我们的老朋友 Github Actions 帮助我们进行定时调度了。

  1. 首先,我们需要在自己的 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
  1. 创建一个 test.sh 脚本,将上文中已经写好的shell脚本放在仓库的根目录下🏴‍☠️。
  2. 在你的 GitHub 仓库中设置一个新的secret,名字叫做 SERVER_KEY,然后把你需要的值填入这个secret🔐。

此后每天早晨,领导们就会准时收到一份准确的代码量数据报告。

这份报告为他授予“毕业证书”的行为,提供所谓的数据支持

他甚是感动,第二天就以“破坏团队内部团结”,给你发了第一份“毕业证书”。

🤣后记

使用外交手段永远是人类文明的最优解。

image.png

本脚本仅属于技术研讨和整活向应用,请千万不要在工作环境中部署使用。

如果执意执行,可能会面临以下后果:

  1. 公司业务代码开始出现严重缺陷,甚至可能出现数据库意外损坏等等问题
  2. “中途退学”率飙升,其中不乏贵司支柱
  3. 入选年度企业红黑榜

等等未知问题。

🎉 希望本次整活儿能够帮助你练习使用shell脚本和Github Actions, 并能从中感受到玩代码的乐趣。如果你有任何疑问或者想进一步讨论相关话题,请随时告诉我。🚀✨

目录
相关文章
|
3月前
|
程序员
面试高频题:开发人员说不是bug,测试如何答复?
面试高频题:开发人员说不是bug,测试如何答复?
|
6月前
|
存储 运维 监控
语雀故障与反思,随便再领半年会员!
语雀故障与反思,随便再领半年会员!
330 0
|
10月前
|
JavaScript 小程序 Shell
🤒如果老板搞代码量统计,打工人如何自救?
“一个下午做出一个微信小程序”,“一个下午搞定业务方案”,每天写1000行代码的成绩,大家你们真的做得到吗?
187 0
🤒如果老板搞代码量统计,打工人如何自救?
|
缓存 运维 前端开发
深聊性能测试,从入门到放弃之:通过这几点获取性能需求,BOSS再也不担心用户投诉了。
深聊性能测试,从入门到放弃之:通过这几点获取性能需求,BOSS再也不担心用户投诉了。
177 0
|
开发框架 Java 测试技术
【测试基础】五、这样提bug单,开发小哥还会怼你么?
【测试基础】五、这样提bug单,开发小哥还会怼你么?
【测试基础】五、这样提bug单,开发小哥还会怼你么?
|
存储 Java 程序员
BeanDifinition(加几行代码,可以产出让队友几天也找不出的Bug)
前言 文本已收录至我的GitHub仓库,欢迎Star:github.com/bin39232820… 种一棵树最好的时间是十年前,其次是现在
97 0
|
Ubuntu Linux 数据安全/隐私保护
同事的一个动作,让我熬夜的工作全部白费…….
xtrlock 工具在大多数 Linux 发行版软件库里,我们可以直接使用对应的发行版的包管理器来安装它。 在 Debian,Ubuntu,Linux Mint上可直接使用 apt-get 命令安装
288 0
同事的一个动作,让我熬夜的工作全部白费…….
|
JavaScript 数据库
一个查询功能居然被你玩出了花!(二)
上次是表单控件,这次是查询控件,不要弄混了哦。
一个查询功能居然被你玩出了花!(二)
|
JSON API 数据格式
一个查询功能居然被你玩出了花!(四)
上次是表单控件,这次是查询控件,不要弄混了哦。
一个查询功能居然被你玩出了花!(四)
|
JSON 数据库 数据格式
一个查询功能居然被你玩出了花!(一)
上次是表单控件,这次是查询控件,不要弄混了哦。
一个查询功能居然被你玩出了花!(一)