Andres Almiray
经验丰富的Sourceror

自动化是DevOps世界的关键。拥有定义良好并有文档记录的服务接口有助于构建管道和加速处理。

JFrog Xray公开了一个REST API,让您可以与其服务提供的所有选项进行交互;例如,构建工具依赖这个API来发布包;它还通过插件支持IDE集成。在本节课中,我们将更多地了解这些构建工具和API本身,当需要定制管道时,它们应该会派上用场。

视频记录

大家好,欢迎回到swampp2021。今天的主题是JFrog的X-Ray API简介。我叫安德烈斯·阿尔梅里。我目前受雇于甲骨文,你们很多人可能知道我的名字,因为我喜欢谈论开源。我是Java冠军的校友,也是groovy开发团队(Apache groovy)的一员。所以我喜欢和代码打交道,我喜欢和开源打交道。这也是我决定加入甲骨文的原因之一。同样,这是我第二次参加数据库组。在这种情况下,我们有很多产品hth华体会最新官方网站

开源空间。是的,那是真的。我在这个团队的能力之一就是与那些有兴趣了解我们在开源领域所做的事情的开发人员建立桥梁。所以如果你在这方面有任何问题,好吧,请告诉我,我非常,非常乐意和你谈论这些事情。但是今天,我们将集中讨论JFrog的X-Ray API。

现在,你可能已经见过这些,JFrog现在已经出版了。虽然它被称为JFrog平台,但它有一系列相互关联的产品。hth华体会最新官方网站然后我们可以看到JFrog x射线就在所有东西的中间。

你可能熟悉的另一个产品是artifactory,它基本上是一个我们可以放置许多不同格式的二进制文件的地方。基于格式,我们可以获得不同的功能,例如如果您是Mavin、Palms和Yars,那么它们将为您的子Maven兼容存储库提供功能。但它也可以承载Docker映像、rpm、DVM包以及任何类型的二进制文件。

现在,一旦你有了这些能力,这个托管二进制文件的选项,你想要的另一件事是确保你在特定的二进制文件中没有任何漏洞。现在,如果你碰巧有其中的一些,你也希望尽快得到通知,这样你就可以做出改变,做出调整,并确保你的消费者是安全的。所以,你可能已经听说了很多关于JFrog平台和他们的产品,无论是现在还是过去。hth华体会最新官方网站所以我今天想说的是,这个平台的每一个部分,每一个产品都是低的,与任何不同的其他功能和任何其他组件都有某种互动。hth华体会最新官方网站他们通过api来做到这一点。所以今天,我想要展示一点X-Ray API,以及它为什么会在这节课上显现出来的原因。

基本上现在,x射线API是一组特性,允许您为漏洞扫描工件或任何其他额外的元数据,如什么样的许可的组件,你可以找出是否有任何具体的漏洞的码头工人的形象,一个层或可能会有一些Maven的依赖,或其他相关的一个问题您的特定环境。

您可以为api公开的许多功能设置相当多的CRUD操作,例如,您可以设置手表。因此,无论何时工件得到扫描,您都会立即得到通知,您还可以设置关于这些事情的策略,您可以获得报告,您可以创建,您可以删除那些报告,只要您想要。您可以导出和导入特定X-Ray实例的设置。因此,如果您想移动到另一个实例或任何需要的地方,您有相当大的移动空间。当然,你还可以用X-Ray API做其他事情。

x射线,它不能在独立模式下工作,它将被期望你有你的二进制托管在Artifactory中。因此,今天,我们将同时看到Artifactory API和XRay API。

现在这些页面描述了你可以用这些api做什么。第一个是x射线。第二个是Artifactory。如果你浏览这些特定的url,你会注意到Artifactory有很多关于它的信息,因为这是一个相当大的产品,从某种意义上说,它有很多行为,它有很多功能,而X-Ray比Artifactory要晚一点。

但它也不需要提供那么多,尽管它提供的行为非常重要。现在,无论我们希望以何种方式浏览api,我们都需要在某个时候使用其中之一进行身份验证。我们有很多方法不需要进行身份验证,Artifactory REST API确实提到了一些可以进行身份验证的方法。

