[Linux翻译]Linux版1Password的幕后花絮

849 阅读11分钟

原文地址:dteare.medium.com/behind-the-…

原文作者:dteare.medium.com/

发布时间:2021年5月18日-9分钟阅读

image.png

我们今天正式推出了1Password for Linux! 🎉

让这个版本更令人惊讶的是,它是从零开始,使用我们团队中大多数人从未使用过的新语言和技术开发的。

几乎所有你能想到的东西我们都以新的方式完成:从团队组织、编程语言和工具包、设计语言和流程,一直到新的部署和包装以及测试程序。事实上,为Linux版1Password做出贡献的团队中有一半以上的人在过去18个月内加入了我们的大家庭。

我想,通过对1Password for Linux是如何架构的,我们是如何爱上Rust的,以及强调我们的团队为使我们的新Linux应用成为现实所做的一些不可思议的事情的高层次概述,将会很有趣。

一个由Rust驱动的混合应用 🦀

1Password for Linux是我们的第一个混合应用。

后端是用Rust编写的,这是一种真正的系统编程语言,以其安全性和性能而闻名。Rust直接编译为本地代码,避免了与运行时或垃圾收集有关的开销。

在前端方面,我们使用网络技术,使我们能够为1Password创建一个全新的设计语言。它不仅看起来很棒,而且使我们能够非常敏捷地进行快速迭代。

在开发1Password.com的网页界面以及我们的浏览器扩展时,我们在TypeScriptReact方面取得了很大的成功,所以这些都是这里的自然选择。

为了将一切联系在一起,我们使用了Neon和一个自创的TypeShare工具,用于在FFI层的两边生成类型。最后,我们用Electron来捆绑一切,使我们能够与操作系统深度整合。

下面是一个关于一切如何配合的快速草图。

image.png

我们在Linux的1Password中使用的混合应用架构的概述

快速的记忆之旅

我们花了一些时间才意识到Rust是多么伟大,以及它是如何解决我们的许多问题的。为了了解我们是如何走到这一步的,我们首先需要回顾一下我们在过去15年里是如何开发应用程序的。

在我们构建混合应用的新方法出现之前,我们所有的应用都是在每个平台上用完全不同的后端编写的。虽然它们都连接到相同的 1Password.com 服务,但它们都是用自己的手写代码来实现的。 每个平台都负责同步、冲突解决、数据存储、为用户界面创建视图模型,以及你能想象到的其他一切。

这在今天这个存在Rust并已基本成熟的时代似乎令人惊讶,但这些应用程序是在15年的时间里开发出来的,那时还没有任何语言可以让我们用安全可靠的方式跨操作系统编写软件。

当然,当时有C和C++,但Roustem和我都不是C++的粉丝,即使我们是,想到要用一种不安全的语言来编写一个多平台的库,我们就吓得魂飞魄散。而在密码学的情况下,我们只是断然拒绝。

所以每个团队都使用了当时每个平台上最好的语言和库来编写。

正如你可以想象的那样,我们尽力在每个平台上保持功能一致(和错误一致!),但在如此多的代码基础上,要做到这一点是非常困难的。

我们都想找到一种方法,以一种安全和高性能的方式编写后端代码,并在我们支持的所有平台上共享。这是一个崇高而令人兴奋的努力,但如何做到呢?

我们是如何爱上Rust的 🥰

早在2017年,我们的Windows团队是第一个尝试使用Rust的人。他们很快就爱上了,并在2018年5月发布了1Password for Windows 7.0.558,其中使用Rust进行了大量的繁重工作。

Windows上的崩溃和错误报告数量迅速下降。

尽管这很好,但团队的其他成员花了更长时间才看到使用Rust的辉煌。当时,团队中的很多人都在使用Go lang来创建一个共享的后端,供1Password.Next(我们当时对1Password核心的代号)使用,他们已经看到了足够的成功,所以他们并不急于转换语言。

随着GopherJS编译成JavaScript,我们有了对Go的一切支持。至少在一段时间内是这样。

随着时间的推移,我们已经超越了GopherJS。当我们开始尝试使用WASM时,我们发现Rust编译到WASM的效果非常好,而且有一个坚实的工具链,我们必须要尝试一下。

所以我们在NSNorth 2019上开始了将大脑从Go移植到Rust的实验,然后在几周后在Roustem家举行的会议上,事情真正开始了。

很快,我们从不了解 Rust 到在浏览器中进行填充的原型,这标志着整个 1Password 开发的一个巨大转折点。

在这一点上,我们意识到我们的Windows团队一直在努力告诉我们的东西。Rust是真正的交易。它快速、安全,并且能够编译到包括WASM在内的所有平台。

从初级阶段到完整的Linux应用

为了确保我们对Rust的热情能够在现实世界中存活下来,我们制作了一个小型库,用于推导基于时间的一次性密码(TOTP),并将其用于我们所有的桌面和移动应用程序。我们还在我们的浏览器扩展中使用了新的WASM大脑。

结果是非常顺利的。除了推出的过程非常顺利之外,没有任何意外。

Rust已经证明了自己,所以现在是时候看看我们是否可以创建一个完整的1Password核心,供我们所有的应用程序使用。到秋天结束时,我们已经看到了足够多的内部成功,我们想找到一种方法,开始与我们的用户分享我们的进展。

