JFrog的x射线API概览
自动化是DevOps世界的关键。拥有定义良好且文档化的服务接口有助于构建管道并加快处理速度。
JFrog Xray公开了一个REST API,可以让你与它的服务提供的所有选项进行交互;例如,构建工具依赖于此API来发布包;它还通过插件支持IDE集成。在本节中,我们将更多地了解这些构建工具和API本身,当需要自定义管道时,它们应该会派上用场。
视频记录
大家好,欢迎回到SwampUP 2021。今天的主题是JFrog的x射线API概览。我叫安德烈斯·阿尔迈雷。我现在在Oracle工作,你们很多人可能知道我的名字,因为我喜欢谈论开源。我是Java冠军校友,也是groovy开发团队Apache groovy的一员。所以我喜欢和代码打交道,我喜欢和开源打交道。这也是我决定加入甲骨文的原因之一。同样,这是我第二次参加数据库组。在这种情况下,我们有很多产品hth华体会最新官方网站
开源空间。是的,那是真的。我在这个特别的小组的能力之一就是与那些有兴趣了解我们在开源领域所做的事情的开发人员建立联系。所以如果你在这方面有任何问题,请告诉我,我非常非常乐意和你谈论这些事情。但是今天,我们将集中讨论JFrog的x射线API。
现在,你可能已经见过这些,JFrog现在已经发布了。虽然它被称为JFrog平台,但有一系列相互关联的产品。hth华体会最新官方网站然后我们可以看到JFrog x射线就在所有东西的中间。
您可能熟悉的另一个产品是artifactory,它基本上是一个我们可以放置许多不同格式的二进制文件的地方。基于格式,我们获得了不同的功能,例如,如果您是Maven、palm和Yars,它们将在您的子Maven兼容存储库中运行。但它也可以托管Docker映像、rpm、DVM包和任何类型的二进制文件。
现在,一旦你有了这些功能,这个托管二进制文件的选项,你想要拥有的另一件事是确保你在特定的二进制文件中没有任何漏洞。现在,如果你碰巧有这些问题,你也希望尽快得到通知,这样你就可以做出改变,做出调整,并确保你的消费者是安全的。好吧,你可能已经听说过很多关于JFrog平台和他们的产品,不管是过去还是现在。hth华体会最新官方网站所以我今天想说的是这个平台的每一个部分,每一个产品都是低的,与任何不同的其他功能和任何其他组件进行某种互动。hth华体会最新官方网站它们是通过api来实现的。所以今天,我想展示一点X-Ray API,为什么它会在我们这节课中变得很明显。
基本上现在,x射线API是一组特性,允许您为漏洞扫描工件或任何其他额外的元数据,如什么样的许可的组件,你可以找出是否有任何具体的漏洞的码头工人的形象,一个层或可能会有一些Maven的依赖,或其他相关的一个问题您的特定环境。
您可以为api公开的许多功能设置相当多的CRUD操作,例如,您可以设置监视。所以当一个工件被扫描时,你会立即得到通知,你也可以设置关于这些事情的策略,你可以得到报告,你可以创建,你可以删除这些报告。您可以导出和导入特定X-Ray实例的设置。所以如果你想移动到另一个实例或者其他需要的东西,你有很多空间可以移动。当然,你还可以用X-Ray API做其他事情。
XRay同样不能在独立模式下工作,您需要将二进制文件托管在Artifactory中。因此,今天,我们将会看到Artifactory API和XRay API,面对面。
现在这些页面描述了你可以用这些api做什么。第一张是x光片。第二个是Artifactory。如果你浏览这些特定的url,你会注意到Artifactory有很多关于它的信息,因为它是。这是一个相当大的产品,因为它有很多行为,它有很多功能,而x射线比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调用时,有几种方法可以对自己进行身份验证。
最基本的一种是使用用户名和密码的基本身份验证。重要的是,这是我在第一个案例中遇到的问题这不是明文形式的登录密码,你必须使用加密版本的密码。如果使用普通版本,则不会有很好的效果,因为rest调用不会经过身份验证,这将是一个失败。
现在,使用加密密码的另一种方法是创建API密钥。现在这对Artifactory和X-Ray都有效,您还可以使用,您可以创建访问令牌,也可以通过传递用户名来使用基本身份验证。现在访问令牌将是一长串字符。我在这里放了一个Asterix,因为当我几周前测试这个的时候,我注意到我正在查询的一些端点不能正常工作。
我不知道我到底在做什么,我试了几次,但总是带着糟糕的凭证回来。所以我不得不切换到其他身份验证机制,然后重新开始工作。在这种情况下,我只是在测试这个。如果您仍然希望使用访问令牌,那么另一种选择是将其用作承载令牌。所以在授权报头承载器中使用pass与值对话,然后继续。
现在,你可能想知道,我从哪里得到加密的密码?我怎么得到这个值?另外,从哪里可以获得IMA API密钥,从哪里可以获得查询和访问令牌?一旦您登录到您的Artifactory,或者在本例中,您的JFrog平台实例,导航到您的配置文件,查看管理。一旦你登录并认证,你会看到在认证设置部分,如果你没有API密钥,这里会有一个按钮说生成API密钥。
我已经做过了,所以它在这里。你可以复制粘贴它,你可以重新生成它或者你可以撤销它如果你点击这个小图标,你会看到API密钥的值。加密密码也是如此。
在那里你可以复制粘贴到任何你想要的地方,或者你可以点击图标,你就会看到内容。当您希望使用带有用户名和密码的基本身份验证进入大门时,必须使用该值。这是密码的加密值。那么访问令牌呢?
如果你看到左边的侧边栏,有一个名为身份和访问的菜单。如果单击它,就会有一个访问令牌选项卡,在本例中,我将显示我已经拥有的不同访问令牌。有些人的生命是有限的,很快就会过期,而有些人则会永远活着。当你点击右上方时,你会看到一个叫做generate admin token的按钮,你点击它,然后你会看到这个对话框。你选择哪个产品,你想要生成令牌是非常重要的,因为如果你选择Artifactory,那么你将与Artifactory API对话。但是,如果您想使用相同的令牌并与X-Ray API通信,您将注意到API将无法工作,它将告诉您错误的凭据或其他类型的错误。
管道也是如此。因此,如果您想使用这三种不同的产品,就必须生成三种不同的访问令牌。hth华体会最新官方网站您还可以定义令牌的使用时间。您可能不希望过期,或者您可能希望将其设置为在多个小时内过期。好吧。一旦你有了这个令牌,一旦你有了API密钥,你就可以安全地开始与API通信。
我们可以做的一件事是检查你想要通信的服务器是否已经启动并运行。这里我们可以调用两个端点,我们可以调用system ping它们会返回一个简单的JSON响应,说ponk。这很简单,注意我们不需要任何身份验证。这是一个非常非常简单的方式来判断服务器是否启动,我也可以查询它的版本,这里也不需要验证。
这是另一种方式告诉你,服务器已启动版本号可能是你期望的版本号。好吧,如果这些符合你的期望,那么我们当然可以继续。在Artifactory的情况下,还有一个粉色端点。
现在在这种情况下,如果一切正常,它只是简单地返回okay,如果有一个失败,它可能会返回失败或失败或其他东西。如果你想查询版本号,注意在这个例子中,我们需要身份验证,我们需要用户名或密码或API密钥或令牌。原因是,它不仅显示您正在运行的服务器的版本号,而且还显示已添加到服务器的某些功能。你可以注意到这个服务器运行的最后一个功能是x射线。所以我把我的Artifactory实例和x射线捆绑在一起。这很好。
还有,我在许可证上编辑的最后一件事,你会在这里看到一个实际的数字,它以某种方式与你的许可证联系在一起。所以如果可以的话,不要分享,不要这样做。现在,Artifactory的基础是我们的存储库。在我的特定实例中,我有三种类型的存储库。只是在玩这些东西。我有一个兼容Maven的存储库,我有一个Docker存储库,因为我刚刚开始使用Docker映像。但为了这次演讲的性质,我还创造了只是一个通用的存储库。这些类型的存储库可以处理任何类型的文件,任何类型的二进制文件。如果他们恰好符合另一方的期望……其他的仓库,例如,也许你在户外,你已经加载了一个Mavin jar或Docker镜像或RPM或其他东西,然后在你浏览附近的仓库时使用它,当你点击文件时,额外的功能将可用。
否则,这就像一个桶,当你可以放入C文件和tar文件或任何东西时,这是你上传二进制位的东西。现在,我们看到UI上的显示。但是我们可以从API中得到相同的信息当我们发出这个特定的查询时。所以人工API存储库。这还需要经过身份验证,我们会得到一个JSON值列表,这与我们在UI中得到的信息基本相同。总结一下你在UI中看到的是由Artifactory API备份的,但它也将由X-Ray API以及JFrog平台的其余产品公开的其他API进行备份。hth华体会最新官方网站
假设我们有这个二进制存储库,我们现在需要做的是上传一个二进制文件。完成之后,我们要扫描它。因为我创建了一个通用存储库,我要做的是上传一个zip文件,它包含任何类型的文件,在这个特殊的例子中,它将包含一个jar文件,因为它恰好是一个Java应用程序。但是你不需要上传Java,你可以上传任何你想要的东西。
如果我们想这样使用API,这就是我们要做的。我们必须发出一个输出调用,然后传入二进制文件的完整URL。重要的是,不好意思,在二进制文件之后,这是你的存储库的名字,你可以定义文件的路径。这里我说的是app/100, 100是我的应用版本,然后是文件,或者你也可以不放app100直接放文件,或者你可以选择你想要的路径。然后传递文件。
现在您看到,它还传递了用于检查的附加值。当我进行测试时,您是否只需传递URL, Artifactory文件就会自动为您计算校验和。当你浏览到UI时,会有一个按钮说校验和是自动计算的,但你必须点击它才能接受这些。
但如果你自己计算校验和,你要确保那些是实际的,所以你有Sha1和Sha256最后一个是MD文件,那么Artifactory要做的仍然是自己计算这些校验和,并进行比较。当这些匹配时,它会简单地说,好的,我相信你,你刚刚上传了和我自己计算的相同的东西,我们很好,很好。
如果你浏览UI,点击右上角的按钮,上面写着设置,然后它会给你上传和下载的选项,这就解决了。在这里,我们看到了和上一张幻灯片几乎相同的终点。这个不上传计算的校验和,它只是URL和文件。但也要注意Artifactory有一个额外的身份验证方法,您可以使用,您可以传入一个头,一个非常具体的头,称为x JFrog艺术API,和API密钥。
如果您这样做,那么您将继续工作,就好像您已经使用我们之前看到的任何其他机制进行了完全身份验证一样。现在,一旦我们上传了文件,如果我们导航到工件,你可以在C文件中找到,我们有一些关于它的元数据,就在那里,你可以点击不同的标签,如果我们向下滚动,你会看到校验和。一切都核对无误。看起来我们的二进制文件就在正确的位置,你可以双击它,验证并下载它。这很好。我想现在是时候做个扫描了。
好的,对于扫描,你必须非常非常确定你的存储库已经为扫描配置好了,它不会默认发生。这是我第一次遇到的问题,当我创建二进制存储库时,我漏掉了一些东西。如果我们导航到管理中的存储库部分,单击我的通用存储库,您会注意到底部有一个复选框,在XRay中启用索引。
我先把这个弄坏了,我没注意到。当我尝试这个API的时候,我遇到了很多失败,组件找不到,我们发送的数据不正确。我一直在怀疑自己,直到我回过头去想为什么我的仓库没有连接到x射线。
这是我想到的最后一件事,因为我忘了点击那个特定的复选框。所以不要这么做。但是,即使这样做,一旦创建了存储库,您也可以回到管理并单击特定的复选框并保存。
启用这个复选框后,我做的下一件事是查看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文件,那么我们必须使用通用://然后传入SHA 256,校验和然后文件名,它不需要路径。你们可能还记得我上传的C文件是app100,然后是app100. C但在这里,我只需要复制并找到那个特定文件的sha,这样我就可以继续UI,或者我刚刚计算的那个。还有路径app-100.c文件这是我唯一需要做的。这就是我要做的。
你可以在命令行中做,传入curl用户名,密码,因为这必须是一个经过身份验证的操作,我们将向特定操作发送JSON内容并传递组件ID。然后是分量。
请注意,为了简洁起见,我编辑了校验和,但这应该是全部内容。然后把它贴出来。它会告诉我是否成功,新的扫描正在进行中,就像这里显示的那样。如果我搞砸了组件ID的通用URL由于某种原因没有找到,那么我会得到某种错误,然后我们必须弄清楚如何纠正这个问题。一旦你做了扫描,我们就可以查询了。你可以在UI上看到它。但如果我们想要访问API,我们可以这样做。
您可以传入一个校验和列表。我们的好朋友又来了,校验和。所以你可以通过传递多个校验和来查询多个组件或者你也可以通过过去,我决定再次使用校验和的方式,使用post, we ';;现在使用另一个叫做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光和人工制品。再说一次,作为一个Java开发者,我喜欢集成不同的构建工具,Maven和Gradle是最流行的。我想做的是,实际上,我创建了一个工具,可以让你在GitHub, GitLab和Git上创建发布。作为这些版本的一部分,你可以将二进制文件上传到任何你想要的地方,其中一个地方恰好是Artifactory。因此,一旦我上传到Artifactory,那么这将是一个伟大的事情,也扫描任何漏洞。
现在,与X-Ray API交互,现在使用纯Java的人工API可能非常非常冗长。对于Java开发人员来说,值得庆幸的是,我们可以使用几个选项来减少处理低级HTTP代码的冗长性。其中一个选择叫做改造。
现在,改造的思想是定义一个Java接口,其中包含方法定义和到rest api和rest操作的某种映射。改装会自动生成一个匹配那个特定接口的代理并做所有HTTP底层的事情。作为开发者,你唯一要处理的就是标准的Java类型,你自己的域类型。在本例中,您看到有一个名为rapper的对象,这只是一个域对象,一个带有getter和setter的简单pojo,它包含与特定案例或存储库相关的数据。
在这个列表下面,只是一个普通的Java util。收藏列表。所以改造可能也是,我很喜欢用的库,但在某种程度上,库的制造者决定,他们从Java切换到kotlin。我对这种特殊的依赖有一些问题。我不希望它依赖于我的项目。所以我必须寻找另一种选择如果有的话,我很高兴地说有。
有一个项目叫做“开放名声”,这个项目几乎是在改造的同时开始的。
在某种程度上,团队决定,好吧,我们不要继续做这个了,因为看起来改造效果更好,它能满足我们的要求,但是在改造的制造者决定把产品带向不同的方向之后,开放式框架又回来了。开放框架以同样的方式工作,你定义一个接口,从对象,从Java类型映射到其他api。
映射可能有点冗长。默认值也不允许访问低级HTTP信息。如果你想知道一个特定调用的header,这样你就可以做分页,有更多的代码,有更多的复杂的东西你需要做为了让它在frame中发生,在retrofit中它是一个更直接的操作。
但问题是,你仍然可以让它发生。最后,它只是普通的Java。我告诉你们我创建的工具是为了制作这些东西来创建发布并上传到Artifactory,这个工具叫做JReleaser。这个工具的灵感来自于另一个叫做GoReleaser的工具,它允许你发布和创建Go项目的二进制文件。JReleaser为Java做了这个。现在,在jrelease的情况下,当我想要将二进制文件上传到artifactory时,我不能使用Fein或retrofit。
这样做的原因是,目前我们上传二进制文件到artifactory的方式是通过一个简单的put操作,但我们必须提供一个名为100 continue的标头,然后等待来自服务器的信号,这样上传就会继续进行,现在,用Fein做这种映射是绝对不可能的,所以我们只能直接访问API。这正是我必须要做的。因此,尽管我已经说过,是的,Fein和改进将减少很多冗长的内容,但有时您必须直接使用HTTP。这就是这里发生的事情。
我们在上传时添加了一些标题。在本例中,您注意到我正在计算一个特定文件的校验和,这实际上是我们之前看到的上传到C文件和tar GC文件的代码。最后一点是,这是一个标准的低级HTTP客户端样式。这实际上只是普通的HTTP URL连接,甚至是JDK 11的HTTP部署。
我们只是设置标头,然后传入二进制数据并写入输出流。我们只需要等待100和continue header,当它完成时,我们可以解码响应。如果一切正常,我们就没事了。如果状态码大于或等于400,那么有些事情没有按照我们的预期进行。差不多就是这样了。
一旦我们这样做了,二进制文件就在那里了,您可以通过x射线对索引发出另一个rest调用,并找到二进制文件可能存在的任何漏洞或任何其他问题。让我再次提醒你们,是API的资源。2022世界杯阿根廷预选赛赛程如果你想了解更多关于X-Ray和Artifactory以及如何与他们交谈,这些都是规范的参考。如果您对为任何类型的Java项目创建发行版感兴趣,那么只需看看JReleaser是什么。
在此,我非常感谢你们。
非常感谢您的宝贵时间。
如果你有任何问题,你可以在网上找到我。
非常感谢大家,继续享受SwampUP吧。