在我们开始之前,X-Ray API,它基本上遵循了我们直接在屏幕上看到的约定,它是产品的名称,在这种情况下是X-Ray API版本1,我有一个Asterix,因为目前X-Ray正在迁移到版本2,一些。版本2提供的REST端点已经可以工作,并且不是所有的端点都已经迁移。因此,目前如果您想与这个API所公开的每个功能进行对话,就必须在版本1和版本2之间来回切换。

而在Artifactory的情况下,只有一个,产品的名称,Artifactory,然后是/API,然后你可以调用几乎任何你想做的事情。好吧,我刚才说的是身份验证。在向这些api发出rest调用时,有几种方法可以验证自己的身份。

最基本的是使用用户名和密码进行基本身份验证。现在重要的是,这是我在第一种情况下绊倒的东西,这不是你的登录密码的纯文本,你必须使用你的密码的加密版本。如果您使用普通版本,您将不会有一个好的时间,因为其余的调用将不会被验证,这将是一个失败。

现在,使用加密密码的另一种方法是创建一个API密钥。现在这对Artifactory和X-Ray都适用,你也可以创建一个访问令牌,也可以通过传递用户名来使用基本的身份验证。现在访问令牌将是一串相当长的字符。我在这里放了一个Asterix,因为当我几周前测试这个的时候,我注意到我查询的一些端点不能正常工作。

我不知道我到底在做什么,我试了几次,结果总是带着糟糕的凭证。所以我不得不切换到其他身份验证机制,然后继续工作。在这种情况下,我只是在测试这个。如果您仍然想使用访问令牌,那么另一种替代方法是将其用作记名令牌。所以在授权头承载中使用pass与值对话,然后就可以了。

现在,你可能想知道,我从哪里得到加密的密码?我如何得到这个值?此外,我从哪里获得IMA API密钥,我也可以从哪里获得查询和访问令牌?一旦您登录到Artifactory,或者在本例中,登录到JFrog平台实例,导航到您的配置文件,查看管理。一旦您登录并进行身份验证,您将在称为身份验证设置的部分中看到,如果您没有API密钥,这里将有一个按钮,指示生成API密钥。

我已经做过了,这就是为什么它在这里。你可以复制粘贴它,你可以重新生成它,或者你可以撤销它如果你点击这个小图标,你就会看到API键的值。加密密码也是如此。

在那里,你可以复制和粘贴到任何你想要的地方,或者你可以点击图标,你会看到内容。当您希望使用用户名和密码的基本身份验证进入大门时,必须使用这个值。这是您的密码加密值。那么访问令牌呢?

如果您看到左侧的侧栏,有一个名为Identity and Access的菜单。如果你点击它,有一个访问令牌的选项卡,在这种情况下,我显示了我已经拥有的不同的访问令牌。它们中的一些寿命有限,很快就会过期,而另一些则会永远存在。当你点击右上角,你会看到一个叫generate admin token的按钮,你点击它,然后你会看到这个对话框。你选择哪个产品,你想要生成令牌,这很重要,因为如果你选择Artifactory,你就会和Artifactory API对话。但如果你想使用相同的令牌并与X-Ray API对话,你会注意到API将无法工作,它会告诉你错误的凭据或其他类型的错误。

管道也是如此。因此,如果您想使用这三个不同的产品,就必须生成三个不同的访问令牌。hth华体会最新官方网站您还可以定义令牌的存续时间。您可能希望不让它过期,或者您可能希望将它设置为在许多小时内过期。好的。一旦你有了这个令牌,一旦你有了API密钥,你就可以安全地开始与API对话。

我们可以做的一件事是检查您想要通信的服务器是否实际启动并运行。这里我们可以调用两个端点,我们可以调用system ping它们会返回一个简单的JSON响应,说ponk。这很简单,请注意,我们不需要任何类型的身份验证。这是一种非常简单的判断服务器是否启动的方法,我还可以查询它的版本,这里也不需要身份验证。

这是另一种方式,服务器启动了版本号可能是你期望的版本号。好吧,如果这些符合你的期望,那么我们当然可以继续。在Artifactory的情况下,也有一个粉红色端点。

在这种情况下,如果一切正常,它会返回okay如果有一个失败,它可能会在失败或失败时返回。如果你想查询版本号,注意,在这种情况下,我们需要身份验证,我们需要用户名或密码或API密钥或令牌。原因是,它不仅显示您正在运行的服务器的版本号,而且还显示已添加到服务器的某些功能。注意到这个服务器运行的最后一个功能是XRay。我的Artifactory实例和X-Ray绑定在一起。这很好。

