ARTIFACTORY:如何使用Azure DevOps构建docker构建并将其推送到ARTIFACTORY

Swarnendu Kayal
2023-01-22 11:06

这篇知识库文章的目的是通过一个简单的用例来启动Azure DevOps构建过程。

介绍

Azure DevOps是一个CI/CD工具,通过它我们可以构建多种包类型。在这篇知识库文章中,我们将讨论docker构建。docker的构建有四个步骤

  1. 使用docker注册表获取docker镜像。在本例中,它是Artifactory。
  2. 使用我们提取的映像构建docker映像。
  3. 将映像推送到Artifactory并发布构建信息。
  4. 使用JFrog x射线扫描构建

步骤如下:

  1. 创建一个Dockerfile并将其上传到GitHub存储库。Docker示例文件如下所示
ARG BASEIMAGE

从BASEIMAGE美元

#从nginx

执行echo $BASEIMAGE命令

执行rm /etc/nginx/conf.d/*

运行echo "files are deleted"

添加helloworld.conf /etc/nginx/conf.d/

添加index.html /usr/share/nginx/html/

添加artic -error.txt /usr/share/nginx/html/
这是一个简单的docker文件,它只是将基本映像作为参数,它将作为Azure DevOps任务的一部分被提取。然后删除现有文件,然后将文件“helloworld.conf”,“index.html”和“artii -error.txt”添加到新映像下的特定目录中。这些文件还需要被推送到上传Dockerfile的同一个GitHub存储库中。

(注:上述文件可以是任何文件。我们的目的是把一些文件放到我们拉出来的nginx镜像中,并创建一个新镜像,我们将把它推送到Artifactory)

2.在Azure DevOps中创建一个组织,如下所示

用户添加图片

用户添加图片

3.组织创建后,安装Artifactory-Azure DevOps插件-您需要通过进入市场安装插件,如下面的截图所示

用户添加图片

用户添加图片

4.现在通过点击“新建项目”按钮创建一个新项目,如图所示

用户添加图片

并通过给出细节来创建项目

用户添加图片

5.现在是时候创建管道了。请查看下面的截图

用户添加图片

它会要求你选择你的Dockerfile在哪里,基本上就是源代码。选择GitHub作为您的源代码提供程序,然后选择存储库名称。完成身份验证后,它将创建一个基本模板。

6.我们需要创建Artifactory连接和docker注册表,如下所示。这些将用于通过Artifactory验证Azure DevOps,以及将在任务中使用的docker注册表。它的创建方式如下-

用户添加图片
用户添加图片

〇艺术服务连接

用户添加图片

用户添加图片

注意:请将实例的URL配置为“https:/// Artifactory”。

Docker连接——

用户添加图片

用户添加图片

7.现在是时候创建管道了。我们将定义如下所示的一些变量,我们将在将要创建的任务中使用它们
参数:
—name: prodName
displayName:要构建的产品
类型:字符串
默认值:nginx的
—name:注册表
displayName:注册表主机名
类型:字符串
默认值:test.jfrog.io”
—名称:targetRepo
displayName:要推送到的目标回购
类型:字符串
默认值:“k-docker”

变量:
prodName: ${{参数。prodName}}
注册表:${{参数。注册表}}
targetRepo: ${{参数。targetRepo}}
buildContext:“测试- $ (prodName)”
imageNameTb:“(注册中心)/美元(targetRepo) /测试- $ (prodName) '
imageNameBase:“(注册中心)/ (targetRepo) /美元$ (prodName) '

8.我们必须有四个任务

A.人工工具安装程序-按如下方式创建-
用户添加图片

一旦选择“安装自定义版本”复选框,就可以安装特定版本的JFrog CLI。默认情况下,将选择最新版本。但是,请确保在Artifactory中创建了存储库“cli”,如下所示

用户添加图片

B.然后添加拉docker基础镜像的任务。这个任务来自Artifactory-Azure DevOps插件

用户添加图片

这里我们可以定义具体的图像名称,如“Nginx”。但是,我们已经将图像的变量定义为“imageNameBase”。所以我们在这里用它。基本上,我们希望将图像拉为“arturl/k-docker/nginx”,并从上面定义的“imageNameBase”变量中将创建如上所述的图像。

定义docker构建的任务。这是与Azure DevOps捆绑在一起的默认任务。Artifactory - Azure DevOps插件没有docker构建选项。所以我们用默认的docker任务-来构建它

用户添加图片

正如您所看到的,“构建上下文”保持空白。因此,当生成相关代码时,将有一个属性为“buildContext”,该属性将是空白的。我们可以从生成的代码中删除该属性。

这个任务将从GitHub页面中选择Dockerfile,然后构建新的docker镜像

D.现在已经构建了docker映像。您将能够在Azure DevOps任务日志中看到任务中的日志,如下所示

成功建造acb00a56ee2e
成功标记test.jfrog.io/k-docker/test-nginx:20220517.2

现在,我们将使用如下所示的任务将这个新创建的映像推送到Artifactory存储库

用户添加图片
这将把映像推送到docker存储库并创建一个build-info。Json文件,其中包含所有与构建相关的信息,以及作为docker构建的一部分所需的依赖项和所有环境变量。

E.现在我们需要推送build-info。json”文件,并将其发送到Artifactory, Artifactory将其注册为Artifactory中的构建。任务如下-

用户添加图片

在此之后,我们必须使用JFrog x射线扫描构建。任务将定义如下-

用户添加图片

在触发x射线扫描步骤-之前,请确保有以下检查表
1.在运行管道之前创建一个监视和策略。否则,使用Azure DevOps任务的x射线扫描将不会成功。请按照以下链接创建监视和策略-
使用link -创建策略和规则//www.si-fil.com/confluence/display/JFROG/Creating+Xray+Policies+and+Rules

使用此链接-创建监视并添加存储库、构建、策略和规则//www.si-fil.com/confluence/display/JFROG/Configuring+Xray+Watches

2.确保在创建策略时在策略规则中启用以下选项

用户添加图片

3.需要在JFrog平台的索引资源中包含构建。2022世界杯阿根廷预选赛赛程但是,当第一次使用x射线扫描任务创建构建时,它将跳过x射线扫描步骤,因为构建未包含在Indexed Resources中。2022世界杯阿根廷预选赛赛程这就是为什么建议使用include或Exclude模式来包含构建。在这个例子中,Include模式是" */** "。这意味着平台将把推送到Artifactory的所有构建添加到索引资源中2022世界杯阿根廷预选赛赛程

