没有互联网吗?没有问题。使用Artifactory与气隙-第一部分

使用Artifactory与气隙

几乎所有的开发组织都需要访问远程公共资源,比如Maven Central、NuGet Gallery、npmjs.org、2022世界杯阿根廷预选赛赛程码头工人中心等等,以下载构建所需的依赖项。使用Artifactory的一大好处是它的远程存储库可以代理这些远程资源和下载的缓存工件。2022世界杯阿根廷预选赛赛程通过这种方式,一旦任何开发人员或CI服务器第一次请求了工件,它就会被缓存,并直接从内部网络上Artifactory中的远程存储库中获得。这是通过Artifactory处理远程资源的常用方法。2022世界杯阿根廷预选赛赛程

访问远程资源2022世界杯阿根廷预选赛赛程

然而,有一些组织,例如世界杯2022入围名单 军事设施的安全要求更严格,在这些设施中,将其操作暴露给互联网是被禁止的。

气隙来救援

为了适应这些用例,我们建议至少有两个Artifactory实例的设置;一个在非军事区另一个在内部网络上,这个设置通常被称为气隙

我们通常会看到以下两种情况:

  1. 没有网络连接
  2. 单向连接

没有网络连接

在这个场景中,两个Artifactory实例之间没有网络连接。要从internet获取依赖项,外部实例必须下载它们,将它们导出到外部设备(如硬盘驱动器或USB闪存驱动器),然后内部实例必须导入它们,以便开发人员和CI服务器使用。

导出和导入

越来越依赖

以下是两种从远程存储库获取依赖项的方法:

  1. 依赖关系声明
    简化代码,只留下依赖项声明。在DMZ上的虚拟机上安装精简后的代码,该虚拟机上有运行该代码所需的工具(例如,如果您正在开发npm包,则需要在DMZ机器上安装npm客户端)。相应的客户端通过Artifactory请求您需要的依赖项,Artifactory递归地下载它们,以及它们也需要的任何第n级依赖项。
  2. 专门的脚本
    实现一个脚本或机制,遍历您需要的所有包,并向Artifactory发送“头部请求”,以便它从远程资源下载那些包。例如,下面的bash示例维护一个哈希映射,其中键表示maven中心中的工件路径,值是需要缓存的工件文件版本。