还有,我公布的最后一件事是修订过的许可证,你会在这里看到一个实际的数字,它在某种程度上与你的许可证有关。所以如果可以的话,不要分享,不要这样做。现在,Artifactory的基础是我们的存储库。在我的特定实例中,我有三种类型的存储库。只是玩玩这些东西。我有一个Maven兼容的存储库,我有一个Docker存储库,因为我刚刚开始使用Docker映像。但是为了这个演讲的性质,我也创造了只是一个通用的存储库。这种类型的存储库可以处理任何类型的文件,任何类型的二进制文件。如果他们恰好符合另一个人的期望……例如,也许你在户外,你加载了一个Mavin jar或Docker映像或RPM或其他东西,然后当你浏览附近的存储库时使用它,当你点击文件时,额外的功能将可用。

否则,这就像一个桶当你可以放入C文件和tar文件或其他文件时,这是供你上传二进制位的东西。现在,我们看到UI上的显示。但是我们可以从API中得到同样的信息当我们发出这个特定的查询时。所以Artifactory API存储库。而且,这需要经过验证,我们得到一个JSON值列表,这和我们在UI中得到的信息是一样的。我们可以在UI中总结一下它是由Artifactory API支持的,但它也将由X-Ray API和其他API支持,这些API由JFrog平台的其他产品公开。hth华体会最新官方网站

假设我们有这个二进制存储库,我们现在需要做的是上传一个二进制文件。一旦我们这样做了,我们就要扫描它。因为我创建了一个通用存储库,我要做的是上传一个zip文件,其中包含任何类型的文件,在这里,它将包含一个jar文件,因为它是一个Java应用程序。但你不需要上传Java,你可以上传任何你想上传的东西。

如果我们想这样使用API,这就是我们必须要做的。我们必须发出一个输出调用,然后传入二进制文件的完整URL。重要的一点是,抱歉,在二进制之后,这是存储库的名称,你可以定义文件的路径。在本例中,我说它将是app/100, 100是我的应用程序的版本,然后是文件,或者你也可以不放app100只放在文件中,或者随便做什么,决定你想要的路径。然后传递文件。

现在您可以看到,它还为检查传递了额外的值。当我测试这个,你只是传递URL和文件Artifactory将自动计算校验和为您。当你浏览到UI时,会有一个按钮告诉你,校验和是自动计算的,但你必须点击它来接受这些。

但如果你自己计算校验和,并确保这些是实际的校验和,你有Sha1和Sha256,最后一个是MD文件,那么Artifactory要做的仍然是自己计算这些校验和,并进行比较。当这些匹配时,它会简单地说,好,我相信你,你上传的东西和我自己计算的一样,我们很好,我们很好。

如果你浏览UI,点击右上方的按钮,上面写着设置我,然后它会给你上传和下载的选项,这就解决了。这里,我们看到的端点和上一张幻灯片上的几乎一样。这一个不上传计算校验和,它只是URL和文件。但也要注意Artifactory有一个额外的身份验证方法,你可以使用,你可以传入一个头,一个非常具体的头,称为x JFrog art API,以及API密钥。

如果您这样做,那么您将继续工作,就像使用我们之前看到的任何其他机制进行了完全身份验证一样。现在,一旦我们上传了文件,如果我们导航到工件,您可以在C文件中找到它,我们有一些关于它的元数据,在那里,您可以单击不同的选项卡,如果我们向下滚动,您将看到校验和。一切都证实了。看起来我们的二进制文件就在正确的位置,你可以双击它,验证并下载。这完全没问题。所以我想现在该做个扫描了。

对于扫描,你必须非常非常确定你的存储库已经为扫描配置好了,它不会在默认情况下发生。这是我第一次被绊倒的地方,当我创建二进制存储库时,我错过了一些东西。如果我们导航到管理中的存储库部分,点击我的通用存储库,你会注意到底部有一个复选框,在XRay中启用索引。

我首先禁用了这个,我没有注意到它。当我尝试API时,我得到了很多失败,组件没有找到,我们发送的数据不正确。我一直在怀疑自己,直到我回头去弄清楚为什么我的存储库没有连接到XRay。

