CTO角与Yoav Landman, JFrog第一集:构建信息

想看看DevOps公司的CTO是什么样子的吗?加入JFrog的CTO Yoav Landman为我们新的CTO角落系列。每一集都会有一个技术专家最关注的话题,或者说应该是。Yoav将与其他行业领袖讨论科技领域的热门话题,让你有机会看到决策者的幕后。

左移现在被认为是发展的核心原则,而不是一种转移——安全是重要的。我们应该问自己的问题是,我们应该采用什么方法来保护我们的业务。对于Yoav,核心解决方案在Build Info或soms中找到。这种二进制元数据对于开发人员跟踪代码中的漏洞是非常宝贵的。我们将深入探讨为什么这很重要,以及为什么今天的大多数实现都是低保真度,但可以通过开源选项进行修复。

加入Yoav, Eyal Ben Moshe, JFrog生态系统开发经理和其他行业专家一起讨论保护代码的最佳实践。

更多的资源2022世界杯阿根廷预选赛赛程

转录:

考特尼金大家早上好,下午好,晚上好,我的名字是Courtney gold,我将简单介绍一下我们今天的CTO角系列。在我们开始之前,我想做几件家务事提醒一下,这是被记录的,所以我们会在post event后发送。如果你有任何问题,请不要犹豫,请在你下方的问答对话框中提问,但除此之外,我将把它交给我们出色的演讲者,我们今天的演讲者,非常感谢大家,感谢你们的加入。

莫兰德系:嗨。让我们自我介绍一下。大家好,很高兴来到这里,我的名字是Moran Ashkenazi,我是JFrog首席安全官兼安全工程副总裁。

Eyal Ben Moshe我是Eyal Ben Moshe,我在JFrog的研发部门负责系统工程。很高兴来到这里。

Yoav乡下人: Yoav Landman, JFrog的联合创始人和首席技术官,很高兴能和你一起举办这次网络研讨会。

莫兰德系听起来不错,所以让我们从头开始,真正的开始。什么是构建信息这一切是什么时候开始的?

Yoav乡下人今天我们要谈论的技术在我们的领域里几乎是古老的。所以,Build Info实际上是一项非常非常酷的技术,但它抢占了先机,早在2011年就该开始了。我们从Java中的实现开始,我们的想法是能够记录构建中的所有内容,包括创建的模块依赖关系,各种环境变量和属性等等。

最初的目标非常简单,它是为了拯救开发人员,即运行一个构建,手动查找所有依赖项并创建一个材料清单,他可以与我们进行法律诉讼。因为我们发现自己在做这件事,而客户们也在寻求解决方案。所以,我们为Java开发了这项技术,用Java实现。随着时间的推移,它经历了几次化身,我们在Go中重新实现了它,我们扩展了支持的技术。我们将展示一些示例和演示如何在Artifactory中集成它。

本质上,这是我们戏称的技术JFrog最好的非秘密因为它一直都是开放的,一直都是在开源许可下的,我们现在正在让它变得更平易近人,就像我们一会儿向你们展示的那样。这是Build Info。

莫兰德系2011年,好像是11年前的事了,太神奇了。构建信息模式是什么样子的?我能从中得到什么样的信息?属性呢?它包含什么样的属性?

Yoav乡下人我稍微提到了一点,但让我先分享一下我的屏幕。给你们看GitHub页面。

我们来看看图式。基本上它假设一个构建,然后有构建属性,环境变量也会在这里,你可以过滤掉秘密,有构建的名字,数字,类型,实际的构建代理。

莫兰德系:我能看到依赖项吗?

Yoav乡下人:是的,当然。让我们跳过这个部分,这样您就可以看到版本控制系统了。然后,这是真正有肉的东西,你有所有的模块和关于它们的所有属性,以及所有用校验和和所有依赖项创建的工件。我们将向你展示一些真实的例子。