declare -A dependencies=(['junit/junit']="4.13.2/junit-4.13.2. "pom 4.13.2 / junit-4.13.2.jar”(' org/webjars/jquery '] = " 2.1.1 / jquery-2.1.1.jar 3.6.0 / jquery-3.6.0.jar 2.1.3 / jquery-2.1.3.jar”)的d“$ {!dependencies[@]}" do echo -e "缓存dependency: $d,基于版本:${dependencies[$d]}" for v in ${dependencies[$d]} do curl -s -o /dev/null -LI -w "%{http_code}\n" -uadmin:password https:///artifactory/tal-maven-maven-remote/$d/$v done done

这个hashmap可以扩展,以支持越来越多的请求工件。

某些技术可能需要不同的元数据、属性或API请求。例如,下面的bash脚本基于docker客户端缓存tomcat和alpine版本的集合:

declare -A dependencies=(['alpine']="3.14 3.14.1" ['tomcat']="latest jdk8-openjdk jdk11")IO -u admin -p d在“${!”dependencies[@]}" do echo -e "缓存dependency: $d,基于版本:${dependencies[$d]}" for v in ${dependencies[$d]} do docker pull .jfrog. jfrog. "d:美元io / docker-remote / v做完成
重要提示:对于Debian, Vagrant, PHP和R Artifactory将无法正常工作,除非在导出依赖时部署具体的基本属性。有关更多信息,请参阅下面的文章使用Debian的最佳实践和技巧

导出和导入

这里有两种方法可以导出新的依赖项(即自上次运行导出以来下载的依赖项),然后将它们导入到内部文件夹。

  1. UI和导入REST API
    一个简单的方法是导出必要的存储库:
    导出库
    并将其导入到内部artifactory:
    导入库
    REST API端点也被公开导入库内容自动化的目的。
  2. 使用JFrog CLI
    由于导出基本上是将文件从一个位置复制到另一个位置,JFrog CLI是完成这一任务的完美工具。我们要做的是从外部Artifactory实例中的存储库下载所有新包,然后将它们上传到内部实例。下载新文件最直接的方法是使用以下命令:

    jfrog rt dl generic-local-archived NewFolder/

    “等等,”你说。“它不下载所有的文件吗?”看起来是这样,但由于JFrog CLI支持校验和,它只下载自上次下载以来添加的新二进制文件。在底层,JFrog CLI实际上运行一个AQL查询来找到你需要的文件,所以你的响应看起来像这样:

    [信息:]发出砰Artifactory……[信息:]已ping通Artifactory。[信息:]搜索Artifactory使用AQL查询:项目。找到({“回购”:“generic-local-archived”,“或“美元:[{”和“美元:[{“路径”:{" $匹配”:“*”},“名字”:{" $匹配 ":"*"}}]}]}). 包括(“名字”,“回购”,“路径”,“actual_md5”,“actual_sha1”、“大小”)[信息:]Artifactory回应:200 OK[信息:]发现2工件。[Info:] [Thread 0]正在下载generic-local-archived/jerseywar。tgz [Info:] [Thread 1]下载generic-local-archived/plugin. gz。groovy[信息:][线程1]Artifactory response: 200 OK[信息:][线程0]Artifactory response: 200 OK[信息:]从Artifactory下载了2个工件。

    现在你可以把“NewFolder”带到你的内部实例并上传它的内容,同样,使用JFrog CLI:

    NewFolder/ general -local-archive

    而且由于JFrog CLI使用校验和部署(类似于下载的情况),内部实例中已经存在于目标中的二进制文件将不会被部署。下面的输出显示只部署了一个新文件,即apex-0.3.4.tar。

    [信息:]发出砰Artifactory……[信息:]已ping通Artifactory。[信息:][线程2]上传工件:https://localhost:8081/artifactory/generic-local-archived/plugin.groovy[信息:][线程1]上传工件:https://localhost:8081/artifactory/generic-local-archived/jerseywar.tgz[信息:][线程0]上传工件:https://localhost:8081/artifactory/generic-local-archived/apex-0.3.4.tar[信息:][线程1]Artifactory response: 201 Created[信息:][线程2]Artifactory response: 201 Created[信息:][线程0]Artifactory response:201创建(校验和部署)[信息:]上传3个工件到Artifactory。

在filespec中构造复杂查询的简单方法

但生活并不总是那么简单。如果我们不想将所有的新文件从外部实例移动到内部实例,而是只移动那些具有某种“批准印章”的文件呢?这就是aql制定复杂查询的能力打开了一个选项世界的地方。使用AQL,可以非常容易地创建一个查询,例如,只下载2020年10月15日以后创建的文件,并使用属性工作流进行注释。status=PASSED,从我们的通用本地存档库到我们的NewFolder库。由于JFrog CLI可以接受参数作为文件规范,我们在一个名为newandpassed。JSON

{"files": [{"aql":{"项。找到":{“回购”:“generic-local-archived”,“创建”:{$ gt:“2020-10-15”},“@workflow。状态”:“通过”}},“目标”:“NewFolder /”}]}

现在把它输入到JFrog CLI:

jfrog rt dl——spec NewAndPassed.json

现在我们只需要像以前一样将NewFolder的内容上传到内部实例。

单向连接

一些高安全级别的机构虽然要求将互联网和内部网络分开,但政策略宽松,允许单向连接。在这种情况下,内部Artifactory实例可以通过代理或通过安全的、单向的HTTP网络连接连接到外部实例。这种设置为内部实例提供了获取依赖关系的其他方法:

  • 使用智能远程存储库
  • 使用拉复制

智能远程存储库

Artifactory中的远程存储库是代理远程资源的存储库。一个智能远程存储库远程资源实际上是另一个Artifactory实例中的存储库。

下面是你可以使用的设置:

智能远程存储库

DMZ上的外部实例包括:

  • 本地存储库托管已下载、扫描和批准的白名单工件
  • 一个远程存储库,它代理需要从中下载依赖项的远程资源
  • 一个聚合所有其他数据的虚拟存储库

内部实例包括:

  • 本地存储库托管本地工件,如构建和其他批准的本地包
  • 远程存储库——实际上是一个智能远程存储库,它在外部实例中代理虚拟存储库
  • 一个聚合所有其他数据的虚拟存储库

下面是它的工作原理:

  • 构建工具从内部Artifactory实例上的虚拟存储库请求依赖项
  • 如果无法在内部(在任何本地存储库或远程存储库缓存中)找到依赖项,那么智能远程存储库将从它的外部资源(实际上是外部实例上的虚拟存储库)请求它
  • 外部实例的虚拟存储库试图从其聚合的本地存储库之一或远程存储库缓存提供所请求的依赖项。如果找不到依赖项,那么远程存储库将从远程资源下载它,然后将它供应回请求它的内部实例。

你需要记住一个小的设定。内部实例上的虚拟存储库必须设置Artifactory Requests Can Retrieve Remote Artifacts复选框。

虚拟存储库设置

把复制

在此方法中,您可以使用上面描述的任何一种方法将依赖项下载到外部Artifactory实例(在DMZ中)。现在,您所要做的就是在内部实例中创建一个远程存储库,并将其配置为根据cron作业从外部实例中的“干净”存储库调用pull复制,将所有这些白名单依赖项拉入内部实例。

即将发布…第2部分现已上市!在气隙环境中保护您的软件二进制文件第3部分我们将学习如何在气隙设置中发布不可变版本。

相关资源2022世界杯阿根廷预选赛赛程