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

简介: 总有领导想把公司往倒闭里整。但是每天推送每个人的代码量倒是挺有趣的,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, 并能从中感受到玩代码的乐趣。如果你有任何疑问或者想进一步讨论相关话题,请随时告诉我。🚀✨

目录
相关文章
|
7月前
|
测试技术 程序员 项目管理
甲方怒喷半小时:一次项目上线失败的深刻教训
小米分享了一次项目上线失败的经历,起因是运营提出一个看似简单的白名单功能。问题包括:没有需求原型导致理解偏差,新成员对项目不熟悉,测试流程不全面,以及人员变动大。解决方案涉及需求确认会、原型图设计、交接制度、团队培训和全流程测试等。这次失败提供了关于需求分析、项目管理及团队协作的教训。
62 2
|
存储 运维 监控
语雀故障与反思,随便再领半年会员!
语雀故障与反思,随便再领半年会员!
390 0
|
Java 程序员 开发者
太卷了!这份Java性能调优手册仅上线1小时,竟被恶意封杀下架
在各大厂的面试中,性能优化的问题肯定不会缺席,这足以说明其重要性。今天给大家带来的便是由资深程序员葛一鸣老师写的《Java程序性能优化实战》,同样是没有开源版本,我会将领取方式放在文末 Java程序性能优化实战 我看过几篇讲解Java程序性能优化的图书,要么是内容不够深入,要么是过于晦涩难懂,不够浅显,而这本书却让我眼前一亮,很多困扰我的问题都能在书中找到答案。它涵盖了各种程序员所需的性能优化知识点,是Java开发者提升水平的必读佳作 来看看目录内容,里面一定有你想看的 亮个相吧(狗头.jpg) 想要更进一步的Java开发者一定不能
92 0
|
前端开发 程序员
几个前端人员不能错过的网站
今天给大家分享几个前端人员不能错过的技术网站,可以帮助大家在学习和工作的过程中更好的解决问题。这些网站也都是我平时经常用的,在上面可以学习交流甚至写代码,很是方便。
几个前端人员不能错过的网站
|
NoSQL JavaScript 前端开发
P0级事故,项目组慌的一批! 上
P0级事故,项目组慌的一批! 上
|
消息中间件 NoSQL JavaScript
P0级事故,项目组慌的一批! 下
P0级事故,项目组慌的一批! 下
|
小程序
小李,提前约一下会议室和建日程并思考一下想要沟通的事情!
小李,提前约一下会议室和建日程并思考一下想要沟通的事情!
|
开发框架 Java 测试技术
【测试基础】五、这样提bug单,开发小哥还会怼你么?
【测试基础】五、这样提bug单,开发小哥还会怼你么?
【测试基础】五、这样提bug单,开发小哥还会怼你么?
|
消息中间件 分布式计算 监控
RabbitMQ 线上事故!慌的一批,脑袋一片空白
1.什么是kafka Kafka是分布式发布-订阅消息系统,它最初是由LinkedIn公司开发的,之后成为Apache项目的一部分,Kafka是一个分布式,可划分的,冗余备份的持久性的日志服务,它主要用于处理流式数据。 2.为什么要使用 kafka,为什么要使用消息队列 缓冲和削峰: 上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。 解耦和扩展性: 项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据
RabbitMQ 线上事故!慌的一批,脑袋一片空白

相关实验场景

更多
下一篇
DataWorks