作为依赖项的一部分,您还可以获得一个关于依赖项如何产生的列表,以及谁请求它作为依赖项。传递依赖性,您还可以构建实际的图形。让我快速向下滚动。

在这里你可以看到一些为Go生成的真实示例,包括所有的Go模块,它们的和以及所有创建该模块依赖项的模块。这是模块,这些是模块的依赖关系你可以看到它们是如何产生的。

莫兰德系:实际上,这是SBOM,软件物料清单。软件组件和依赖项的清单。我记得差不多一年前,美国政府发布了加强国家网络安全的行政命令。乔·拜登实际上提到过,他希望美国政府在2021年建立一个行业标准,以保护其免受供应链攻击。就在三周前,Log4j触及了我们在世界各地的每一位开发人员。我的问题是,作为开发人员,为什么它对我很重要,这个SBOM给了我什么,我为什么要使用它?

Yoav乡下人当然,这是一个很好的问题。

因此,作为开发人员,您希望能够知道构建中使用了哪些材料。从本质上讲,那些进入构建的材料,所有的第三方依赖项以及您创建并组装到最终产品中的每个包,您想知道它是如何产生的,您想知道构建时系统的状态是什么,并且您希望能够将其记录为接近现实的状态。它必须与建造时的条件相匹配。我待会再讲,但重建这些信息并不总是那么容易。

现在,当你有了这个工件,你可以把它看作一个二进制工件。这个与构建相关的SBOM有名字,有版本,有检查,这就是我们在Artifactory中管理它的方式。这是你可以签名的东西这是你可以用来证明出处的东西。如果你有多个构建,组成你的最终产品,你可以把这些构建信息捆绑在一起,即使它们来自不同的技术,这给了你,作为一个开发人员或安全人员,或者只是想回到过去,看看到底是什么进入了你的产品,它给了你这个这个证明。并且还允许您验证最终发行版中的内容实际上来自于那个版本。

莫兰德系所以责任,意识到依赖关系,甚至你从法律的角度知道你实际上拥有什么。

Yoav乡下人:对。这是一个非常非常基本的构建块,但是如果你把它组装起来,如果你我的意思是在JFrog产品中,我们在它上面增加价值,但你不必把它作为任何JFrog技术的一部分,它是一种开放的技术,你可以在这个起源证明中完全分离地构建这个来源,只需要把它附加到任何构建上。

莫兰德系:是的,我们很快就会在DEMO中看到它。谢谢。与其他试图从依赖项扫描创建SBOM的工具相比,为什么构建信息如此独特?

Yoav乡下人:是的,所以我们没有任何特定的格式,我的意思是构建信息只是一种格式。当它开始的时候,它是非常独特的,我的意思是,我不认为有人捕捉这种图形和这种关于构建的信息。但您也可以将构建信息导出为SPDX或CycloneDX和其他格式。它真正的独特之处在于,它试图捕获这些信息作为构建的一部分。这取决于技术,但如果你想一下,当你去任何账单时,你可以想到你只需要依赖声明,一个日志文件或POM xml或go模式,你可以从那个文件重建关于构建的信息。实际上不可能保证这个声明性文件和投标的实际结果之间是一对一的映射。为什么?因为有一种依赖性,在法案中总是会有一种动态性。这种动态性可以是版本范围,可以是环境变量或系统属性,它们会影响构建的运行方式。它甚至可以访问CI环境和生产环境中的开发人员环境之间可能不同的远程存储库。 And it can be even the tool that changed some logic, some algorithm in the conflict resolution for dependencies.

所以这是现实世界中正在发生的问题的一部分,这是动态的一部分。因此,你不能只看原点就能及时重建同一张钞票。同样,如果你试图重复它,如果你将有不同的支票臂,也许不同的依赖日期注入到你的账单中。因此,准确地捕捉所有这些信息是非常重要的。

莫兰德系哇,太棒了!Eyal,目前支持哪些技术?