Linux是一个完美的游乐场,所以在2019年底,在我家的一个会议上,我们开始创建一个Linux应用程序来集中精力。迪士尼刚刚首映了《曼陀罗》,所以这自然是我们选择的电影时间,曼陀项目就这样诞生了。🤩

这是一个有趣的概念验证,由于我们的大部分代码还没有使用Rust,它使用1Password CLI作为后端(当时还没有Secrets Automation)。

事情进展得很顺利,我们决定拉拢更多的团队,2020年1月,我们在Roustem的家里举行了一次更大规模的会议来建立它。一个月后,在我们的年度会议上,1Password for Linux的早期原型在Navigator of the Seas上向全公司演示。

image.png

从那以后,随着我们对Rust的使用越来越得心应手,事情持续升温,团队不断壮大。到2020年8月,我们软启动了我们的第一个开发预览版,然后在10月我们开启了测试版

今天,我们正式推出了1Password for Linux! 🎉

具有讽刺意味的是,我们现在又有了一个处理所有后台繁重工作的实现。这就像XKCD 927一样。值得庆幸的是,这只是暂时的,因为我们花了很大力气来创建一个通用的1Password核心,将来可以在每个平台上使用。

1Password核心的魅力😍

"根据信条,它在你的照顾下。这就是方法"--曼陀罗装甲师

我们发布 Linux 版本的主要目标之一是创建一个通用的核心,可用于与 1Password.com 进行交互,并在一个地方执行尽可能多的繁重工作。

我们希望每个客户都有一个单一的代码库,以使我们能够一次性开发并在一个地方修复错误。我们还希望以这样一种方式来架构事物,即这个共同的核心不能被错误地使用。

经过一些反复,我们决定核心基本上应该是一个没有用户界面的完整的客户端应用程序。如果你愿意的话,就是一个无头的客户端。核心将有它自己的运行时循环,它将处理作为1Password客户端的每一个方面,并为每个UI提供一个安全的、难以滥用的API来使用。

image.png

1Password 核心的更详细的图示,以及一些 Rust crates 是如何结合起来的。

这张图中有很多值得喜爱的地方。首先,核心部分是完全独立的,并且有一个明确定义的API供客户端应用程序使用。

op-app和op-uicrates将所有其他板块连接在一起,提供每个应用所需的一切。大部分状态被完全保留在内部,以确保密钥和其他秘密得到正确处理,同时也使每个客户端UI能够专注于他们的优势而不是业务逻辑。

每个平台都有自己的优势,所以foundationcrate使核心能够接触到特定平台的服务,如内核钥匙圈和生物识别。

我最喜欢的部分是构建验证测试。我们的BVT是用Rust编写的,通过直接使用API和视图模型来实现自动化测试。我们的GitLab CI在合并请求期间有运行这些测试的作业,为我们的QA团队减轻了很多负担。

由于我们可以根据需要启动许多无头客户端,我们能够测试并发场景或其他难以手动设置的情况。

我们的梦想是让整个运行时也能在WASM中运行,这样我们就可以取代我们的TypeScript实现。这应该是可能的,但事实证明是相当困难的,因为网络和WASM环境有很大的不同,所以现在我们只限于使用WASM的普通库。

总的来说,这种新的1Password Core方法非常成功。展望未来,我们将在明年推出的下一代 1Password 应用程序中使用它。🙌🏼

1Password for Linux的数字

如果没有一些数字,任何幕后开发者的帖子都是不完整的。因此,这里有一些关于 1Password for Linux 和我们开发过程的有趣数字。

  • 储存库的数量。1. 单词组ftw! 🤘🏽 嗯,不是每个人都庆祝这一点,但我个人喜欢它。 🙂
  • 文件统计。7,528个文件,总共1,038,929行,813,514行代码,161,095条评论
  • 开始日期:~18个月前的Linux;Rust的实验开始得更早
  • 第一次提到Linux的提交日期。2019年12月17日
  • 自12月17日以来的总提交量:40,575
  • 合并请求。7,365
  • 创建的问题。7,529(假设每一个问题都被修复和关闭😉)。
  • CI/CD:183,905条管道,1,741,045个作业(成功率65%)。
  • 创建一个应用程序需要多少个Node包管理器?3.5! 在开发过程中,我们从npmyarn再到yarn 2,然后再到pnpm。😂
  • 可用性测试。39次与新用户和老用户的1对1会议
  • 用户调查。3
  • 发布。12个开发预览版,包括109处改动,27个测试版,包括460处改动,83次尝试夜间构建,其中约50次成功发布。
  • 在设计方面,我们也做了很多实验,从Sketch到Zeplin到Abstract,然后是Figma。
  • 设计亮点。2,802个Figma组件,7名设计师为60多名开发人员、工程师和项目经理组成的团队提供支持。
  • 团队成员:这比你想象的要难计算,因为我们有许多开发以外的团队。我们的 #core Slack 频道有 143 人,自我们开始以来已经增加了一倍多。这是我们的Linux发布庆祝活动Zoom call的截图。

image.png

1Password 客户端应用程序团队。至少是那些参加Zoom call的人。 🙂

上面的每一个要点都值得写一篇自己的博文,希望有一天我们能把它变成现实。请在评论中告诉我你最喜欢哪个,并帮助鼓励写这些帖子。 🙂

我希望你喜欢这个幕后花絮,了解我们的开发过程,并喜欢我们1Password家族的最新成员。😘

image.png

为Linux用户铺设的红地毯的完成图示


通过www.DeepL.com/Translator(免费版)翻译