这是我想的最后一件事,因为我忘记点击那个特定的复选框。所以不要这么做。但是即使您这样做了,一旦您创建了存储库,您可以返回到管理并单击特定的复选框并保存。

启用此复选框后,我做的下一件事是查看x射线设置,然后您可以看到索引状态。在我检查了复选框之后,我的存储库的索引状态是0%,我有两个二进制文件,或者30C和一个C文件,所以它们没有被X-Ray索引。

如果您将鼠标悬停在特定的行上,您将看到两个在此截图中没有出现的额外按钮,一个是计算索引或为数据存储库初始化索引。另一个是用于刷新索引。这是我第一次计算存储库索引时的情况。

现在我在Docker存储库中也有一个Docker映像,这就是为什么它说一个工件中的一个,它是100%的。我的Maven存储库中目前没有任何JAR文件。这就是为什么它高达0%。完成此操作后,当我导航回二进制存储库时,您会看到现在有了一个以前不存在的额外选项卡。这可以告诉我,我有我的二进制文件,与x射线连接的存储库。不过,这个特殊的工件没有任何漏洞。这很好,因为这是一个非常简单的Hello World应用程序,没有依赖关系。所以这个组件不应该失败。我说应该,是因为这就是我们现在做的事情的意义所在。

它在试图确定我们是否安全,它检测到一个许可证。接下来我们要做的是使用API查询这些组件。现在,我们看到了使用UI。但是为了在API上实现它,我们必须知道组件标识符是什么。根据二进制的类型,你必须使用不同的格式。所以如果它是一个Maven包,或者像一个jar文件,那么我们使用gap://[group ID] [artifact ID]版本,但是因为我们没有加载二进制文件,一个zip文件,那么我们必须使用generic://,然后传入SHA 256,校验和,然后是文件名,它不需要路径。你可能记得,我上传了C文件app100,然后是app100. C文件但在这种情况下,我只需要复制并找到特定文件的sha,所以我可以继续在UI上,或者我刚才计算的那个。还有path app-100.c文件这是我唯一需要做的。这就是我要做的。

你可以在命令行中做,传递curl用户名和密码,因为这是一个经过身份验证的操作,我们会将JSON内容发送给那个特定的操作并传递组件ID。然后是分量。

请注意,为了简洁起见,我修改了校验和,但这应该是全部内容。然后发布出来。它会告诉我是否成功,新的扫描正在进行,就像这里显示的那样。如果我搞砸了,组件ID的通用URL由于某种原因没有找到,那么我将得到某种错误,然后我们必须找出如何纠正这个问题。一旦你完成扫描,我们就可以查询它。你可以在UI上看到它。但如果我们想访问API,我们可以这样做。

您可以传入一个校验和列表。我们的好朋友,校验和又来了。所以你可以通过传递多个校验和来查询多个组件或者你也可以传递过去,我决定再次使用校验和的方式,使用post,我们';;现在使用另一个叫做summary artifact的操作,就像我们看到的,我们得到了一堆JSON, UI会很好地呈现出来。但是当我们开始有更多由其他组件公开的元数据时,仅仅在终端中浏览并不是那么好。

我们可以知道x射线的响应有两个分量。有一个zip组件没有许可证,它里面没有许可证文件。还有一个Maven组件,它是一个包含zip文件的jar。这个罐子确实有适当的许可证,也有补丁,所以这很好。

当我们在UI中导航时,如果我展开zip文件,我们当然可以看到里面有一个jar文件。如果我打开jar文件,我会找到一个许可证,但我也可以告诉x射线已经找到了许可证。没有安全问题,没有违规,没有类似的问题,因为jar文件非常非常简单。如果我们厌倦了在终端或UI中查看信息,如果您想以其他方式试验API,那么我们可以这样做还可以使用邮差等其他工具。

邮差的优点是你可以保存你的授权头和重用当你在使用API时。因此,在本例中,我为查找特定工件的摘要(app100 zip文件)发出了相同的端点,现在我们得到了格式化良好的JSON结果,更容易浏览和查找,因此我获得了一个许可,或未获得许可,zip文件什么都没有。我获得的Apache许可证是用于jar文件的。