Eyal Ben Moshe是的,所以我们努力支持每一项流行的技术。所以现在我们支持npm, Maven, Gradle, Docker, nuget, .net core, peep,我们还在不断扩展对其他包管理器的支持。

莫兰德系你对新技术有什么了解?

Eyal Ben Moshe是的,所以实际上每一种流行的技术都被优先考虑,我们正在为它添加Build Info支持。你知道,我们正在将技术集成到包管理器中,正如Yoav提到的,我们实际上是在捕捉构建过程中发生的所有事情。为了做到这一点,我们与这些包管理器紧密地集成在一起,我们需要确切地知道并记录他们正在做什么,他们正在下载什么以及周围发生的一切。

所以最终的目标肯定是支持一切。

莫兰德系真是太神奇了,它已经和我们在一起11年了。我的问题是有什么改变了,为什么又出现了,一直都是OSS,有什么新闻,有什么新消息?

Yoav乡下人首先,它开始于11年前,那是很长的一段时间了,但是它经历了许多版本,直到达到现在的成熟水平。而且它是经过战斗验证的,它在JFrog内部和许多JFrog客户中使用,以完全透明的方式获得所有构建的记录。

而且,总的来说,我们还有使用Build Info的JFrog CLI,它就像JFrog的瑞士军刀,用于集成CI服务器和集成我们所有产品的REST API。hth华体会最新官方网站我们这次所做的是我们决定让技术本身——构建信息的提取——更平易近人,贡献更明显。

所以我们所做的就是把所有的可提取文件,从JFrog CLI中取出来,作为一个完全独立的Go项目。我们开始运行,我们开始移动,我们在过程的中间我们开始移动所有技术的提取器到单独的go模块中,你可以通过直接调用它们来使用一个最小的工具,我们马上会展示,CLI也在使用,都是通过一个API。

这是一个很大的改变,就是让这些提取器可供任何人使用,从任何类型的构建和任何技术中导出这种格式。

莫兰德系:对社区的惊人支持。我们讲了CLI,我想我准备好了,让我们看看DEMO。

Eyal Ben Moshe当然,让我分享一下我的屏幕,给你看一个演示。是的,我相信你们现在可以看到我的屏幕,所以让我们。你现在看到的是我们创建的新网站,它描述了Build Info,基本上涉及了它周围的要点。

这是构建信息存储库。这就是我们提取的地方,正如Yoav提到的提取器逻辑,你可以直接下载CLI的二进制文件,我们马上就会看到它是如何使用的。

如果你愿意,你也可以把它用作图书馆。所以它是用Go写的。这里我们为你提供了实际的API你可以集成它,创建Build Info并使用它。

我来告诉你怎么做。在这里,我已经下载了Build Info CLI。现在我将向你们展示如何使用它。

例如,这是一个Maven项目。这实际上是Jenkins Artifactory插件项目,我要做的是为它创建一个Build Info我要运行bi,然后mvn。

实际上现在正在发生的是有一个构建在运行,有一个真实的构建因为构建信息记录了在构建过程中发生的所有事情然后构建完成了然后我们可以看到这里已经创建了真实的构建信息。

你可以看到现在我在里面,在文件的末尾,你看不到那个部分,但我告诉你这是依赖部分,你可以在这里看到,例如,依赖的概念。你可以看到类型和范围当然,我们还可以看到这个构建如何最终下载这些依赖项因为它是由这两个依赖项请求的。

为了让你们知道用这个工具创建构建信息有多简单,我也可以对Go做同样的事情,这是我们的JFrog CLI它是用Go写的我可以运行类似的bi然后Go然后它会创建我的代码。

是的,它很快,因为你知道,大多数依赖已经兑现了。