用户添加图片

有关索引资源的更多详细信息,还建议您阅读这篇知识库文章2022世界杯阿根廷预选赛赛程//www.si-fil.com/knowledge-base/xray-how-to-index-and-scan-all-builds-in-xray-in-the-unified-platform/

保存上述任务后,“azure-pipeline . exe”在GitHub中,Dockerfile和其他文件被推送到同一个存储库中,构建将在后台触发。生成的代码和定义的变量如下所示
触发:
——主
池:
vmImage: ubuntu-latest
参数:
—name: prodName
displayName:要构建的产品
类型:字符串
默认值:nginx的
—name:注册表
displayName:注册表主机名
类型:字符串
默认值:test.jfrog.io”
—名称:targetRepo
displayName:要推送到的目标回购
类型:字符串
默认值:“k-docker”

变量:
prodName: ${{参数。prodName}}
注册表:${{参数。注册表}}
targetRepo: ${{参数。targetRepo}}
buildContext:“测试- $ (prodName)”
imageNameTb:“(注册中心)/美元(targetRepo) /测试- $ (prodName) '
imageNameBase:“(注册中心)/ (targetRepo) /美元$ (prodName) '

步骤:
-任务:ArtifactoryToolsInstaller@1
displayName: 'Install Build deps'
输入:
artifactoryService:“kayal-art”
cliInstallationRepo:“cli”

-任务:ArtifactoryDocker@1
displayName: 'Pull Image'
输入:
命令:“拉”
artifactoryService:“kayal-art”
sourceRepo:“k-docker”
imageName:“$ (imageNameBase) '

-任务:Docker@2
displayName: 'Build Image'
输入:
containerRegistry:“ArtDocker”
库:“(targetRepo) /美元(buildContext) '
命令:“构建”
Dockerfile:“(Build.SourcesDirectory) / Dockerfile美元”
——build-arg BASEIMAGE=$(imageNameBase)
标签:|
$ (Build.BuildNumber)

-任务:ArtifactoryDocker@1
displayName: 'Push Image'
输入:
命令:“推”
artifactoryService:“kayal-art”
targetRepo:“k-docker”
imageName:“(imageNameTb):美元(Build.BuildNumber) '
collectBuildInfo:真
buildName:“$ (Build.DefinitionName) '
buildNumber:“$ (Build.BuildNumber) '
includeEnvVars:真

-任务:ArtifactoryPublishBuildInfo@1
displayName: '发布构建信息'
输入:
artifactoryService:“kayal-art”
buildName:“$ (Build.DefinitionName) '
buildNumber:“$ (Build.BuildNumber) '

-任务:ArtifactoryXrayScan@1
displayName: ' x射线扫描'
输入:
artifactoryService:“kayal-art”
buildName:“$ (Build.DefinitionName) '
buildNumber:“$ (Build.BuildNumber) '
allowFailBuild:真
“displayNames”是手动添加的,因为它们不是由任务生成的。这将显示任务的显示名称。如果没有定义,它将显示任务的名称作为显示名称-

用户添加图片

请注意,Azure DevOps插件在后台运行JFrog CLI。所以基本上,我们在这里做的步骤,除了docker构建的步骤,我们是按照这个博客中提到的步骤来做的//www.si-fil.com/blog/manage-your-docker-builds-with-jfrog-cli-in-5-easy-steps/