好了,现在我要讲的是我为什么要研究x射线和Artifactory。再说一次,作为一个Java开发人员,我喜欢与不同的构建工具集成,Maven和Gradle是最受欢迎的。实际上,我想做的是,我创建了一个工具,允许你在GitHub和GitLab和Git上创建版本。作为这些版本的一部分,你可以上传二进制文件到任何你想要的地方,其中一个地方就是Artifactory。所以一旦我上传到Artifactory,那么这将是一个伟大的事情,也扫描任何漏洞。

现在,与X-Ray API和Artifactory API交互使用纯Java会非常非常冗长。值得庆幸的是,对于Java开发人员来说,我们可以使用几个选项来减少处理低级HTTP代码的冗长。其中一个选择叫做改造。

现在,改进的思想是定义一个Java接口,其中包含方法定义和某种到rest api和rest操作的映射。而改装会自动生成一个与特定接口匹配的代理,并完成所有HTTP底层的工作。作为开发人员,你唯一需要处理的是标准Java类型,你自己的域类型。在本例中,您可以看到有一个名为rapper的对象,这只是一个域对象,一个简单的pojo,具有getter和setter,其中包含与特定案例或存储库相关的数据。

在该列表下,是一个普通的Java util。收藏列表。所以改造可能也是,我很喜欢用的库,但在某种程度上,库的制造者决定使用,他们从Java切换到kotlin。我对这种特殊的依赖性有一些问题。我不想让它成为我项目的依赖项。所以我必须寻找替代方案如果碰巧有替代方案的话,我很高兴地说,确实有替代方案。

有一个项目叫做公开名声,这个项目几乎和改造同时启动。

在某种程度上,团队决定,好吧,我们不要继续研究这个了,因为它看起来改装的性能更好,它能给我们想要的,但当改装的制造商决定把产品带入一个不同的方向后,开放式框架又回来了。开放框架的工作原理基本相同,你定义一个接口,从对象,从Java类型映射到其他api。

映射可能更详细一些。默认值也不允许您访问低级HTTP信息。如果你想知道一个特定调用的头信息,这样你就可以进行分页,这里有更多的代码,你需要做的更详细一些为了让它在frame中发生,在改装中它是一个更直接的操作。

但重要的是,你仍然可以让它发生。最后,它只是普通的Java。我之前告诉你们的那个工具是我为了制作这些东西来发布并上传到Artifactory而创建的叫做JReleaser。这是一个受GoReleaser启发的工具,它允许你发布和创建Go项目的二进制文件。JReleaser为Java做了这件事。现在,在JReleaser的情况下,当我想上传一个二进制文件到artifactory时,我既不能使用Fein也不能使用retrofit。

这样做的原因是,目前我们上传二进制文件到artifactory的方式是通过一个简单的put,但我们必须提供一个名为100 continue的头文件,然后只是等待来自服务器的信号,这样上传就会继续,现在绝对不可能用Fein做那种映射,所以我们必须直接访问API。这正是我必须要做的。所以即使我已经说过了,是的,费恩和改造将减少大量的啰嗦,有些时候你只需要直接使用HTTP。这就是这里发生的事情。

我们在上传时添加了一堆头文件。在这种情况下,您注意到我正在计算特定文件的校验和,这实际上是上传到C文件和tar GC文件的代码,我们之前看到过。最后一点在这里,这是一个标准的低级HTTP客户端样式。这实际上只是简单的HTTP URL连接,甚至是JDK 11 HTTP部署。

我们只是设置头信息,然后传入二进制数据,然后写入输出流。我们只需要等待100和continue header,当它完成时,我们可以解码响应。如果一切正常,那我们就没事了。如果状态码大于或等于400,那么事情就不像我们预期的那样。差不多就是这样。

一旦我们这样做了,二进制文件就在那里,您可以通过X-Ray对索引发出另一个rest调用,并找到二进制文件可能存在的任何漏洞或任何其他问题。提醒一下,这些都是API的资源。2022世界杯阿根廷预选赛赛程如果你想了解更多关于X-Ray和Artifactory以及如何与他们交谈,这些都是典型的参考资料。如果您对为任何类型的Java项目创建版本感兴趣,那么只需看看JReleaser是什么。

因此,我非常感谢你们。

非常感谢你的时间。

如果你有任何问题,你知道在网上哪里可以找到我。

非常感谢大家,继续享受swamamp。

要么快速释放,要么死亡