这里你可以看到它是完全相同的格式,在这种情况下它的思想是这些是Go的依赖关系和我们添加的其他东西,这很好。我们实际上是支持出口或将构建信息转换成CycloneDX SBOM格式,所以我可以添加- -格式,我可以选择xml或json这里你看到,你有它,相同的数据和SBOM格式,你看到的依赖关系,如果我们我们会看到其他数据,其他组件和我能做的,当然,同样的json格式的CycloneDX你去。

这是构建信息,这实际上是生成构建信息的实际代码的本质或核心。

我们也在自己的产品中使用Build Info。hth华体会最新官方网站正如Yoav提到的,Build Info一开始是我们需要的,Artifactory和我们的一些其他产品也在为x射线使用building。hth华体会最新官方网站

为了让你们知道我们在做什么,或者我们的产品在用Build Info做什么,这是Artifactory。hth华体会最新官方网站

莫兰德系:当你登录到JFrog平台并移动到Artifactory,这样你就能感受到它在UI中的样子

Eyal Ben Moshe:当然,我刚刚登录,然后在Artifactory下面,你有你的构建部分。这些是我们发布到JFrog平台的Artifactory实例上的所有构建,这里,为了演示,我创建了一个示例构建,你可以看到,有几个构建运行,我运行了三个构建运行如果我只进入其中一个构建运行,这里,你可以看到。

莫兰德系:格式相同。

Eyal Ben Moshe是的,这是Build Info json,正如你在这里看到的,所有的环境变量都被记录下来了,如果你向下滚动,你会看到这里的依赖关系,工件,如果这将发布工件和其他东西,然后你知道我们创建了一个UI,这是基于这些信息的,所以这里你可以看到实际发布的模块。如果我进入这个特定的项目,它只有一个模块,我可以查看构建的所有依赖项以及json中实际存在的所有内容。作为构建的一部分记录的环境变量。

莫兰德系我不能忽视你的模块也有漏洞的事实,你能直接进入x射线数据吗?让我们来看看。

Eyal Ben Moshe:让我们这样做吧,所以我确保这个构建包含了真正的安全漏洞,正如你在这里看到的,这个构建中有四个安全漏洞。

莫兰德系: Eyal,你有大麻烦了。

Eyal Ben Moshe:两个关键漏洞,一个高漏洞,是的,我实际上可以深入了解更多关于可视化数据的信息。我的观点是,你必须建立信息,现在你可以决定用它做什么,所以我们有一个账单记录,现在扫描变得很容易。

是的,这是真实的数据,我们都支持向左移动,这就是我们所做的,我们的开发人员在他们的IDE中运行JFrog IDE集成,以确保你知道漏洞被尽快发现。但是,正如Yoav所提到的,并不能真正保证开发人员实际运行的东西就是CI最终构建并发布给世界的东西。

Yoav乡下人关于这一点,我只想说一句,好处是你有了信息,你捕捉到了信息,这是永远不会改变的不可变的信息。在这个例子中,它被冻结在这里,周围有一些产品,但你可以把它冻结在s3桶中,如果你愿意,也可以签名。hth华体会最新官方网站你可以扫描它,因为它是一个记录你构建过程中发生的一切的系统,现在你可以扫描它,这是JFrog x射线扫描,但理论上,你可以用任何工具扫描它,因为你只需要解析包名或sha,在此基础上你可以做静态组件分析扫描,并公平地评估这个构建的安全状况。

莫兰德系:非常重要。你提到了签名,所以那建筑的真实性呢?

Yoav乡下人我想Eyal想给你看。

Eyal Ben Moshe是的,所以你是对的,你想要确保这个材料清单这个构建信息实际上是签署的,因为你想要做的基本上是你想要把它附加到你的软件上,附加到你的软件上,附加到你的代码上,这样任何人都可以看到它包含什么,你想要它签名,所以我可以向你展示我们做的一些事情。

我要用到一个叫cosign的工具,它是。

Yoav乡下人:是的,它是一个6到16个项目的一部分,是的,它是一个最初为容器签名的工具,但更一般的是任何blob。

