利用Github Actions快速编译和定制RustDesk客户端详细教程
打开 RustDesk 客户端的 GitHub 开源项目页面,并点击右上角的 Fork 按钮,将代码 Fork 到自己的仓库。然后前往 Fork 后的仓库的 Settings 界面,新增 Actions 的密钥。添加两个密钥,分别为 RENDEZVOUS_SERVER(输入群晖的 DDNS 域名)和 RS_PUB_KEY(输入服务端映射 data 目录下 pub 文件的内容)。这些密钥会在后续编译过程中自动写入代码,确保客户端连接到正确的服务端。
接下来,前往 Actions 选项卡,选择 Flutter Tag Build workflow,点击 Run workflow,选择最新的版本并运行。整个编译过程可能需要一小时左右,完成后,你可以在 Releases 界面下载编译好的客户端。安装完成后,打开客户端即可使用,配置好的服务端信息已经内置,无需手动输入。
在 MacOS 系统上可能会遇到编译的 dmg 程序无法打开的问题。这通常是由于缺少苹果开发者证书导致的。解决办法是重新为安装后的应用进行签名,打开终端,执行如下命令即可:
sh
sudo spctl --master-disable
sudo codesign --force --deep --sign - /path/to/your/RustDesk.app
sudo spctl --master-enable
这样做可以确保应用在 MacOS 上正常运行。
这种方法不仅省去了在本地复杂环境配置的麻烦,而且利用了 GitHub Actions 的高效性,加快了编译速度。此外,利用 Github Actions 的 CI/CD 功能,可以定期自动编译最新版本的客户端,对应于一些新的功能或 bug 修复也能更快地反映到自己构建的客户端中。
然而,虽然 Github Actions 提供了很多便利,但在实际团队开发中,仍然有一些需要注意的地方。例如,有开发者反映在 monorepo 架构下,某些必要检查无法通过导致无法合并拉取请求。此外,Github Actions 在本地开发支持较弱,本地调试和验证工作流方面也存在不足。尽管如此,对于个人和小团队,Github Actions 仍然是一个不错的工具选择。
总结下来,利用 Github Actions 编译 RustDesk 客户端不仅效率高、步骤简单,而且可以很好地保障数据安全。在操作过程中需要注意密钥的配置和可能存在的系统兼容性问题。如果实际需求更高,可以考虑自建中继服务器和使用 Docker 进行部署,这样不仅提高了连接速度,还能进一步增强私密性和安全性。
使用官方客户端首次都需要配置服务器地址和密钥,对家人来说非常不友好,不利于分享,还可能暴露服务器信息和密钥,存在安全隐患。
所以这次我们根据 RustDesk 开源项目构建属于自己的客户端软件,把服务端信息直接写入客户端,做到开箱即用!
PS:如果没有搭建过 RustDesk 服务端的小伙伴可以先看前面一篇文章完成服务端的搭建。
客户端
在浏览器中打开客户端的开源项目地址。(客户端和服务端是不同的两个项目,不要搞混了)
根据文档可以发现 RustDesk 提供了多重编译客户端的方式,比如 Linux、Docker,这些编译方式在编译速度上可能较快,但是操作起来十分复杂。
一般大型开源项目都会提供基于 Github Actions 的 workflows 脚本,利用这些脚本我们可以直接在 利用 Github 的服务器直接编译写好的代码,这样无需在本地配置复杂的编译环境,省时省力。
所以下面直接演示利用 Github Actions 编译 RustDesk 客户端。
Github 编译
🔻 打开客户端地址,并点击右上角的Fork按钮。
🔻 把代码Fork到自己的仓库。(去掉仅copy the master 分支,可以克隆所有分支代码)
🔻 Fork完毕后的样子。
🔻 点击右上角的 Settings 进入到设置界面,新增 Actions 的密钥。
🔻 Name 输入RENDEZVOUS_SERVER
,Secret 输入我们群晖的DDNS域名。(不要加端口号)
🔻 再增加一个密钥。Name 输入RS_PUB_KEY
,Secret 输入服务端映射data目录下pub文件的内容。(具体可以看前一篇的说明)
🔻 这样就把客户端要连接的服务信息配置到了 Github Actions 的环境变量中,后面运行 Github Actions 脚本的时候就可以直接写入到代码中了。
🔻 接下来就运行 Actions。点击 Actions 选项,可以看到左侧有很多 workflows。
🔻 点击 Flutter Tag Build ,选择Run workflow,找到Tags下最新的版本。(也可以选择nightly)
🔻 最后点击绿色的Run workflow按钮就会自动进行编译。
🔻 稍等片刻,列表中就会出现一条记录,显示 workflow 正在运行。
🔻 我们可以点击记录进到详情页查看编译的状态。
整个编译过程大概需要一小时,借着这个时间,我们来简单了解下前面服务器的配置是如何写到代码中的。
🔻 点击 Flutter Tag Build 下面的链接可以查看 workflow 的源代码。
🔻 可以看到 flutter-tag.yml 调用了 flutter-build.yml 脚本。
🔻 从 flutter-build.yml 脚本中可以看到它读取了secrets.RS_PUB_KEY
、secrets.RENDEZVOUS_SERVER
等其他配置。这些带有secrets.
开头的都是引用的前面Settings下Actions选项中的secrets。
🔻 如果需要每天凌晨都进行客户端的编译,那么可以启用 Flutter Nightly Build 工作流。
🔻 workflow 运行完成后会自动把编译好的各个客户端发布到 Releases 界面。
🔻 在 Releases 界面下载并安装客户端后,打开首页可以发现状态直接显示为就绪。
🔻 打开设置,可以发现ID/中继服务器的配置为空。说明服务端信息已经被编译到了客户端。
后期如果想要控制其他设备,只需下载对应平台的客户端即可,再也不用单独给每个客户端配置服务器信息了。
后记
经过我多次在不同 MacOS 上的测试,发现在利用 Github Actions 编译的dmg程序在Mac上始终无法打开,排查后发现应该是 workflow 脚本中的证书导致的。
默认的 workflow 脚本中有关于苹果开发者证书相关配置,如果没有上传相关证书就会导致无法打开,所以我们在 Mac 上安装完客户端后,需要重新对APP进行签名。
签名的代码也非常简单,只需在终端执行如下命令即可。
codesign -s - --deep --force --timestamp=none /Applications/RustDesk.app