利用 Tailscale 将 GitHub Actions 工作流接入虚拟局域网
前言
前段时间整理了一下博客,把不太适合公开的笔记之类的独立出去,打算单独部署到本地方便自己看,这就有一个问题——怎么让 GitHub Actions 构建完上传到我本地的 PVE 中?
无论是自建 Runner 还是把本地的 SSH 端口暴露出去(没有公网 IP)都挺麻烦的,突发奇想能不能给 GitHub Actions 也组个虚拟局域网,搜了一下还真可以,Tailscale 官方就有提供 Tailscale GitHub Action,可以在工作流运行时创建一个临时节点来访问 Tailscale 的网络,最后工作流完成就会把临时节点自动移除,仿佛什么都没发生过。
准备工作
开始之前,我们需要了解一下 Tailscale 的访问控制规则,以前是 ACLs,现在新的叫 grants。
默认情况下,加入到 Tailscale 的节点都归属于你的账号,所有节点都可以互相访问。但是 Tailscale GitHub Action 创建的临时节点必须要添加标签,节点一旦添加了标签,就不再归属账号,也就无法和其他节点互相访问。
随着虚拟局域网中的设备越来越多、越来越杂,为了让整个网络更加的安全,最好是全部添加上标签,再配置合理的访问规则。
创建标签
在上面的导航栏中找到 “Access controls”,然后再点击左侧的 “Tags”,就能看到所有的标签。
点击右上角的 “Create tag” 来创建标签,我是比较简单的分成了 3 个标签,tag:home tag:vps tag:ci 分别对应的就是家庭设备、服务器和 GitHub Actions,标签的拥有者选自己账号。
最后返回节点列表,给每个节点选择对应的标签就好了。
警告
添加了标签之后,节点就不再归属你的账号了,也无法移除所有标签。
如果想要恢复成原来那样,必须在节点上重新验证加入 Tailscale。
配置 grants
所有的节点都添加上标签后,你可能发现节点间不能访问了,这是正常现象,我们只需要配置一下访问控制权限,现在的 grants 比较友好,可以直接可视化操作。下面是我的三条配置:
- 家庭设备可以访问所有设备
- 所有 VPS 之间可以互相访问
- VPS 与 GitHub Actions 可以访问
100.64.0.1这一台设备的所有端口
对于 Tailscale GitHub Action 而言,其实只需要添加以下这一条规则,让标签为 ci 的可以访问 100.64.0.1 的 22 端口,就可以实现 SCP 上传构建好的文件了。
信任凭证
Tailscale GitHub Action 肯定不能像其他设备一样手动打开 login.tailscale.com 授权登录,我们需要创建一个信任凭证,给予 auth_keys 权限,这样临时节点就可以通过 Auth keys 的方式加入进来了。
找到上方的 “Settings”,点击左侧的 “Trust credentials”
然后点击 “Credential”,选择 OAuth
这里只需要给 Auth Keys 的权限,标签选择 tag:ci
最后把 client_id 和 secret 都记录下来备用。
添加工作流
使用的时候,只需要在工作流中加上 tailscale/github-action@v4,就能直接使用 Tailscale 分配的 IP 来访问设备了。
jobs:
steps:
- name: Tailscale
uses: tailscale/github-action@v4
with:
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
tags: tag:ci
ping: ${{ secrets.HOST }}其中的 TS_OAUTH_CLIENT_ID 与 TS_OAUTH_SECRET 通过 Actions secrets 的方式添加进来
效果演示
查看构建日志,能看到 Tailscale is running and connected 就证明已经成功将 GitHub Actions 接入到 Tailscale 的虚拟局域网了!
提示
只有工作流运行期间可以在 Tailscale 的面板上看到这个临时节点,结束后会自动移除。









