没有互联网吗?没有问题。使用带有气隙的人工制品-第一部分

使用带有气隙的人工制品

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

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

然而,有一些组织,如金融机构军事设施有更严格的安全要求,禁止这样的设置,将他们的操作暴露在互联网上。

气隙救援

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

我们通常会看到两种情况之一:

  1. 无网络连接
  2. 单向连接

无网络连接

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

导出和导入

越来越依赖

这里有两种从远程存储库获取依赖的方法:

  1. 依赖关系声明
    精简代码,只留下依赖项声明。在拥有运行代码所需工具的DMZ虚拟机上安装简化后的代码(例如,如果正在开发npm包,则需要在DMZ机器上安装npm客户端)。相应的客户端通过Artifactory请求您需要的依赖项,Artifactory递归地下载它们,以及它们需要的任何n级依赖项。
  2. 专门的脚本
    实现一个脚本或机制,遍历您需要的所有包,并向Artifactory发送“头部请求”,以便它从远程资源下载这些包。例如,下面的bash示例维护一个散列映射,其中键表示maven central中的工件路径,值是需要缓存的工件文件版本。
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“$ {!do echo -e "缓存依赖:$d,基于版本:${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

可以扩展该散列表以支持越来越多的请求工件。

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

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

导出和导入

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

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

    jfrog rt dl generic-local-archived NewFolder/

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

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

    现在你可以把“NewFolder”放到你的内部实例中,并再次使用JFrog CLI上传它的内容:

    新建文件夹/ generic-local-archive

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

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

在文件格式中制定复杂查询的简单方法

但生活并不总是那么简单。如果我们不想将所有新文件从外部实例移动到内部实例,而只想将那些带有某种“批准印章”的文件移动到内部实例,该怎么办?这就是aql制定复杂查询的能力打开了一个选择世界的地方。使用AQL,创建查询非常容易,例如,只下载2020年10月15日之后创建的文件,并使用属性工作流进行注释。status=PASSED,从我们的通用本地存档库到我们的NewFolder库。并且由于JFrog CLI可以接受参数作为文件规范,我们在文件中创建以下AQL查询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中的远程存储库是代理远程资源的存储库。一个智能远程存储库远程资源实际上是另一个Artifactory实例中的存储库。

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

智能远程存储库

DMZ上的外部实例包括:

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

内部实例包括:

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

下面是它的工作原理:

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

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

虚拟存储库设置

把复制

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

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

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