Eyal Ben Moshe是的,它是为容器签名的,但我们会告诉你如何知道何时可以为Build Info签名,所以我在这里创建了一些东西。

这是json的建筑,这是Jason的建筑,我们要演示如何创建。我在这里创建了一个脚本,可以为它签名我将运行这个cosign命令design blog命令,你可以看到这里,你看到这里的最后一个参数它将为json签名之后,人们基本上可以验证它是否有签名,让我运行一下。

Yoav乡下人:一个警告,他们是,它是你在使用实验标志,所以不是所有的东西仍然完全在cosign,但它是为了演示,它是有效的。

Eyal Ben Moshe:是的,它对我们有用,为了演示,所以让我们运行这个,现在将要发生的是。

我的浏览器会打开,工具会要求我进行身份验证让我用谷歌账号进行身份验证。我要用我的JFrog谷歌帐户进行身份验证,现在一旦身份验证完成,我基本上可以关闭浏览器。在这里,您可以看到该工具为我创建了一个证书。对于签名,我还收到了一个ID,这是注册表正在使用的透明日志ID,或者记录正在使用的实际注册表。现在我有了这些信息,我将使用这个ID,让我打开我的脚本。我把ID写在这里。然后我将继续运行这两个命令。这些命令,如你所见,这是我们用来签名的记录币。这两个命令会创建一个签名文件和一个公共证书。让我们现在运行这三个命令。

就这样,我们就做完了。这些文件已经创建好了,现在我能做的是任何人都可以验证这个构建信息假设你收到了这个项目附带的构建信息,现在你想验证它的真实性。

您只需运行整个脚本。是的,你看到第一行说它已被验证,这个错误,我认为这是因为我们正在使用这个功能的实验版本。但它是经过验证的,因为如果我现在去,让我修改一下Build Info json。打开它,这是我们签过名的Build Info json,我加一个数字,比如1这会改变这个Build Info然后我再次运行验证,你会看到我没有得到这个验证。所以。是的。

Yoav乡下人:如果我们看看这个场景,基本上如果你正在构建一个开源项目,你可以记录构建信息。说你建立一些Java或node . js包作为开发人员,您可以验证构建信息构建包,您可以使用你的公开身份识别自己喜欢你的GitHub或谷歌身份,然后你可以用这个身份签署你的开源包和它的透明度日志不仅验证方案,您已经创建了它也是一切如何建立这个包,回到的依赖关系是什么时间,以及你所建立的环境等等。

是的,很好,很好。

莫兰德系谢谢你,Eyal,演示很棒。让我们来谈谈建筑的路线图,你是怎么看的?

Eyal Ben Moshe是的,我们之前提到过,我们的目标是支持更多的技术和更多的包管理器。

因为格式是相同的,所以基本上只是与技术集成,确保我们正确提取数据,正确构建,然后,当然,你知道,任何人都可以在标准之上创建自己的应用程序。

你知道,一旦工具开始处理记录数据的繁重工作,那么你就知道这取决于你认识的任何人。

莫兰德系作为开发人员,如果我想为这个项目做出贡献,我该怎么做呢?

当然欢迎你来投稿。Build Info go是一个开源项目。这是我们最近刚开始的一个新项目。我们不断地添加代码并改进它,所以任何想要加入我们并做出贡献的人都被邀请创建一个拉请求并与我们合作,这不仅适用于这个项目,我是说基本上所有的项目。

你知道我们所有的生态系统集成如果是ID插件重新创建CI集成JFrog CLI我们的SDK都是开放的,我们看到了很多合作,我们鼓励它,我们喜欢它,所以你肯定被邀请。

Yoav乡下人我想我们现在已经创建了一个新的回购,但对于原来的建筑,60多个不同的合作者在过去几年里对它进行了改进,所以。

Eyal Ben Moshe:是的,肯定是现在。

莫兰德系开放式问题,抱歉,请讲。

