没有互联网吗?没有问题。使用带气隙的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 "caching dependency: $d, based on versions: ${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 "caching dependency: $d,基于版本:${dependencies[$d]}" for v in ${dependencies[$d]} do docker pull .jfrog。Io /docker-remote/$d:$v done done
重要提示:对于Debian, Vagrant, PHP和R Artifactory将无法正常工作,除非在导出依赖时部署具体的基本属性。有关更多信息,请参阅下面的文章使用Debian的最佳实践和技巧

进出口

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

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

    jfrog rt dl generic-local-archived NewFolder/

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

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

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

    jfrog rt u NewFolder/ generic-local-archive

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

    [信息:]ping 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响应:201 Created[信息:][线程2]Artifactory响应:201 Created[信息:][线程0]Artifactory响应:201 Created[信息:][线程0]Artifactory响应:201创建(校验和部署)[信息:]上传3个工件到Artifactory。

在filespec中表达复杂查询的简单方法

但生活并不总是那么简单。如果我们不想将所有新文件从外部实例移动到内部实例,而是只移动那些具有某种“批准印章”的文件,该怎么办?这就是AQLs制定复杂查询的能力打开了一个选项的世界。使用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 newandpass .json

现在我们只需要将NewFolder的内容上传到内部实例,就像之前做的那样。

单向连接

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

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

智能远程存储库

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

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

智能远程存储库

DMZ上的外部实例包括:

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

内部实例包括:

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

下面是它的工作原理:

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

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

虚拟存储库设置

把复制

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

即将到来…第2部分现在可以买到!在气隙环境中保护您的软件二进制文件第3部分我们将学习如何在气隙设置中交付不可变版本。

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