使用GitHub操作做蠢事

2020-07-26 04:42:04

分类:标签:TL;DR:DevOps不一定只是工作而不是娱乐。我做了5个愚蠢的(但很有趣!)。GiHub操作…。有何不可呢?

这些操作的完整代码都可以在这个GitHub资源库中找到。我鼓励您用您自己不切实际的行动来分叉和/或添加问题/公关!

我还在YouTube上录制了一段关于这个项目的视频。←如果您对这类东西感兴趣,请查看视频并订阅🙏。

GitHub Actions是GitHub内置的CI/CD平台。它可用于自动化构建、测试和部署代码等工作,并可由任何GitHub事件触发。

还有一个市场,开发人员可以在这里发布他们的操作供其他人使用。

虽然我使用过许多CI/CD系统,包括Jenkins、Google Cloud Build和CircleCI,但在此项目之前,我没有研究过GitHub操作,所以我想我应该尝试一下,并在此过程中获得一些乐趣。

从第一个操作开始,我利用可以按cron计划触发操作这一事实来创建以下10行操作:

名称:假日-提醒-新年快乐-新年开始:日程安排:-cron:';0 0 1 1*';作业:快乐-新年:运行:Ubuntu-最新步骤:-名称:抛出错误运行:退出1

该操作将在元旦午夜运行,每次都会因为退出代码非零而失败。这将导致gihub给我发送一封电子邮件,祝我新年快乐🎉🎉🎉。

下一个想法是由一位朋友和以前的同事(https://scotchka.github.io/).)提出的。他建议我做一个自己触发的动作,这样就创造了一个无限的动作链。

鉴于GitHub文档明确声明“为了最小化GitHub操作的使用成本,请确保您不会创建递归或意外的工作流运行,这似乎是一个非常愚蠢的想法。为了实现这一点,我创建了一个由提交触发的操作,该操作进行并提交自己的代码更改。

GitHub通过不触发基于与默认GitHub_Token关联的事件的操作来帮助防止用户意外执行此操作。为了解决这个问题,我创建了个人访问令牌。有关如何使用它,请参阅操作YAML文件。

为了防止无限动作链,我在repo中的一个文件中保存了动作执行的计数,并在每次执行时递增。这允许我在达到指定限制时终止操作链。

COUNTER_FILE=./RECURSIVE/COUNTER.txtMAX_COUNT=5count=$(CAT";$COUNTER_FILE";)如果(($COUNT&>;$MAX_COUNT));则ECHO";计数过高...。正在退出,否则请数数...。继续";;ECHO$(($count+1))>;$count_file git config--全局用户.email";[电子邮件受保护]";git config--全局用户.name";sid";git add$counter_file git Commit-m";递增计数器文件";git推送FI;

前面的操作可能会无限期运行,但一次只执行一个实例,因此可以在必要时手动停止。如果相反,该操作自身触发了多次怎么办?这样,如果情况失控,指数增长的😰将无法阻止。听起来很傻,…。让我们开始吧!

以前的文件计数器技巧不再起作用,因为多个操作将并行执行,所有操作都试图同时修改和提交,从而导致冲突。相反,我将状态存储在Git标记中!

随机的UUID用作标签的基础,并附加当前迭代以防止冲突。目前的实现只支持个位数,但是如果我超过了9次指数增长的迭代,那就意味着我搞砸了💀。

函数INCREMENT_TAG_PUSH{uuid=$(Uuidgen)suffix=$(($count+1))tag=$1.$uuid.$suffix git tag-a$tag-m";新uuid tag";git推送原点$tag}count=";$(echo-n$giHub_ref|ail-c 1)";echo$GitHub_REFecho$countsleep 10#以防万一。数得太多了..。正在退出,否则请数数...。继续";;git config--全局用户。电子邮件&34;[电子邮件受保护]";git配置--全局用户.name&34;sid&34;for((i=1;i<;=$1;i++));执行增量标记推送$I完成FI;

如果您正在寻找一种快速烧毁2000免费层分钟的方法,请使用…。这绝对是要走的路!

到目前为止,这些操作都是在小型bash脚本中实现的。为了真正探索GitHub操作的功能,我决定下一个操作应该使用Docker。

我有两个VeSync的WiFi智能插头,这是我几年前收到的礼物,我为他们的API找到了一个Python客户端。这使得创建一个在每次提交后短时间内打开灯的操作变得很简单(还有什么更好的方式来激励代码速度呢?!💡)。

这段代码并不特别有趣,但是因为该操作使用的不仅仅是bash,所以它需要一个action.yml文件,在该文件中我们可以看到输入是如何传递到该操作的:

名称:';打开灯光';描述:';打开智能家居灯几秒钟';输入:VESYNC_PASS:描述:VESYNC_PASS所需的密码:TRUE运行:使用:';docker';image:';Dockerfile';env:VESYNC_PASS:${{inputs.VESYNC_PASS}}。

当团队开始有点精疲力竭,不得不不断地编写代码来保持灯光亮起时,我决定实现一个Tic-Tac-Toe游戏,让他们燃烧一些动力。诀窍是这个游戏的计算机玩家在一个动作中执行!

我想尝试一下Javascript运行时,所以我用Node构建了游戏,将棋盘状态保存在一个文本文件中。由于这个游戏的目的是了解动作,计算机的策略是随机的,但这还有一个额外的好处,那就是让人类获胜,提振士气🤔。

总体而言,GitHub操作被证明是相当容易使用的,并且选项Dockerize the action step确保它应该能够支持几乎任何CI/CD需求。此外,GitHub还通过Marketplace将动作的共享和重用作为体验的核心部分。

虽然我不会急于将现有的CI/CD工作负载移植到GitHub Actions上,但我肯定会考虑将其用于未来的新建项目!