Eyal Ben Moshe既然提取的实际逻辑是分离的,就更容易做出贡献了,它实际上已经与实现的用例分离了,所以更容易,你现在就可以对提取部分做出贡献,当然,对实际使用它的部分或库做出贡献。例如,JFrog CLI现在使用Build Info go作为依赖项。所以,你知道,现在很容易看到,你知道,在大多数情况下,他们分开了,你知道,对我们来说。

你知道,继续贡献和发展它。

莫兰德系很好,我想我们准备好回答问题了,考特尼,你跟上了吗?

考特尼金是的,我和你在一起,我不想打断你们正在进行的谈话。我们问了几个问题提醒大家,请不要犹豫提问我们在这里回答问题,但我们的第一个问题是Build Info如何帮助我们解决Log4j Log4shell零日漏洞,我们都知道,这是最近的一个热门话题。

莫兰德系:当然。

Yoav乡下人是的,所以我对这个问题的出现并不感到惊讶,我的意思是,就像这些天必须问的问题一样。

首先,它不会帮助您避免Log4shell,但它会帮助您首先,因为您有信息的浓缩和非常容易解析的格式,您可以非常容易地扫描和识别构建中的位置,因为您正在扫描完整的构建,所以如果您扫描Build Info,您将能够识别您在哪里使用Log4j。您将能够通过识别依赖项来做到这一点,无论是传递的还是直接的Log4j,它都在那里。

还有一些,我们发现有一些库嵌入了Build Info,我们将在未来几天发布一个关于这个的博客,如果你知道这些库,你也可以很容易地识别它们。

而且,将Build Info的使用与来自CI的实际构建作业联系起来,然后将它们与项目联系起来,并在项目中修复它们也更容易。我现在有了这个blob,它包含一个Log4j文件,以及它是如何产生的,谁构建了它,以及类是在什么时候构建的。因此,它为您提供了更清晰的信息,而不是追踪到您在哪里使用了Log4j的坏版本。就是这样。

莫兰德系:非常重要。

考特尼金好了,下一个问题是JFrog如何用新技术支持社区?

Yoav乡下人好的,我想我会讲到这个。

Eyal Ben Moshe是的,我想我已经讲过了,所以就社区贡献而言。我们所有的生态系统项目都是开源的,这就是,你知道,我们管理它们、邀请合作以及与他人合作的方式,对我们来说非常重要。

我认为我们今天维持着大约15个开源项目,其中一些非常受欢迎。我认为JFrog CLI是最顶尖的。

我们看到这些工具每天有成千上万的下载量,然后我们得到了开发人员的合作。几年前,我们从JFrog CLI中提取了一个JFrog客户端库,这个库允许你,基本上是一个JFrog API的包装,允许在JFrog产品上轻松开发,这只是我们在ID集成上加倍努力的两个例子,我们关注的是安全性,但不仅仅是安全性。

莫兰德系:好的,是的。

Eyal Ben Moshe是的,所以我刚才说,你知道我们的IDE集成也是一个例子,我们正在加倍努力,确保开发人员拥有最好的。

Yoav乡下人好吧,我不确定你能听到我们说话。我将很快补充一下首先,这些都是伟大的项目,我们要确保的是我们支持开放格式,我们要确保我们创建的格式可以与其他格式互换。我之前提到过,我们的项目是这样的,它与任何特定的产品都是分离的。你可以使用它,我们希望促进这种采用,以提高安全级别和作为构建一部分的东西的可见性。我们有其他的CI服务器和构建技术,采用build Info并与之集成。

JFrog是openSSF的一部分,我们正在与其他合作伙伴密切合作,以促进围绕软件供应链和材料清单的标准。我们非常兴奋地看到,如今它获得了巨大的吸引力。我们以前会有一个非常强大的组成部分,但现在市场开始接受它,可能是出于错误的原因,因为风险变得太直接了,人们太容易匿名地造成伤害。但它促进了更好的代码卫生和依赖卫生,所以我们很高兴能成为其中的一部分。

