写这篇文章的缘由来自看到了知乎上的一个问题——在 GitHub 上保持 365 天全绿是一种怎样的体验?
解释
大家可能有的不明白啥意思啊,这个绿指的是就是 GitHub 的 Contribution,如果你每天都提交代码到 GitHub,至少一次 commit,那么 GitHub 就会在你当天对应的 Contribution 格子上点上绿色,比如我的就是这样子:
因为我经常在 GitHub 上提交代码,所以我的 Contribution 页面就显示为绿色,commit 多的就深,少的就浅,灰色的就是当然没有任何代码提交的。
所以这个问题问的就是,每天都在 GitHub 上提交代码是什么体验,也就是 365 天每天一天不落地撸代码是什么体验?
然后有一个回答看得我笑出声:
曾经保持了200多天全绿,但是冷落了女朋友,一直绿到现在。
原回答如下:
这哥们真的是太秀了,秀到我实在忍不住给他默默点了个赞...
不过咱们还是言归正传啊,说回这个问题。
其实说实话真的保持 365 天全绿真的是一件很难的事情,每周都会有周末吧,周末得陪女朋友吧?什么,你没有女朋友,那忽略这一条。
那即使没有女朋友,一年不得有几天是过年过节的,还撸啥代码啊?即使不是逢年过节,那也总有几天状态不好或者生病的吧,强如铁人那坚持 365 天天撸代码也是够神的。
不过我还真见过几个,实打实的大神,比如 Taylor Otweel,PHP Laravel 框架的开发者,一年 8000 多次 commit,他的 Contribution 是这样的:
这个是真的强,而且人家撸的代码质量肯定也高啊,不像我们可能改了点 README 啥的。
但强如 Taylor Otweel,你也能看到有些天是没有贡献的,毕竟人家周末可能就真的不撸代码或者有其他的安排。
那怎么才能做到 365 天全绿呢?
既然人不行,那就靠机器人吧。
GitHub 不是这两年出了个 GitHub Actions 的功能吗?这就是 CI 嘛,借助于它,我们想做到 GitHub 365 天全绿,就轻而易举了。
到底怎么做?难不难。
不难,可能只需要两分钟就搞定了。
想不想知道怎么做的?想知道的接着往下看。
方案
这里介绍一个 GitHub 的库,地址为:https://github.com/justjavac/auto-green,借助它,咔咔几步就能搞定了。
先说步骤。
首先打开这个仓库,点 Use this template,注意千万不要点 Fork,不然是不生效的,如图所示:
点了之后就是提示你用这个 Template 创建一个自己的 Git 残酷,这时候就会让你填写的的仓库名称,比如我就创建了一个名字叫做 AutoGreen 的仓库,如图所示:
至此,已经成功了一半了。
现在你会观察到,在 Actions 这个选项卡自动执行了一个任务。啪!很快啊,执行完了:
执行完了你会发现这个仓库多了一次 commit,是来自 justjavac 的一次 commit:
点进去看看,commit 的信息还叫 "a commit a day keeps your girlfriend away",啥意思?
跟代码做好朋友,永远没有女朋友???Oh,No,不是这样的!
commit 如图所示:
神奇的是这次 commit 还没有任何 file change,还是个空的 commit。
行了,不管这么多了。
到现在就结束了吗?GitHub 以后就会天天绿了吗,当然不会绿啊,为啥啊?
扒一扒源码看一下,打开
.github/workflows/ci.yml
文件,结果如下:
代码:
name: ci
on:
push:
branches:
- master
schedule:
- cron: "0 0 * * *"
jobs:
autogreen:
runs-on: ubuntu-latest
steps:
- name: Clone repository
uses: actions/checkout@v2
- name: Auto green
run: |
git config --local user.email "[email protected]"
git config --local user.name "迷渡"
git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
git pull --rebase
git commit --allow-empty -m "a commit a day keeps your girlfriend away"
git push
复制代码
看看这个文件,意思就是每天执行一下下面的这几行代码,比如 git 的 config、commit、push 等,就相当于模拟了一次提交。
其中有几行代码比较有意思:
git remote set-url origin https://${{ github.actor }}:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}
复制代码
这里就是指定远程仓库等地址,这里有几个占位符,github 的 actor 和 repository 对象,其实这些我们不用管,在运行的时候会被自动赋值为当前仓库的信息,另外还有 GITHUB_TOKEN 也是在该任务运行的时候自动添加的。
另外还有一行代码:
git commit --allow-empty -m "a commit a day keeps your girlfriend away"
复制代码
这里的 commit 操作加上了一个
--allow-empty
选项,意思就是允许空的提交,这也就解释了上文空提交的缘由了。