最近,我提到了我如何重构 我如何重构 com/nfrankel/nfrankel-update/”>该脚本使我的 GitHub 个人资料保持最新。自从 Geecon 布拉格之后,我也成为了 Raspberry Pi 的快乐拥有者:
虽然当前的设置运行完美,而且是免费的,但我想尝试一下自托管的运行器。这是我的发现。
上下文
GitHub 提供大量 GitHub Actions 的免费使用:
<块引用>
公共存储库中的标准 GitHub 托管运行器以及自托管运行器可以免费使用 GitHub Actions。对于私有存储库,每个 GitHub 帐户都会收到一定量的免费分钟数和存储空间,供 GitHub 托管的运行程序使用,具体取决于帐户的计划。超出所含金额的任何使用均受支出限额控制。
块引用>
然而,政策明天很容易改变。在以下情况下,免费套餐保单呈现出定期缩减的趋势:
- 足够多的用户使用该产品,锁定
- 股东希望获得更多收入
- 新任财务经理决定削减成本
- 全球经济萎缩
- 以上的组合
凡事有预谋。我喜欢在需要选择一个选项之前先尝试一下。举个例子:如果我需要迁移怎么办?
理论
GitHub Actions 包含两个组件:
- GitHub Actions 基础设施本身。
它托管作业调度程序。 - 运行者,负责运行工作
默认情况下,作业在 GitHub 的运行器上运行。但是,可以将作业配置为在其他运行器上运行,无论是在本地还是在云端:这些称为自托管运行器。
文档< /a> 关于如何创建自托管运行器提供了构建一个运行器所需的所有信息,因此我不会解释它。
不过,我注意到两个重要的问题。首先,如果您在不同的存储库中有作业,则需要为每个存储库设置一个作业。运行者组仅适用于组织存储库。由于我的大部分存储库都依赖于我的常规帐户,因此我无法使用组。因此,您必须在运行程序的 Pi 上复制每个存储库的包。
此外,没有专用的软件包:您必须解压存档。这意味着无法轻松升级运行程序版本。
话虽这么说,我预计迁移只有一行:
职位:
更新:
#runs-on: ubuntu-最新
运行:自托管
不过,这有点复杂。让我们详细说明一下我必须在存储库中执行哪些步骤才能使工作顺利进行。
实践
GitHub Actions 取决于运行器上安装的 Docker。正因为如此,我认为乔布斯是以一种专用的形象运行的:这完全是错误的。无论您在作业中编写什么脚本,都会在正在运行的系统上发生。举个例子,初始脚本安装了 Python 和 Poetry。
职位:
更新:
运行:ubuntu-latest
脚步:
- 名称:设置 Python 3.x
使用:actions/setup-python@v5
和:
python-版本:3.12
- 名称:立诗
使用:abatilo/actions-poetry@v2
和:
诗歌版本:1.7.1
在每次运行期间创建的临时容器的上下文中,这是有意义的;在稳定、长期运行的系统中,情况并非如此。
Raspberry 默认操作系统 Raspbian 已安装 Python 3.11。因此,我不得不降级Poetry中配置的版本。这没什么大不了的,因为我没有使用任何特定的 Python 3.12 功能。
[tool.poetry.dependencies]
python = "^3.11"
Raspbian 禁止在主环境中安装任何 Python 依赖项,这是一个非常合理的默认设置。为了安装 Poetry,我使用了常规的 APT 包管理器:
sudo apt-get install python-poetry
接下来是处理秘密。在 GitHub 上,您可以在 GUI 上设置机密,并通过环境变量在脚本中引用它们:
职位:
更新:
运行:ubuntu-latest
脚步:
- 名称:更新自述文件
运行:诗歌运行 python src/main.py --live
环境:
BLOG_REPO_TOKEN:${{ Secrets.BLOG_REPO_TOKEN }}
YOUTUBE_API_KEY:${{ Secrets.YOUTUBE_API_KEY }}
它允许隔离各个步骤,以便步骤只能访问它需要的环境变量。对于自托管运行器,您可以在文件夹内的现有 .env
文件中设置环境变量。
职位:
更新:
运行:ubuntu-latest
脚步:
- 名称:更新自述文件
运行:诗歌运行 python src/main.py --live
如果您想要更安全的设置,您就得靠自己了。
最后,该架构是基于拉动的模型。运行程序不断检查作业是否已安排。为了使运行程序成为服务,我们需要在运行程序文件夹中使用开箱即用的脚本:
sudo ./svc.sh install
sudo ./svc.sh start
该脚本在下面使用 systemd
。
结论
从 GitHub 运行器迁移到自托管运行器并不是什么大问题,但需要更改一些细节。最重要的是,您需要了解脚本在机器上运行。这意味着您需要在发生崩溃时自动配置新计算机。我正在考虑在 Pi 上的容器内运行运行器以回滚到之前的步骤的好处。我很高兴听到您是否找到并使用了这样的解决方案。无论如何,我暂时不会将更多作业迁移到自托管。