莫兰德系开发人员和安全人员走到了一起,这是非常重要的,感谢你们的聚会。

考特尼金是的,我们还有一些问题要问。

现在我将继续问它,构建信息工具的可伸缩性如何,并通过捕获构建级流程来创建准确的SBOM,考虑到构建流程构建工具中可能存在变化,等等,这是一个很长的问题。

Eyal Ben Moshe如果你现在能听清楚,我就能接受。

Yoav乡下人:是的,我们能听到。

Eyal Ben Moshe哦,很好,我的问题是Build Info如何处理,不同的包管理器是不同的。

考特尼金我再重复一遍问题。构建信息工具的可伸缩性如何?通过捕获构建级流程来创建一个准确的SBOM,考虑到该流程中可能存在变化?

Eyal Ben Moshe是的,答案是这个构建信息的目标是尽可能准确,因为,正如我们之前提到的,它作为构建的一部分运行,所以基本上想象一下,生成构建信息的实际逻辑是与构建一起运行的,目标是它只是记录它,就像一个记录器,它记录所有发生的事情。

想象一下,现在您正在运行两个构建,一个接一个,在第二个构建中,有些东西是不同的,比如不同的环境变量,存储库是不同的,这实际上无关紧要。

如果第二个账单下载的依赖项版本略有不同,它将被记录。

这不同于说,嘿,让我们看看源代码,试着弄清楚它将构建什么。我们使用Build Info所做的,只是在运行时进行记录。这就是我们得到精度的方法。

Yoav乡下人:是的,这是一份准确的报告,它会告诉你在构建过程中发生的所有事情。所以它是非常值得信赖的。它捕获构建中发生的所有事情。如果你想要重建构建,我们在JFrog是反对尝试重建构建的。如果您想要证明某个包对其源的真实性,那么您可以从多个源运行构建,并查看得到的结果是否相同。

但是,从理论上讲,没有理由从头开始重新构建二进制文件。一旦你有了二进制文件一旦你储存了它一旦他们有了二进制文件的出处,你就不应该浪费时间和精力去重建它而且以后再重建它是非常困难的。但对于这个问题,它是超级可靠的,因为它体现了原始版本中发生的所有事情。

考特尼金好的,太棒了,我们的下一个问题是我们支持哪些CI服务器,支持新的see I工作流有多容易?

Eyal Ben Moshe是的,所以我可以回答这个问题,那么快速的答案是什么,我们将支持任何CI服务器,这是如下所做的。

我们为流行的CI服务器Jenkins、GitHub、Azure和所有流行的CI服务器提供了专用的集成支持。例如,对于GitHub,我们有一个JFrog CLI GitHub动作,它实际上使用JFrog CLI来创建集成,因此它为您生成构建信息。我们有一个非常流行的Jenkins Artifactory插件,它可以完成所有这些工作。我可以说我们支持任何CI服务器,因为你可以在那里嵌入JFrog CLI,它包含了旨在轻松集成CI服务器api的特性。

是的,为任何CI生成构建信息是非常容易的。

考特尼金很好,这是最后一个问题,但我想快速感谢大家今天的参与。这是一次很棒的谈话。莫兰,我可以让你继续结束了,但感谢所有与会者的加入,我们感谢你的时间,我们期待着在不久的将来再次见到你。

莫兰德系:是的,当然。谢谢Courtney,谢谢你参加JFrog联合创始人兼CTO Yoav Landman的CTO角系列的第一集。感谢我们的小组成员,JFrog生态系统负责人Eyal Ben Moshe。我是莫兰·阿什肯纳兹,JFrog首席信息官。我们期待在下集见到大家,敬请期待,谢谢。

Yoav乡下人:谢谢。

Eyal Ben Moshe这是我的荣幸,再见。

要么快速释放,要么死亡